Гид по технологиям

Руководство: система здоровья в PyGame

6 min read Game Dev Обновлено 07 Jan 2026
Система здоровья в PyGame — практическое руководство
Система здоровья в PyGame — практическое руководство

Важно: все фрагменты кода сохраняют поведение оригинального примера — значения здоровья и урона можно настраивать.

Введение

Реализация системы здоровья (HP) делает игру более понятной и стратегичной. В PyGame это легко реализуется: достаточно отслеживать числовое состояние, распознавать столкновения и обновлять визуальные элементы (например, полоску здоровья).

Ключевые понятия:

  • HP — текущее здоровье игрока (число).
  • max_health — максимальное здоровье.
  • Damage — величина урона (при столкновении с врагом).
  • Power-up — предмет, восстанавливающий здоровье или дающий другие эффекты.

Постер с символом плюса и сердца

Что вы получите из этого руководства

  • Готовые фрагменты кода для движка PyGame.
  • Пошаговые пояснения по обнаружению столкновений, нанесению урона и лечению.
  • Лучшие практики, тест-кейсы и контрольный список для разработки.

Установка и базовая игра

Убедитесь, что pip установлен. Установите PyGame командой:

pip install pygame

Создайте файл simple-game.py и начните с минимального игрового цикла, где игрок может двигаться влево/вправо. Этот базовый пример показывает окно, игрока и врага, который падает.

Ниже — исходный пример кода (с минимальной игровой логикой):

import pygame  
import random  
  
# Initialize PyGame  
pygame.init()  
  
# Set up the game window  
window_width, window_height = 800, 600  
window = pygame.display.set_mode((window_width, window_height))  
pygame.display.set_caption("Health System Demo")  
  
# Player attributes  
player_width, player_height = 50, 50  
player_x, player_y = window_width // 2, window_height - player_height - 10  
player_speed = 1  
  
# Enemy attributes  
enemy_width, enemy_height = 50, 50  
enemy_x, enemy_y = random.randint(0, window_width - enemy_width), 0  
enemy_speed = 0.3  
  
# Game loop  
running = True  
while running:  
    for event in pygame.event.get():  
        if event.type == pygame.QUIT:  
            running = False  
  
    # Move the player left or right  
    keys = pygame.key.get_pressed()  
    if keys[pygame.K_LEFT] and player_x > 0:  
        player_x -= player_speed  
    if keys[pygame.K_RIGHT] and player_x < window_width - player_width:  
        player_x += player_speed  
  
    # Move the enemy downwards  
    enemy_y += enemy_speed  
  
    # Draw game objects  
    window.fill((0, 0, 0))  # Clear the screen  
    pygame.draw.rect(window, (255, 0, 0),   
                     (player_x, player_y,   
                      player_width, player_height))    
    pygame.draw.rect(window, (0, 255, 0),   
                     (enemy_x, enemy_y,   
                      enemy_width, enemy_height))  # Draw enemy  
    pygame.display.update()  
  
pygame.quit()

Запустите код: появится окно, где можно управлять игроком стрелками влево/вправо.

Простая аркадная сцена с игроком и врагом

Определение переменных здоровья

Добавим переменные для хранения текущего и максимального здоровья, а также урона от врага. В примерах ниже использованы значения из учебного сценария: текущее здоровье 100, максимальное 100, урон от врага 20.

# Player health  
player_health = 100  
max_health = 100  
enemy_damage = 20

Эти числа можно изменять при балансировке игры.

Нанесение урона и механика лечения

Чтобы игрок получал урон, нужно определять столкновения между его прямоугольником и прямоугольником врага. При столкновении отнимать enemy_damage от player_health.

Также можно добавить механику лечения: например, если игрок покидает верх экрана (player_y < 0), он восстанавливает 10 единиц здоровья и телепортируется вниз.

Создайте файл damage-and-healing.py и вставьте обновлённые проверки в игровой цикл:

# Inside the game loop, after updating the enemy position  
# Detect collision between player and enemy  
if player_x < enemy_x + enemy_width and \  
           player_x + player_width > enemy_x and \  
           player_y < enemy_y + enemy_height \  
           and player_y + player_height > enemy_y:  
   player_health -= enemy_damage  
   print(player_health)  
  
# Heal the player when they move off the screen  
if player_y < 0:  
   player_health += 10  
   print(player_health)  
   if player_health > max_health:  
       player_health = max_health  
       player_y = window_height - player_height - 10  

Результатом будут сообщения в консоли с текущим значением здоровья при столкновениях и лечении.

Враг падает на игрока, показан урон

Обработка смерти игрока и Game Over

Если здоровье игрока достигает нуля, нужно показывать сообщение о проигрыше и перезапускать положение/здоровье игрока. Это можно сделать простой проверкой в цикле.

Создайте файл manage-player-death.py и добавьте после обновления позиции игрока:

# After updating the player's position  
  
# Check if player's health reaches zero  
if player_health <= 0:  
    print("Game Over")  
    player_health = max_health  
    player_x = window_width // 2  
    player_y = window_height - player_height - 10

Советы по улучшению UX Game Over:

  • Показывайте анимацию или экран с предложением перезапустить.
  • Давайте краткую статистику (время выживания, набранные очки).

Усиления (Power-ups)

Добавим предмет, который восстанавливает здоровье при сборе. В примере используются размеры 30×30 и восстановление +50.

Создайте файл power-up.py и вставьте в игровой цикл:

# Define power-up attributes  
power_up_width, power_up_height = 30, 30  
power_up_x, power_up_y = 200,200  
power_up_health_value = 50  
  
# Inside the game loop, after updating the player's position  
# Detect collision between player and power-up  
if player_x < power_up_x + power_up_width and\  
      player_x + player_width > power_up_x \  
        and player_y < power_up_y + power_up_height\  
          and player_y + player_height > power_up_y:  
    player_health += power_up_health_value  
    if player_health > max_health:  
        player_health = max_health  
    power_up_x, power_up_y = 200,200  
  
# Draw power-up object  
pygame.draw.rect(window, (0, 0, 255),   
                    (power_up_x, power_up_y,   
                     power_up_width,   
                     power_up_height))

Игрок, враг и объект усиления (power-up)

Визуальная полоса здоровья

Полоса здоровья позволяет игроку быстро оценивать состояние. Пример функции для отрисовки полосы:

def draw_health_bar(surface, x, y, width, height, current, maximum):
    ratio = current / maximum
    pygame.draw.rect(surface, (80, 80, 80), (x, y, width, height))  # фон
    pygame.draw.rect(surface, (255, 0, 0), (x, y, int(width * ratio), height))  # заполнение
    # опционально: рамка
    pygame.draw.rect(surface, (255, 255, 255), (x, y, width, height), 2)

Вызовите эту функцию в основном цикле, перед pygame.display.update(), и передавайте актуальные значения player_health и max_health.

Лучшие практики

Используйте событие-ориентированные механики

Вместо непрерывной проверки условий в основном цикле рассмотрите использование собственной логики событий: при столкновении генерируйте событие “PLAYER_HIT” или вызывайте callback-функцию.

Балансировка

Тестируйте значения здоровья, урона и лечения на ранних альфа-сборках. Часто 1–3 итерации правок баланса после первых тестов дают заметное улучшение ощущений от игры.

Обратная связь игроку

Добавляйте визуальные (вспышки, изменение цвета), звуковые и тактильные сигналы при получении урона или при лечении. Это повышает вовлечённость.

Приёмка и тест-кейсы

Критерии приёмки:

  • Игрок теряет ровно enemy_damage при столкновении.
  • Здоровье не опускается ниже нуля.
  • При player_y < 0 здоровье увеличивается на 10 и игрок телепортируется вниз.
  • При сборе power-up здоровье увеличивается на заданную величину и не превышает max_health.

Минимальный набор тест-кейсов:

  • Столкновение с врагом: здоровье уменьшается и отображается корректно.
  • Смерть: при 0 HP выводится “Game Over” и игрок сбрасывается.
  • Сбор усиления при почти полном HP: HP не превышает max_health.
  • Повторяющиеся получения урона с частой частотой: логика не даёт отрицательных значений.

Чек-листы по ролям

Разработчик:

  • Хранение HP и max_health в одном месте (конфиг).
  • Правильная обработка столкновений.
  • Отрисовка полосы здоровья.

Дизайнер:

  • Подобраны значения HP/урона для желаемой сложности.
  • Подобраны визуальные и звуковые сигналы для урона и лечения.

QA:

  • Тесты на граничные значения (0, max_health).
  • Проверка механики power-up при разных позициях.

Альтернативные подходы

  • Система с «жизненными щитами» (shield) — доп. переменная, которая поглощает урон прежде, чем он попадёт в HP.
  • Регенерация со скоростью (HP per second) вместо дискретного исцеления при выходе за экран.
  • Множество типов урона (физический, магический) и соответствующая резистанс-логика.

Когда это не подходит:

  • Для игр с очень простыми правилами (например, столкновение = мгновенный Game Over) полноценная HP-система избыточна.

Методология реализации (короткая)

  1. Определите модель здоровья (одно число vs. multi-component).
  2. Реализуйте хранение состояния и API (get_damage, heal, is_dead).
  3. Подключите проверку столкновений и вызовы API.
  4. Отрисуйте UI и дайте фидбек игроку.
  5. Проведите балансные тесты и итерации.

Факты и ключевые значения

  • Примерные значения в этом руководстве: max_health = 100, enemy_damage = 20, power_up_health_value = 50.
  • Эти числа служат отправной точкой для балансировки.

Производительность и оптимизация

  • Избегайте дорогостоящих операций в основном цикле (например, аллокаций, чтения с диска).
  • Коллизии можно ускорить использованием простых AABB-прямоугольников, spatial hashing или quad-tree при большом количестве объектов.

Локализация и доступность

  • Текст “Game Over” и другие сообщения следует выносить в словарь локализации.
  • Цвета полосы здоровья должны учитывать дальтоников: добавьте иконку или форму как дублёр цвета.

Безопасность и приватность

Система здоровья не сохраняет личных данных игрока. Если вы планируете хранить прогресс на сервере, шифруйте коммуникацию и аутентифицируйте запросы.

Риски и их снижение

  • Риск: бесконечное восстановление здоровья (баг с power-up). Митигатор: таймер переспауна power-up и защита от дублирующего срабатывания.
  • Риск: отрицательное здоровье. Митигатор: clamp значения между 0 и max_health везде, где меняется HP.

Сводка

Реализация системы здоровья в PyGame состоит из трёх частей: модель состояния (переменные), логика изменений (столкновения, урон, лечение) и визуальное представление (полоса здоровья, эффект при уроне). Начните с простых значений (например, 100 HP и 20 урона) и итеративно балансируйте игру по тестам.

Ключевые шаги для внедрения в проект:

  • Вынесите константы здоровья в конфиг;
  • Используйте простые проверки столкновений (AABB);
  • Реализуйте защёлки (clamp) для значения HP;
  • Добавьте визуальную и звуковую обратную связь.

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

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Разбить диск в Windows 10 через DiskPart
Инструкции

Разбить диск в Windows 10 через DiskPart

Контекстные менеджеры в Python — руководство
Python

Контекстные менеджеры в Python — руководство

Добавить фото и видео в Highlights без спама
Социальные сети

Добавить фото и видео в Highlights без спама

Отключить Firefox View — как убрать вкладку
Браузеры

Отключить Firefox View — как убрать вкладку

Подмена местоположения iPhone/iPad — AnyGo
iOS

Подмена местоположения iPhone/iPad — AnyGo

Отключить USB‑накопители: Windows, macOS, Linux
Безопасность

Отключить USB‑накопители: Windows, macOS, Linux