Cómo hacer un juego de serpientes en Python

Si eres de los que disfruta jugando al juego de la serpiente, estoy seguro de que este artículo te resultará interesante.

En este artículo, te enseñaré cómo crear un juego de serpientes simple que incluso un principiante en Python encontraría fácil de desarrollar.

Existen varias formas de crear este juego y una incluye el uso de la biblioteca PyGame de Python, que es una biblioteca de Python que usamos para crear juegos.

La otra forma es mediante el uso de la biblioteca de tortugas. Este módulo viene preinstalado con Python y proporciona un lienzo virtual para que los usuarios creen formas e imágenes.

Por lo tanto, este artículo utilizará la biblioteca de tortugas para implementar nuestro sencillo juego de serpientes, que es apto para principiantes, especialmente para desarrolladores novatos de Python.

Además de este módulo, también utilizaremos otros dos módulos, a saber;

  • Módulo de tiempo: este método nos permitirá realizar un seguimiento de la cantidad de segundos que han transcurrido desde la última vez.
  • Módulo aleatorio: genera números aleatoriamente en Python.

Otras herramientas básicas que necesitará usar incluyen un editor de texto de su elección. Usaré VSCode en este artículo. Por supuesto, deberá instalar Python 3 en su máquina si aún no lo tiene. También puede utilizar el compilador kirukiru.es.

¡Esto debería ser divertido!

Cómo funciona el juego de la serpiente

El objetivo final de este juego es que el jugador logre la puntuación más alta controlando a la serpiente para recolectar la comida que muestra la pantalla.

El jugador controla a la serpiente usando cuatro teclas de dirección que son relativas a la dirección hacia la que se mueve la serpiente. Si la serpiente golpea un bloque o se golpea a sí misma, el jugador pierde el juego.

Los siguientes pasos vamos a seguir para implementar este juego.

  • Importando a nuestros programas los módulos preinstalados (tortuga, tiempo y aleatorio).
  • Creando la visualización de la pantalla del juego usando el módulo de tortuga.
  • Configuración de las teclas para la dirección de movimiento de la serpiente alrededor de la pantalla.
  • La implementación del juego.

Cree un archivo snakegame.py en el que agregaremos el código de implementación.

Importación de los módulos

Esta parte del código importará los módulos de tortuga, tiempo y aleatorios que están preinstalados de forma predeterminada en Python. Además, estableceremos valores predeterminados para la puntuación inicial del jugador, la puntuación más alta que obtendrá el jugador y el tiempo de retraso que tarda el jugador en cada movimiento. El módulo de tiempo se utiliza aquí para calcular el tiempo de retraso.

Agregue el siguiente fragmento de código a su archivo snakegame.py.

import turtle
import random
import time

player_score = 0
highest_score = 0
delay_time = 0.1

Creación de la visualización de la pantalla del juego

El módulo tortuga que importamos aquí nos permitirá crear un lienzo virtual que será la pantalla de la ventana del juego. A partir de aquí, podemos crear el cuerpo de la serpiente y la comida que recogerá la serpiente. Nuestra pantalla también mostrará la puntuación registrada del jugador.

Agregue este código al archivo de Python.

# window screen created
wind = turtle.Screen()
wind.title("Snake Maze🐍")
wind.bgcolor("red")

# The screen size
wind.setup(width=600, height=600)


# creating the snake 
snake = turtle.Turtle()
snake.shape("square")
snake.color("black")
snake.penup()
snake.goto(0, 0)
snake.direction = "Stop"

# creating the food
snake_food = turtle.Turtle()
shapes = random.choice('triangle','circle')
snake_food.shape(shapes)
snake_food.color("blue")
snake_food.speed(0)
snake_food.penup()
snake_food.goto(0, 100)

pen = turtle.Turtle()
pen.speed(0)
pen.shape('square')
pen.color('white')
pen.penup()
pen.hideturtle()
pen.goto(0, 250)
pen.write("Your_score: 0 Highest_Score : 0", align="center", 
font=("Arial", 24, "normal"))
turtle.mainloop()

El fragmento de código anterior comienza con la inicialización de la pantalla de la tortuga y pasa un título y un color de fondo a la pantalla. Después de definir el tamaño de la ventana de nuestra pantalla, dibujamos la forma de la serpiente en el lienzo virtual.

El método penup() simplemente toma el bolígrafo de la tortuga para que no se dibuje una línea a medida que la tortuga se mueve. El método goto(x,y) contiene posiciones de coordenadas que mueven la tortuga a una posición absoluta.

Luego creamos la comida que recolecta la serpiente. Querremos mostrar la puntuación del jugador cada vez que la serpiente recoge la comida y la puntuación más alta que alcanza el jugador durante el juego. Por lo tanto, usamos el método pen.write() para implementar esto. hideturtle() oculta el icono de la tortuga de la pantalla en la sección del encabezado en la que está escrito este texto.

Es importante agregar turtle.mainloop() al final de su código, que mostrará la pantalla por más tiempo para permitirle al usuario hacer algo en la pantalla.

Ejecute el archivo y debería tener el siguiente resultado:

Configuración de las teclas de dirección para la serpiente

Aquí, configuraremos teclas específicas que guiarán la dirección en la que se moverá la serpiente en la pantalla. Usaremos la ‘L’ para la izquierda, la ‘R’ para la derecha, la ‘U’ para arriba, la ‘D’ para abajo. Implementaremos estas direcciones usando la función de dirección de la tortuga que llamaremos a la serpiente.

Agregue el siguiente fragmento de código a su código.

# Assigning directions
def moveleft():
    if snake.direction != "right":
        snake.direction = "left"

def moveright():
    if snake.direction != "left":
        snake.direction = "right"

def moveup():
    if snake.direction != "down":
        snake.direction = "up"

def movedown():
    if snake.direction != "up":
        snake.direction = "down"

def move():
    if snake.direction == "up":
        coord_y = snake.ycor()
        snake.sety(coord_y+20)

    if snake.direction == "down":
        coord_y = snake.ycor()
        snake.sety(coord_y-20)

    if snake.direction == "right":
        coord_x = snake.xcor()
        snake.setx(coord_x+20)

    if snake.direction == "left":
        coord_x = snake.xcor()
        snake.setx(coord_x-20)

wind.listen()
wind.onkeypress(moveleft, 'L')
wind.onkeypress(moveright, 'R')
wind.onkeypress(moveup, 'U')
wind.onkeypress(movedown, 'D')

La función move() anterior establece el movimiento de la serpiente en la posición definida dentro de un valor de coordenadas preciso.

La función listen () es un detector de eventos que llama a los métodos que mueven la serpiente en una dirección particular cuando el jugador presiona la tecla.

La implementación del juego de la serpiente.

Después de establecer la perspectiva básica de nuestro juego de serpientes, tendremos que hacerlo en tiempo real.

Esto implicará lo siguiente:

  • Hacer crecer la longitud de la serpiente cada vez que recolecta la comida preferiblemente usando un color diferente.
  • Incrementando la puntuación del jugador cada vez que la serpiente recoge la comida y rastreando la puntuación más alta.
  • El jugador puede evitar que la serpiente choque con la pared o con su propio cuerpo.
  • El juego se reinicia cuando la serpiente choca.
  • La puntuación del jugador se restablece a cero cuando se reinicia el juego, mientras que la pantalla conserva la puntuación más alta del jugador.

Agregue el resto de este código a su archivo python.

segments = []

#Implementing the gameplay
while True:
    wind.update()
    if snake.xcor() > 290 or snake.xcor() < -290 or snake.ycor() > 290 or snake.ycor() < -290:
        time.sleep(1)
        snake.goto(0, 0)
        snake.direction = "Stop"
        snake.shape("square")
        snake.color("green")

        for segment in segments:
            segment.goto(1000, 1000)
            segments.clear()
            player_score = 0
            delay_time = 0.1
            pen.clear()
            pen.write("Player's_score: {} Highest_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

        if snake.distance(snake_food) < 20:
            coord_x = random.randint(-270, 270)
            coord_y = random.randint(-270, 270)
            snake_food.goto(coord_x, coord_y)

            # Adding segment
            added_segment = turtle.Turtle()
            added_segment.speed(0)
            added_segment.shape("square")
            added_segment.color("white")
            added_segment.penup()
            segments.append(added_segment)
            delay_time -= 0.001
            player_score += 5

            if player_score > highest_score:
                highest_score = player_score
                pen.clear()
                pen.write("Player's_score: {} Highest_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

    # checking for collisions
    for i in range(len(segments)-1, 0, -1):
        coord_x = segments[i-1].xcor()
        coord_y = segments[i-1].ycor()
        segments[i].goto(coord_x, coord_y)

    if len(segments) > 0:
        coord_x = snake.xcor()
        coord_y = snake.ycor()
        segments[0].goto(coord_x, coord_y)
    move()

    for segment in segments:
        if segment.distance(snake) < 20:
            time.sleep(1)
            snake.goto(0, 0)
            snake.direction = "stop"
            snake.color('white')
            snake.shape('square')

            for segment in segments:
                segment.goto(1000, 1000)
                segment.clear()
                player_score = 0
                delay_time = 0.1
                pen.clear()
                pen.write("Player's_score: {} Highest_score: {}".format(player_score, highest_score), align="center", font=("Arial", 24, "normal"))

     time.sleep(delay_time)

turtle.mainloop()

En el fragmento de código anterior, establecemos una posición aleatoria para la comida de la serpiente dentro de la pantalla. Cada vez que la serpiente recolecta este alimento, su segmento corporal aumenta con un color diferente; blanco, en este caso, para distinguir su crecimiento.

Después de que la serpiente recoge la comida sin chocar, la comida se coloca en una posición aleatoria dentro del rango de coordenadas 270 del tamaño de la pantalla. Cada vez que la serpiente recoge comida, la puntuación del jugador aumenta en 5. Cuando la serpiente choca, la puntuación del jugador se establece en 0 mientras que la pantalla conserva su puntuación más alta.

Ahora devuelva el archivo de Python y debería ver la pantalla de su tortuga con este aspecto:

Conclusión 🐍

Usar la biblioteca de tortugas es una manera fácil y divertida de crear el juego de serpientes como hemos visto en este artículo. Alternativamente, podría implementar lo mismo usando la biblioteca PyGame. Puedes consultar el Tutorial de PyGame aquí y vea cómo podría implementar el juego de manera diferente.

También puede probar un juego de adivinanzas de números en Python o cómo obtener datos JSON en Python.
¡Disfruta codificando!