Juego de Serpiente con Python y Pygame

PythonBeginner
Practicar Ahora

Introducción

Este proyecto te guiará a través del proceso de creación de un juego de serpiente utilizando Python y la biblioteca Pygame. El juego tendrá una ventana de juego, una serpiente, un poder-up y una puntuación. La serpiente se moverá por la ventana de juego y comerá el poder-up. Cuando la serpiente coma el poder-up, la longitud de la serpiente aumentará en uno. La puntuación se mostrará en la pantalla.

👀 Vista previa

Captura de pantalla de vista previa del juego de serpiente

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo crear una ventana de juego utilizando Pygame
  • Cómo manejar la entrada del usuario para controlar el movimiento de la serpiente
  • Cómo crear y actualizar la posición de la serpiente
  • Cómo dibujar la serpiente y el poder-up en la pantalla
  • Cómo detectar colisiones entre la serpiente y el poder-up
  • Cómo llevar un registro de la puntuación
  • Cómo mostrar la puntuación en la pantalla

🏆 Logros

Después de completar este proyecto, serás capaz de:

  • Utilizar Pygame para crear una ventana gráfica de juego
  • Manejar la entrada del usuario para controlar el juego
  • Crear y actualizar objetos del juego
  • Detectar colisiones en un juego
  • Mostrar y actualizar la puntuación del juego

Crear los archivos del proyecto

Crea un nuevo archivo llamado snake_game.py y dile que se abra en un editor de código.

cd ~/proyecto
touch snake_game.py
sudo pip install pygame

Importar los módulos necesarios

En el archivo snake_game.py, importa los módulos pygame y random:

import pygame
import random

Inicializar Pygame

Después de importar los módulos, inicializa Pygame:

pygame.init()

Configurar la ventana del juego

Define el ancho, alto y fotogramas por segundo (FPS) de la ventana del juego:

ANCHO = 800
ALTO = 600
FPS = 10

Definir colores

Define los colores que se utilizarán en el juego:

NEGRO = (0, 0, 0)
BLANCO = (255, 255, 255)
VERDE = (0, 255, 0)
ROJO = (255, 0, 0)
AZUL = (0, 0, 255)
AMARILLO = (255, 255, 0)
COLOR_DE_FONDO = (50, 50, 50)

Configurar la ventana del juego

Configura la ventana del juego con el ancho y alto definidos:

pantalla = pygame.display.set_mode((ANCHO, ALTO))
pygame.display.set_caption("Juego de la Serpiente")
reloj = pygame.time.Clock()

En el código anterior, pygame.display.set_mode() se utiliza para inicializar la pantalla con el ancho y alto especificados. pygame.display.set_caption() se utiliza para establecer el título de la ventana del juego. pygame.time.Clock() se utiliza para controlar el tiempo en el juego.

Configurar la serpiente

Define el tamaño del bloque y la velocidad de la serpiente:

tamaño_del_bloque_de_la_serpiente = 20
velocidad_de_la_serpiente = 5

Establecemos el tamaño del bloque en 20 y la velocidad en 5. Esto significa que la serpiente se moverá 5 píxeles a la vez.

Configurar las variables del juego

Define los estilos y tamaños de fuente para mostrar la puntuación:

estilo_de_fuente = pygame.font.SysFont(None, 50)
fuente_de_puntuación = pygame.font.SysFont(None, 35)

Configurar la mejora de habilidad

Define el tamaño del bloque del poder-up:

tamaño_del_bloque_del_poder-up = 20

Definir funciones

Define las siguientes funciones:

dibujar_serpiente(tamaño_del_bloque_de_la_serpiente, lista_de_serpiente)

Esta función dibuja la serpiente en la pantalla:

def dibujar_serpiente(tamaño_del_bloque_de_la_serpiente, lista_de_serpiente):
    for x in lista_de_serpiente:
        pygame.draw.rect(
            pantalla, VERDE, [x[0], x[1], tamaño_del_bloque_de_la_serpiente, tamaño_del_bloque_de_la_serpiente]
        )

En el código anterior, pygame.draw.rect() se utiliza para dibujar un rectángulo en la pantalla. El primer parámetro es la pantalla, el segundo parámetro es el color y el tercer parámetro es la posición y el tamaño del rectángulo.

dibujar_poder-up(x_del_poder-up, y_del_poder-up)

Esta función dibuja el poder-up en la pantalla:

def dibujar_poder-up(x_del_poder-up, y_del_poder-up):
    pygame.draw.rect(
        pantalla, ROJO, [x_del_poder-up, y_del_poder-up, tamaño_del_bloque_del_poder-up, tamaño_del_bloque_del_poder-up]
    )

En el código anterior, pygame.draw.rect() se utiliza para dibujar un rectángulo en la pantalla. El primer parámetro es la pantalla, el segundo parámetro es el color y el tercer parámetro es la posición y el tamaño del rectángulo.

mostrar_puntuación(puntuación)

Esta función muestra la puntuación en la pantalla:

def mostrar_puntuación(puntuación):
    valor = fuente_de_puntuación.render("Puntuación: " + str(puntuación), True, BLANCO)
    pantalla.blit(valor, [10, 10])

En el código anterior, fuente_de_puntuación.render() se utiliza para renderizar la puntuación en la pantalla. El primer parámetro es el texto a mostrar, el segundo parámetro es la antialiasing y el tercer parámetro es el color del texto. pantalla.blit() se utiliza para dibujar el texto en la pantalla. El primer parámetro es el texto a mostrar y el segundo parámetro es la posición del texto.

bucle_del_juego()

Esta función contiene el bucle principal del juego:

def bucle_del_juego():
    ## Código del bucle del juego va aquí

Completar el código del bucle del juego

Completa la función bucle_del_juego() agregando la lógica del juego dentro del bucle while.

def bucle_del_juego():
    juego_terminado = False
    juego_cerrado = False

    ## Establece la posición inicial de la serpiente
    x1 = ANCHO / 2
    y1 = ALTO / 2
    cambio_x1 = 0
    cambio_y1 = 0

    ## Establece el cuerpo de la serpiente
    lista_de_serpiente = []
    longitud_de_serpiente = 1

    ## Establece el poder-up
    x_del_poder-up = round(random.randrange(0, ANCHO - tamaño_del_bloque_del_poder-up) / 20) * 20
    y_del_poder-up = round(random.randrange(0, ALTO - tamaño_del_bloque_del_poder-up) / 20) * 20

    ## Establece el bucle del juego
    while not juego_terminado:
        while juego_cerrado:
            pantalla.fill(COLOR_DE_FONDO)
            mensaje = estilo_de_fuente.render("Presiona ESPACIO para jugar de nuevo", True, AMARILLO)
            pantalla.blit(mensaje, [ANCHO / 2 - 200, ALTO / 2 - 50])
            pygame.display.flip()

            for evento in pygame.event.get():
                if evento.type == pygame.QUIT:
                    juego_terminado = True
                    juego_cerrado = False
                if evento.type == pygame.KEYDOWN:
                    if evento.key == pygame.K_SPACE:
                        bucle_del_juego()

        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                juego_terminado = True
            if evento.type == pygame.KEYDOWN:
                if evento.key == pygame.K_LEFT:
                    cambio_x1 = -tamaño_del_bloque_de_la_serpiente
                    cambio_y1 = 0
                elif evento.key == pygame.K_RIGHT:
                    cambio_x1 = tamaño_del_bloque_de_la_serpiente
                    cambio_y1 = 0
                elif evento.key == pygame.K_UP:
                    cambio_y1 = -tamaño_del_bloque_de_la_serpiente
                    cambio_x1 = 0
                elif evento.key == pygame.K_DOWN:
                    cambio_y1 = tamaño_del_bloque_de_la_serpiente
                    cambio_x1 = 0

        if x1 >= ANCHO or x1 < 0 or y1 >= ALTO or y1 < 0:
            juego_cerrado = True

        x1 += cambio_x1
        y1 += cambio_y1
        pantalla.fill(COLOR_DE_FONDO)
        pygame.draw.rect(
            pantalla, AZUL, [x_del_poder-up, y_del_poder-up, tamaño_del_bloque_del_poder-up, tamaño_del_bloque_del_poder-up]
        )

        cabeza_de_serpiente = []
        cabeza_de_serpiente.append(x1)
        cabeza_de_serpiente.append(y1)
        lista_de_serpiente.append(cabeza_de_serpiente)
        if len(lista_de_serpiente) > longitud_de_serpiente:
            del lista_de_serpiente[0]

        for x in lista_de_serpiente[:-1]:
            if x == cabeza_de_serpiente:
                juego_cerrado = True

        dibujar_serpiente(tamaño_del_bloque_de_la_serpiente, lista_de_serpiente)
        mostrar_puntuación(longitud_de_serpiente - 1)

        pygame.display.flip()

        if x1 == x_del_poder-up and y1 == y_del_poder-up:
            x_del_poder-up = round(random.randrange(0, ANCHO - tamaño_del_bloque_del_poder-up) / 20) * 20
            y_del_poder-up = (
                round(random.randrange(0, ALTO - tamaño_del_bloque_del_poder-up) / 20) * 20
            )
            longitud_de_serpiente += 1

        reloj.tick(velocidad_de_la_serpiente)

    pygame.quit()

En el código anterior, pygame.QUIT se utiliza para salir del juego. pygame.KEYDOWN se utiliza para comprobar si se presiona una tecla. pygame.K_LEFT, pygame.K_RIGHT, pygame.K_UP y pygame.K_DOWN se utilizan para comprobar si se presionan las flechas izquierda, derecha, arriba y abajo respectivamente. pygame.draw.rect() se utiliza para dibujar un rectángulo en la pantalla. El primer parámetro es la pantalla, el segundo parámetro es el color y el tercer parámetro es la posición y el tamaño del rectángulo. pygame.display.flip() se utiliza para actualizar la pantalla. pygame.time.Clock() se utiliza para controlar el tiempo en el juego. pygame.time.Clock.tick() se utiliza para establecer los FPS del juego.

Ejecutar el juego

Agrega lo siguiente al final del archivo para ejecutar el juego:

bucle_del_juego()
pygame.quit()

Finalmente, cambia a Escritorio y ejecuta el proyecto usando el siguiente comando:

python snake_game.py

Comando de ejecución del juego Snake

Resumen

¡Felicidades! Has creado con éxito un juego de serpiente usando Python y la biblioteca Pygame. En este proyecto, aprendiste cómo configurar la ventana del juego, definir colores, dibujar la serpiente y el poder-up, mostrar la puntuación e implementar la lógica del juego. Ahora puedes ejecutar el juego y disfrutarlo.

✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar