Ne te mords pas
Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 9 sur 31.
La partie prend aussi fin lorsque la tête heurte 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 chaque case sauf la dernière. Lors d’un déplacement sans nourriture, la queue quitte sa case au cours du même déplacement. Se poursuivre la queue 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
DifficileTermine la partie lorsque la nouvelle tête (x, y) se trouve dans body[:-1], dans le même test que celui des murs.
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 Projets
Entraînez-vous par vous-même : Playground Pygame