Menu
CoddyTech

RPG-персонаж

Часть раздела Объектно-ориентированное программирование путешествия по 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: 35
Health: -10
Hero wins!

Пример вывода при входных значениях 20, 5, 100, 25:

Health: -5
Health: 95
Enemy wins!

Не забудьте использовать защиту от повторного включения в заголовочном файле. Функция 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;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C