RPG-персонаж
Часть раздела Объектно-ориентированное программирование путешествия по 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: 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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C