Non morderti
Lezione 27 di 41 del corso Crea giochi con Pygame di Coddy.
Il gioco termina anche quando la testa si scontra con il corpo. Aggiungilo al controllo che termina il gioco:
if x < 0 or x >= COLS or y < 0 or y >= ROWS or (x, y) in body[:-1]:
alive = FalseIl controllo usa body[:-1], tutte le celle tranne l’ultima. In un passaggio senza cibo, la coda esce dalla propria cella nello stesso passaggio. Inseguire la propria coda è sicuro, quindi la cella della coda non viene conteggiata.
[:-1] è una fetta: la lista dall’inizio fino all’ultimo elemento, escluso.
Sfida
DifficileTermina la partita quando il serpente si morde.
- Trova il controllo che termina la partita quando raggiungi i bordi.
- Termina la partita anche quando la nuova testa
(x, y)si trova inbody[:-1].
Premi «Gioca», mangia alcune volte, poi gira verso il tuo corpo: partita terminata. Poi premi «Verifica».
Provalo tu
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()
Tutte le lezioni di Crea giochi con Pygame
3Griglie ed elenchi
Una griglia di cellePasso dopo passoEsercitati da solo: Playground Pygame