Глава 21 · Проект: космический шутер
Как растёт сложность игры
Три независимые формулы от счёта — с ограничением сверху и снизу, без резких скачков.
Постоянная сложность быстро становится или слишком лёгкой, или слишком тяжёлой. Финальная версия растит сложность плавно, через три независимые чистые функции от текущего счёта.
fragment_difficulty.py
def interval_poyavleniya_vraga(score):
return max(MIN_SPAWN_INTERVAL, BASE_SPAWN_INTERVAL - score * SPAWN_INTERVAL_SCORE_FACTOR)
def mnozhitel_skorosti_vraga(score):
return 1.0 + min(MAX_ENEMY_SPEED_BONUS, score * ENEMY_SPEED_SCORE_FACTOR)
def veroyatnost_istrebitelya(score):
return min(MAX_FIGHTER_PROBABILITY, score * FIGHTER_PROBABILITY_SCORE_FACTOR)
| Функция | Растёт со счётом | Ограничена сверху/снизу |
|---|---|---|
| interval_poyavleniya_vraga | Уменьшается — враги появляются чаще | Не ниже MIN_SPAWN_INTERVAL |
| mnozhitel_skorosti_vraga | Увеличивается — враги быстрее | Не выше 1.0 + MAX_ENEMY_SPEED_BONUS |
| veroyatnost_istrebitelya | Увеличивается — больше истребителей | Не выше MAX_FIGHTER_PROBABILITY |
Нижняя и верхняя границы — не случайность
Без
max()/min() интервал появления врагов на очень высоком счёте мог бы уйти в ноль или отрицательное число. Тогда while self.spawn_timer <= 0.0: в разделе 21.14 никогда не завершился бы: прибавление неположительного интервала не может поднять таймер выше нуля, и цикл создавал бы врагов бесконечно на одном и том же кадре. Ограничения защищают формулы от собственного роста.
Номер волны — только для интерфейса
fragment_wave.py
WAVE_SCORE_STEP = 500
def nomer_volny(score):
return 1 + score // WAVE_SCORE_STEP
Волна — не отдельная система с собственными правилами, а просто удобный способ показать игроку прогресс: раз в 500 очков номер волны на HUD увеличивается, хотя сама сложность растёт непрерывно, без резких скачков в этот момент.
Практика: формулы сложности
Проверяется прямо в браузере — установка Pygame не требуется
Практика выполняется локально