Cómo crear el juego Snake en Python con Turtle

Actualizado el: 11/07/2026
Tempo de leitura: 4 minutos
Ilustração de uma cobra com o logo do Python centralizado

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.py

Turtle 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 += 1

distance() 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.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Búsqueda en PDF con Python y RAG
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Guía PDF con Python y RAG

    Aprende a consultar PDF con Python y RAG, recuperación semántica, evaluación y seguridad.

    Ler mais

    Tempo de leitura: 7 minutos
    23/07/2026
    Integração do ChatGPT com código Python em projeto prático
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Cómo integrar la API de OpenAI con Python paso a paso

    Integra la API de OpenAI con Python usando Responses API, variables de entorno, validación, reintentos, control de costes, pruebas y

    Ler mais

    Tempo de leitura: 5 minutos
    12/07/2026
    Calendário mensal gerado automaticamente com Python
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Cómo generar un calendario mensual con Python

    Genera un calendario mensual con Python usando calendar y datetime, valida fechas, añade eventos y exporta a TXT, HTML o

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Projeto de jogo da velha desenvolvido em Python como exercício de lógica de programação
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear un juego de tres en raya con Python

    Crea un juego de tres en raya con Python usando listas, funciones, validación, detección de victoria, marcador, pruebas y una

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    texto Tkinter com uma interface gráfica dele ao lado
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear tu primera aplicación con Tkinter

    Crea tu primera aplicación con Tkinter: ventanas, ttk, formularios, grid, eventos, archivos, threads, estilos y separación de lógica.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Sistema de lembretes e alarmes desenvolvido com Python
    Proyectos
    Foto de perfil de Leandro Hirt da Academify

    Cómo crear un sistema de recordatorios con alarma en Python

    Crea recordatorios con alarma en Python usando datetime, JSON, threads, zonas horarias, sonidos, recurrencia y pruebas controladas.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026