Menu
CoddyTech

Murs

Fait partie de la section Projets du Journey Pygame de Coddy. Leçon 8 sur 31.

La partie se termine lorsque la tête est sur le point de sortir de la grille. Une cellule se trouve sur la grille lorsque sa colonne est comprise entre 0 et COLS - 1 et sa ligne entre 0 et 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:
        # insérer, manger ou retirer, comme précédemment

Notez x >= COLS, et non x > COLS : les colonnes sont numérotées à partir de 0, donc la colonne COLS se trouve déjà au-delà du bord.

Testez avant de déplacer le serpent. La tête ne sort jamais de la grille et, une fois que alive est faux, le serpent reste où il était. Affichez Game over centré en (240, 180) tant que sa valeur est fausse.

challenge icon

Défi

Moyen
  1. Définis alive = True avant la boucle.
  2. Place tout le déplacement sous if alive:. Calcule x et y ; si cette case est en dehors de la grille, définis alive = False, sinon insère, mange ou retire comme avant.
  3. Quand alive est faux, affiche Game over centré en (240, 180).

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

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()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Projets

Entraînez-vous par vous-même : Playground Pygame