Menu
CoddyTech

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 = False

Le 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.

challenge icon

Défi

Difficile

Mets fin à la partie lorsque le serpent se mord.

  1. Trouve le test qui met fin à la partie lorsque le serpent touche les murs.
  2. Mets-y aussi fin lorsque la nouvelle tête (x, y) se trouve dans body[:-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

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