Menu
CoddyTech
flag Ru iconРусскийdown icon

Стены

Урок 26 из 40 курса Создавай игры на Pygame на Coddy.

Игра заканчивается, когда голова должна выйти за пределы сетки. Клетка находится на сетке, если её столбец находится в диапазоне от 0 до COLS - 1, а строка — в диапазоне от 0 до 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:
        # вставить, съесть или удалить, как и прежде

Обрати внимание на x >= COLS, а не на x > COLS: столбцы нумеруются начиная с 0, поэтому столбец COLS уже находится за краем.

Проверяй условие до перемещения. Голова никогда не выходит за пределы сетки, и после того как alive станет false, змейка останется на месте. Пока значение ложно, отображай Game over по центру в точке (240, 180).

challenge icon

Задание

Средне
  1. Установи alive = True перед циклом.
  2. Помести весь ход внутрь if alive:. Вычисли x и y; если эта клетка находится за пределами сетки, установи alive = False, иначе вставь сегмент, съешь еду или удали сегмент, как и раньше.
  3. Когда alive равно false, отобрази Game over по центру в точке (240, 180).

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создавай игры на Pygame

Потренируйтесь самостоятельно: Песочница Pygame