Paredes
Parte de la sección Proyectos del Journey de Pygame de Coddy. Lección 8 de 31.
El juego termina cuando la cabeza está a punto de salir de la cuadrícula. Una celda está en la cuadrícula cuando su columna está entre 0 y COLS - 1 y su fila entre 0 y 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 el último elemento, como antesFí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.
Haz la comprobación 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 alive sea false.
Desafío
Intermedio- Establece
alive = Trueantes del bucle. - Pon todo el movimiento dentro de
if alive:. Calculaxey; si esa celda está fuera de la cuadrícula, establecealive = False; de lo contrario, insértala, cómela o elimínala como antes. - Cuando
alivesea falso, muestraGame overcentrado 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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Proyectos
Practica por tu cuenta: Playground de Pygame