Crear el juego Snake en Python es un proyecto excelente para practicar movimiento, coordenadas, eventos del teclado, listas, colisiones, puntuación y organización con funciones. En esta versión utilizaremos el módulo Turtle, incluido con Python, por lo que no necesitas instalar una biblioteca externa.
La serpiente estará formada por segmentos cuadrados. El jugador la moverá con las flechas, recogerá comida y perderá cuando choque contra una pared o contra su propio cuerpo.
Preparar el proyecto
Crea una carpeta y guarda un archivo llamado snake.py. Ejecuta el programa con:
python snake.pyTurtle utiliza una ventana gráfica basada en Tk. En la mayoría de las instalaciones oficiales de Python para escritorio ya está disponible. La documentación oficial de Turtle explica movimientos, eventos y configuración de pantalla.
Crear la ventana
from turtle import Screen, Turtle
WIDTH = 600
HEIGHT = 600
screen = Screen()
screen.setup(WIDTH, HEIGHT)
screen.bgcolor("#111827")
screen.title("Snake en Python")
screen.tracer(0)screen.tracer(0) desactiva la actualización automática. Después actualizaremos la pantalla una vez por fotograma, lo que evita parpadeos y permite controlar el ritmo.
La guía de Turtle para principiantes presenta coordenadas, colores, formas y eventos.
Crear el primer segmento
def create_segment(position):
segment = Turtle("square")
segment.color("#22c55e")
segment.penup()
segment.goto(position)
return segment
snake = [
create_segment((0, 0)),
create_segment((-20, 0)),
create_segment((-40, 0)),
]Cada segmento es un objeto Turtle cuadrado. penup() evita dibujar líneas al moverse.
Mover el cuerpo correctamente
Los segmentos deben seguir al anterior. El movimiento comienza desde la cola:
MOVE_DISTANCE = 20
def move_snake():
for index in range(len(snake) - 1, 0, -1):
new_x = snake[index - 1].xcor()
new_y = snake[index - 1].ycor()
snake[index].goto(new_x, new_y)
snake[0].forward(MOVE_DISTANCE)Recorrer en orden inverso evita que varios segmentos copien una posición que ya fue modificada. La guía de bucles for en Python explica range(), pasos negativos e índices.
Controlar la dirección
UP = 90
DOWN = 270
LEFT = 180
RIGHT = 0
def go_up():
if snake[0].heading() != DOWN:
snake[0].setheading(UP)
def go_down():
if snake[0].heading() != UP:
snake[0].setheading(DOWN)
def go_left():
if snake[0].heading() != RIGHT:
snake[0].setheading(LEFT)
def go_right():
if snake[0].heading() != LEFT:
snake[0].setheading(RIGHT)Impedir el giro de 180 grados evita que la cabeza choque inmediatamente contra el segundo segmento.
screen.listen()
screen.onkey(go_up, "Up")
screen.onkey(go_down, "Down")
screen.onkey(go_left, "Left")
screen.onkey(go_right, "Right")Crear la comida
from random import randint
food = Turtle("circle")
food.color("#ef4444")
food.penup()
food.shapesize(0.6, 0.6)
def move_food():
x = randint(-280, 280)
y = randint(-280, 280)
food.goto(x, y)
move_food()La guía del módulo random explica randint(), elecciones y semillas. La documentación oficial de random detalla sus funciones y limitaciones.
Detectar la comida
score = 0
def add_segment():
snake.append(create_segment(snake[-1].position()))
if snake[0].distance(food) < 15:
move_food()
add_segment()
score += 1distance() calcula la distancia entre dos objetos Turtle. Al comer, añadimos un segmento en la posición de la cola antes del siguiente movimiento.
Crear el marcador
scoreboard = Turtle()
scoreboard.hideturtle()
scoreboard.color("white")
scoreboard.penup()
scoreboard.goto(0, 260)
def update_score():
scoreboard.clear()
scoreboard.write(
f"Puntuación: {score}",
align="center",
font=("Arial", 18, "bold"),
)La guía de f-strings en Python explica formato, alineación y expresiones.
Detectar las paredes
La ventana mide 600 por 600 y la cabeza ocupa aproximadamente 20 píxeles. Utiliza un límite ligeramente inferior a 300:
LIMIT = 285
head = snake[0]
hit_wall = (
head.xcor() > LIMIT
or head.xcor() < -LIMIT
or head.ycor() > LIMIT
or head.ycor() < -LIMIT
)La condición debe revisar los cuatro lados. Si cualquiera es verdadera, termina la partida.
Detectar el choque con el cuerpo
hit_body = any(
snake[0].distance(segment) < 10
for segment in snake[1:]
)Excluimos la cabeza con snake[1:]. La guía de slicing en Python explica cómo seleccionar rangos de una lista.
Mostrar Game Over
def show_game_over():
message = Turtle()
message.hideturtle()
message.color("white")
message.write(
"GAME OVER",
align="center",
font=("Arial", 28, "bold"),
)Bucle principal completo
import time
DELAY = 0.12
running = True
update_score()
while running:
screen.update()
time.sleep(DELAY)
move_snake()
if snake[0].distance(food) < 15:
move_food()
add_segment()
score += 1
update_score()
head = snake[0]
hit_wall = (
head.xcor() > 285
or head.xcor() < -285
or head.ycor() > 285
or head.ycor() < -285
)
hit_body = any(
head.distance(segment) < 10
for segment in snake[1:]
)
if hit_wall or hit_body:
running = False
show_game_over()
screen.exitonclick()screen.update() dibuja el estado actual y time.sleep() controla la velocidad. Para un proyecto más avanzado, puedes utilizar ontimer() y evitar bloquear el bucle de eventos.
Aumentar la dificultad
Reduce gradualmente el retraso:
DELAY = max(0.05, DELAY - 0.005)Hazlo después de cada comida. Mantén un límite mínimo para que el juego siga siendo controlable.
Organizar el proyecto en clases
Cuando el código crece, puedes crear clases Snake, Food y Scoreboard. Cada una administra su estado y sus acciones. La guía de programación orientada a objetos en Python explica clases, métodos y encapsulación.
Mejoras posibles
- Guardar la mejor puntuación en un archivo.
- Añadir una pantalla de inicio y reinicio.
- Crear obstáculos.
- Cambiar colores y tamaño del tablero.
- Aumentar la velocidad progresivamente.
- Separar cada clase en un módulo.
- Añadir sonidos con una biblioteca de juegos.
Errores frecuentes
- Mover la cabeza antes de reposicionar el cuerpo.
- Permitir un giro directo hacia la dirección opuesta.
- Incluir la cabeza al comprobar colisiones con el cuerpo.
- Actualizar la pantalla automáticamente y también de forma manual.
- Crear comida fuera de los límites visibles.
- Añadir el segmento en una posición incorrecta.
- Olvidar llamar a
screen.listen().
Conclusión
El juego Snake combina varios fundamentos en un proyecto visual: listas, bucles, funciones, objetos, eventos y colisiones. Empieza con tres segmentos, movimiento y comida. Después añade puntuación, paredes, choque con el cuerpo y dificultad progresiva. Completar estas etapas proporciona una base sólida para juegos más complejos.






