Ne te mords pas
Leçon 27 sur 41 du cours Créer des jeux avec Pygame de Coddy.
La partie se termine aussi lorsque la tête percute le corps. Ajoute cette condition au test qui met fin à la partie :
if x < 0 or x >= COLS or y < 0 or y >= ROWS or (x, y) in body[:-1]:
alive = FalseLe test utilise body[:-1], c’est-à-dire toutes les cases sauf la dernière. Lors d’un déplacement sans nourriture, la queue quitte sa case pendant le même déplacement. Se poursuivre soi-même est sans danger, donc la case de la queue ne compte pas.
[:-1] est une tranche : la liste depuis le début jusqu’au dernier élément, sans l’inclure.
Défi
DifficileMets fin à la partie lorsque le serpent se mord.
- Trouve le test qui met fin à la partie lorsque le serpent touche les murs.
- Mets-y aussi fin lorsque la nouvelle tête
(x, y)se trouve dansbody[:-1].
Appuie sur « Jouer », mange quelques fois, puis dirige-toi vers ton corps : partie terminée. Ensuite, appuie sur « Vérifier ».
Essayez vous-même
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()
Toutes les leçons de Créer des jeux avec Pygame
3Grilles et listes
Une grille de cellulesPas à pasEntraînez-vous par vous-même : Playground Pygame