🎮 Все игры 🐍 Змейка
1 2 3 4 5 6 7
Урок 7 · финал

Игра окончена и рестарт

Что ты увидишь Готовую игру! Врезался в стену или в себя — «Игра окончена». Пробел — начать заново. Файл: step7_gameover.py (то же, что итоговый snake.py)
⬇️ Скачать код урока ⬇️ Скачать готовую игру (snake.py)

🔍 Флаг — переключатель «да / нет»

Заведём переменную game_over, которая хранит True или False — «игра закончилась или нет». Это называется флаг. Пока game_over = False, змейка двигается. Как только стало True — движение замирает и появляется надпись.

📝 Главная часть кода

if not game_over:
    head_x, head_y = snake[0]
    new_head = (head_x + direction[0], head_y + direction[1])

    # Врезались в стену?
    hit_wall = (
        new_head[0] < 0 or new_head[0] >= COLS
        or new_head[1] < 0 or new_head[1] >= ROWS
    )
    # Врезались в себя?
    hit_self = new_head in snake

    if hit_wall or hit_self:
        game_over = True
    else:
        snake.insert(0, new_head)
        if new_head == food:
            score += 1
            food = spawn_food(snake)
        else:
            snake.pop()

🔍 Две проверки конца игры

1. Стена

Голова вышла за поле, если её x меньше 0 или больше-равно числу колонок (а также по y). Поле — это клетки от 0 до COLS-1.

2. Сама в себя — оператор in

new_head in snake проверяет: «есть ли такая клетка где-нибудь в теле змейки?» Одна короткая строчка делает всю работу. Вот за такое любят Python!

📝 Рестарт по пробелу

if event.type == pygame.KEYDOWN:
    if game_over and event.key == pygame.K_SPACE:
        snake, direction, score, food = new_game()
        game_over = False

Функция new_game() просто возвращает всё в начальное состояние — короткую змейку, направление вправо, ноль очков и новое яблоко.

📝 Надпись на экране

if game_over:
    text = font.render("Игра окончена! Пробел — заново", True, WHITE)
    text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))
    screen.blit(text, text_rect)

font.render превращает текст в картинку, а blit «приклеивает» её на экран по центру.

🏆 Поздравляю! Ты написал полную игру: окно, сетку, змейку-список, движение, управление, еду, рост, очки, проигрыш и рестарт. Это всё те же простые кубики — списки, if и цикл.

🚀 Что дальше — выбери задание со звёздочкой

ИдеяЧему научишься
Сохранять рекорд в файлработа с файлами
Стены, через которые можно «пройти насквозь»остаток от деления %
Звук при поедании яблокаpygame.mixer
Препятствия-камни на полеещё один список
Ускорение каждые 5 яблокclock.tick(10 + score // 5)

🖥️ Полный экран

Чтобы игра ощущалась как настоящая — разверни её на весь монитор. Мы добавили флаг pygame.SCALED и две клавиши:

screen = pygame.display.set_mode((WIDTH, HEIGHT))
fullscreen = False

# ... в цикле событий ...
if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_f:                 # F — вкл/выкл полный экран
        fullscreen = not fullscreen
        flags = (pygame.SCALED | pygame.FULLSCREEN) if fullscreen else 0
        screen = pygame.display.set_mode((WIDTH, HEIGHT), flags)
    elif event.key == pygame.K_ESCAPE:
        pygame.quit(); sys.exit()             # ESC — выход

pygame.SCALED сам растягивает картинку 600×400 на весь экран — координаты в игре остаются те же, ничего пересчитывать не надо. F — включить/выключить полный экран, ESC — выйти.

← НазадУрок 6 — Еда и рост