Глава 21 · Проект: космический шутер

Перезапуск игры без перезапуска программы

Перезапуск обязан сбросить каждый кусочек переходного состояния — не только счёт.

У раздела 21.7 не было пути назад из Game Over. Финальная версия перезапускается прямо в процессе — но перезапуск обязан сбросить каждый кусочек переходного состояния, не только счёт.

fragment_start_new_game.py
def start_new_game(self):
    self.bullets.empty()
    self.enemies.empty()
    self.explosions.empty()
    self.player = self._make_player()
    self.score = 0
    self.lives = STARTING_LIVES
    self.spawn_timer = interval_poyavleniya_vraga(0)
    self._reset_stars()
    self.state = GameStatus.PLAYING
СбрасываетсяСохраняется
Позиция корабляРекорд сессии (high_score)
Все пули, враги, взрывы
Счёт и жизни
Таймер появления врагов и интервал между выстрелами
Таймер неуязвимости
Забытая пуля из прошлой игры — реальная ошибка, не гипотетическая
Если self.bullets.empty() пропустить, старые пули из предыдущей попытки останутся висеть на экране новой игры — визуально безобидно, но явно неправильно, и легко упустить при ручном тестировании, если специально не проверить перезапуск с непустыми группами.
Реальное окно: чистое игровое поле сразу после перезапуска, счёт 0, три жизни
Реальное окно сразу после перезапуска — счёт, жизни, таймеры и все группы спрайтов возвращены к начальному состоянию.