RPG 角色
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 58 课,共 61 课。
挑战
简单让我们构建一个RPG 角色战斗系统:这是一个经典示例,将结构体、方法、构造函数和对象交互整合到简洁的模块化设计中。
你会将代码组织到三个文件中:
character.h:定义一个包含两个整数属性的Character结构体:health和damage。声明用于创建角色、执行攻击、检查角色是否存活以及打印角色状态的函数原型。character.c:实现你的角色系统:create_character:接收初始生命值和伤害值,在堆上分配一个 Character,初始化其属性,并返回一个指针attack:接收两个 Character 指针(攻击者和目标),将目标的生命值减去攻击者的伤害值is_alive:接收一个指向 const Character 的指针,如果生命值大于 0,则返回 1;否则返回 0print_status:接收一个指向 const Character 的指针,并按Health: X格式打印角色的生命值free_character:释放已分配的内存
main.c:创建一场战斗模拟!读取四个整数,分别表示:英雄的生命值、英雄的伤害值、敌人的生命值和敌人的伤害值。使用你的构造函数创建两个角色。然后模拟战斗回合,每回合由英雄先攻击,再由敌人反击。如果英雄的攻击使敌人的生命值降至 0 或更低,敌人就会被击败,并且本回合不会反击。持续战斗,直到有一个角色倒下。每回合结束后,打印两个角色的状态(先英雄,后敌人)。战斗结束时,根据存活者打印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;
}
面向对象编程中的所有课
自己练习: C 在线编译器