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 = FalseLa 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.
Desafío
DifícilTermina el juego cuando la serpiente se muerde a sí misma.
- Encuentra la condición que termina el juego al llegar a las paredes.
- Termínalo también cuando la nueva cabeza
(x, y)esté enbody[:-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
3Cuadrículas y listas
Una cuadrícula de celdasPaso a pasoPractica por tu cuenta: Playground de Pygame