Menu
Coddy logo textTech

RPG-персонаж

Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 58 из 61.

challenge icon

Задание

Легко

Давайте создадим систему боя для RPG персонажа — классический пример, который объединяет структуры, методы, конструкторы и взаимодействие объектов в чистом модульном дизайне.

Вы организуете свой код в трех файлах:

  • character.h: Определите структуру Character с двумя целочисленными полями: health и damage. Объявите прототипы функций для создания персонажа, выполнения атаки, проверки, жив ли персонаж, и вывода статуса персонажа.
  • character.c: Реализуйте систему персонажей:
    • create_character — принимает начальные значения здоровья и урона, выделяет память для Character в куче, инициализирует его поля и возвращает указатель
    • attack — принимает два указателя на Character (атакующий и цель), уменьшает здоровье цели на величину урона атакующего
    • is_alive — принимает константный указатель на Character и возвращает 1, если здоровье больше 0, иначе возвращает 0
    • print_status — принимает константный указатель на Character и выводит здоровье персонажа в формате Health: X
    • free_character — освобождает выделенную память
  • main.c: Создайте симуляцию битвы! Считайте четыре целых числа, представляющих: здоровье героя, урон героя, здоровье врага и урон врага. Создайте обоих персонажей, используя ваш конструктор. Затем симулируйте раунды боя — герой атакует первым, затем враг атакует (если он еще жив). Продолжайте, пока один из персонажей не падет. После каждого раунда выводите статус обоих персонажей (сначала героя, затем врага). Когда битва закончится, выведите либо Hero wins!, либо Enemy wins! в зависимости от того, кто выжил. Не забудьте освободить память обоих персонажей.

Ваша программа получит четыре входных значения:

  1. Начальное здоровье героя
  2. Урон героя за атаку
  3. Начальное здоровье врага
  4. Урон врага за атаку

Пример вывода, когда входные данные равны 50, 20, 30, 15:

Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!

Пример вывода, когда входные данные равны 20, 5, 100, 25:

Health: -5
Health: 95
Enemy wins!

Не забудьте использовать include guards в заголовочном файле. Функция attack демонстрирует, как один объект может изменять внутреннее состояние другого — ключевая концепция объектно-ориентированного проектирования. Используйте указатели const соответствующим образом для функций, которые только читают данные.

Попробуйте сами

#include <stdio.h>
#include "character.h"

int main() {
    // Считать входные значения
    int hero_health, hero_damage, enemy_health, enemy_damage;
    scanf("%d", &hero_health);
    scanf("%d", &hero_damage);
    scanf("%d", &enemy_health);
    scanf("%d", &enemy_damage);
    
    // TODO: Создать персонажей героя и врага, используя create_character
    
    // TODO: Симулировать раунды боя
    // — Герой атакует первым
    // — Враг атакует, если он еще жив
    // — Выводить статус обоих персонажей после каждого раунда (сначала героя, затем врага)
    // — Продолжать до тех пор, пока один из персонажей не падет
    
    // TODO: Вывести победителя ("Hero wins!" или "Enemy wins!")
    
    // TODO: Освободить память обоих персонажей
    
    return 0;
}

Все уроки раздела Object Oriented Programming