🎮 Все игры 🚀 Космос
1 2 3 4 5
Урок 5 · финал

Жизни, конец игры и рестарт

Что ты увидишь Пропустил врага вниз или столкнулся с ним — минус жизнь. Жизни кончились — «Игра окончена»: видишь свой счёт и кнопку «Играть заново» (или жми Enter). Это готовая игра. Файл: space.py (он же step5_lives.py)
⬇️ Скачать готовую игру

🆕 Новое: жизни и состояние игры

Как в Арканоиде, заводим lives и state. Только тут состояния два: "play" (играем) и "over" (конец). Когда жизни кончились — переключаем state и показываем надпись.

📝 Что добавилось (жизни и конец)

def new_game():
    ship_x = WIDTH // 2
    bullets = []
    enemies = []
    return ship_x, bullets, enemies, 0, 3, 0

ship_x, bullets, enemies, score, lives, spawn_timer = new_game()
state = "play"            # "play" | "over"

# --- враги: теперь отнимают жизнь ---
    for e in enemies[:]:
        e.y += ENEMY_SPEED
        if e.top > HEIGHT:                  # прорвался вниз
            enemies.remove(e)
            lives -= 1
        elif e.colliderect(ship_rect):      # врезался в корабль
            enemies.remove(e)
            lives -= 1

    if lives <= 0:
        state = "over"

# --- пробел ТОЛЬКО стреляет; перезапуск — Enter или кнопка ---
        elif event.key == pygame.K_SPACE and state == "play":
            bullets.append(pygame.Rect(ship_x - BULLET_W // 2, ship_y, BULLET_W, BULLET_H))
        elif event.key == pygame.K_RETURN and state == "over":
            ship_x, bullets, enemies, score, lives, spawn_timer = new_game()
            state = "play"

    # клик мышкой по кнопке «Играть заново»
    if event.type == pygame.MOUSEBUTTONDOWN and state == "over":
        if RESTART_BTN.collidepoint(event.pos):
            ship_x, bullets, enemies, score, lives, spawn_timer = new_game()
            state = "play"

🔍 Мелочи, которые важно понять

⚠️ Почему пробел НЕ перезапускает

Заманчиво повесить и стрельбу, и рестарт на пробел. Но в конце игры ты ещё жмёшь пробел (стрелял же!) — и игра мгновенно начнётся заново, а ты даже не успеешь увидеть свой счёт. Поэтому пробел только стреляет, а перезапуск отдельно: клавишей Enter или кликом по кнопке на экране.

Кнопка — это прямоугольник + проверка клика

Кнопка «Играть заново» — обычный pygame.Rect. Когда кликнули мышкой (MOUSEBUTTONDOWN), проверяем RESTART_BTN.collidepoint(event.pos) — попал ли курсор внутрь. Попал — начинаем новую игру. А финальный счёт показываем так: font.render(f"Твой счёт: {score}").

new_game() — чистый старт

Функция возвращает всё «как в начале»: корабль по центру, пустые списки, очки и таймер в ноль, три жизни. Один вызов — и игра свежая.

Весь игровой код — внутри if state == "play"

Когда игра окончена, корабль, пули и враги замирают: мы просто не выполняем обновление. Рисуем последний кадр и поверх — надпись.

🖥️ Полный экран В готовой игре нажми F — окно развернётся на весь экран как в настоящей игре. ESC — выход. Размеры игры (600×400) при этом не меняются, pygame.SCALED всё растягивает сам.
🎮 Попробуй сам — сделай игру своей 1. Сложнее со временем: постепенно уменьшай SPAWN_EVERY — враги пойдут чаще.
2. Больше жизней: верни 5 в new_game().
3. Звук выстрела: загляни в «Ловкого кота» — там есть pygame.mixer и звуки.
4. Рекорд: запоминай лучший счёт в отдельной переменной.
🎉 Готово! Ты собрал четвёртую игру и освоил список объектов — приём, на котором держатся почти все настоящие игры: пули, враги, монетки, частицы. Теперь ты умеешь управлять множеством предметов сразу.
← НазадУрок 4 — Попадания