Глава 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 не требуется
Практика выполняется локально
Открыть практику →