RPG-персонаж
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 58 из 61.
Задание
ЛегкоДавайте создадим систему боя для RPG персонажа — классический пример, который объединяет структуры, методы, конструкторы и взаимодействие объектов в чистом модульном дизайне.
Вы организуете свой код в трех файлах:
character.h: Определите структуруCharacterс двумя целочисленными полями:healthиdamage. Объявите прототипы функций для создания персонажа, выполнения атаки, проверки, жив ли персонаж, и вывода статуса персонажа.character.c: Реализуйте систему персонажей:create_character— принимает начальные значения здоровья и урона, выделяет память для Character в куче, инициализирует его поля и возвращает указательattack— принимает два указателя на Character (атакующий и цель), уменьшает здоровье цели на величину урона атакующегоis_alive— принимает константный указатель на Character и возвращает 1, если здоровье больше 0, иначе возвращает 0print_status— принимает константный указатель на Character и выводит здоровье персонажа в форматеHealth: Xfree_character— освобождает выделенную память
main.c: Создайте симуляцию битвы! Считайте четыре целых числа, представляющих: здоровье героя, урон героя, здоровье врага и урон врага. Создайте обоих персонажей, используя ваш конструктор. Затем симулируйте раунды боя — герой атакует первым, затем враг атакует (если он еще жив). Продолжайте, пока один из персонажей не падет. После каждого раунда выводите статус обоих персонажей (сначала героя, затем врага). Когда битва закончится, выведите либоHero wins!, либоEnemy wins!в зависимости от того, кто выжил. Не забудьте освободить память обоих персонажей.
Ваша программа получит четыре входных значения:
- Начальное здоровье героя
- Урон героя за атаку
- Начальное здоровье врага
- Урон врага за атаку
Пример вывода, когда входные данные равны 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
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга