Menu
CoddyTech

No te muerdas

Lección 27 de 41 del curso Crea juegos con Pygame de Coddy.

El juego también termina cuando la cabeza choca con el cuerpo. Añádelo a la comprobación que termina el juego:

if x < 0 or x >= COLS or y < 0 or y >= ROWS or (x, y) in body[:-1]:
    alive = False

La comprobación usa body[:-1], cada celda excepto la última. En un paso sin comida, la cola sale de su celda en ese mismo paso. Perseguir tu propia cola es seguro, así que la celda de la cola no cuenta.

[:-1] es un segmento: la lista desde el principio hasta, pero sin incluir, el último elemento.

challenge icon

Desafío

Difícil

Termina el juego cuando la serpiente se muerde a sí misma.

  1. Encuentra la condición que termina el juego al llegar a las paredes.
  2. Termínalo también cuando la nueva cabeza (x, y) esté en body[:-1].

Pulsa «Jugar», come unas cuantas veces y luego gira hacia tu cuerpo: fin del juego. Después pulsa «Comprobar».

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
alive = True

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

    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:
            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))
    if not alive:
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 180)))
    pygame.display.flip()
    clock.tick(10)

pygame.quit()

Todas las lecciones de Crea juegos con Pygame

Practica por tu cuenta: Playground de Pygame