Menu
CoddyTech

Murs

Leçon 26 sur 41 du cours Créer des jeux avec Pygame de Coddy.

La partie se termine lorsque la tête sortirait 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

Remarque que c’est x >= COLS, et non x > COLS : les colonnes sont numérotées à partir de 0, donc la colonne COLS est déjà au-delà du bord.

Teste avant de déplacer le serpent. La tête ne sort jamais de la grille et, une fois que alive vaut false, le serpent reste à sa place. Affiche Game over au centre de (240, 180) tant que la valeur est false.

challenge icon

Défi

Moyen

Termine la partie lorsque le serpent heurte un mur.

  1. Définis alive = True avant la boucle, et place le déplacement sous if alive:.
  2. Si la nouvelle case (x, y) est hors de la grille, définis alive = False ; sinon, insère, mange ou retire comme avant.
  3. Lorsque alive est faux, affiche Game over au centre de (240, 180).

Appuie sur « Jouer » et heurte un mur : Game over s’affiche et le serpent s’arrête. Puis 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

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()

Toutes les leçons de Créer des jeux avec Pygame

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