Menu
CoddyTech

Paredes

Lección 26 de 40 del curso Crea juegos con Pygame de Coddy.

El juego termina cuando la cabeza saldría de la cuadrícula. Una celda está en la cuadrícula cuando su columna va de 0 a COLS - 1 y su fila va de 0 a ROWS - 1.

if alive:
    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    if x < 0 or x >= COLS or y < 0 or y >= ROWS:
        alive = False
    else:
        # inserta, come o elimina, como antes

Fíjate en x >= COLS, no en x > COLS: las columnas se numeran desde 0, así que la columna COLS ya está más allá del borde.

Comprueba antes de moverte. La cabeza nunca sale de la cuadrícula y, una vez que alive es false, la serpiente se queda donde estaba. Muestra Game over centrado en (240, 180) mientras sea false.

challenge icon

Desafío

Intermedio
  1. Establece alive = True antes del bucle.
  2. Pon todo el movimiento dentro de if alive:. Calcula x e y; si esa celda está fuera de la cuadrícula, establece alive = False; de lo contrario, inserta, come o elimina el último elemento como antes.
  3. Cuando alive sea falso, muestra Game over centrado en (240, 180).

Pruébalo tú mismo

import random
import pygame

CELL = 20
COLS, ROWS = 24, 18
TURNS = {
    pygame.K_LEFT: (-1, 0),
    pygame.K_RIGHT: (1, 0),
    pygame.K_UP: (0, -1),
    pygame.K_DOWN: (0, 1),
}

pygame.init()
screen = pygame.display.set_mode((COLS * CELL, ROWS * CELL))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)


def draw_cell(cell, color):
    col, row = cell
    pygame.draw.rect(screen, color, (col * CELL + 1, row * CELL + 1, CELL - 2, CELL - 2))


def new_food(body):
    while True:
        cell = (random.randrange(COLS), random.randrange(ROWS))
        if cell not in body:
            return cell


body = [(5, 9), (4, 9), (3, 9)]
direction = (1, 0)
food = new_food(body)
score = 0

running = True
while running:
    moving = direction
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key in TURNS:
            turn = TURNS[event.key]
            if turn != (-moving[0], -moving[1]):
                direction = turn

    x = body[0][0] + direction[0]
    y = body[0][1] + direction[1]
    body.insert(0, (x, y))
    if (x, y) == food:
        score += 1
        food = new_food(body)
    else:
        body.pop()

    screen.fill((30, 30, 46))
    draw_cell(food, (235, 80, 80))
    for cell in body[1:]:
        draw_cell(cell, (120, 220, 120))
    draw_cell(body[0], (180, 255, 160))
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (8, 6))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Crea juegos con Pygame

Practica por tu cuenta: Playground de Pygame