Menu
CoddyTech

RPG 角色

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 58 课,共 61 课。

challenge icon

挑战

简单

让我们构建一个RPG 角色战斗系统:这是一个经典示例,将结构体、方法、构造函数和对象交互整合到简洁的模块化设计中。

你会将代码组织到三个文件中:

  • character.h:定义一个包含两个整数属性的 Character 结构体:health 和 damage。声明用于创建角色、执行攻击、检查角色是否存活以及打印角色状态的函数原型。
  • character.c:实现你的角色系统:
    • create_character:接收初始生命值和伤害值,在堆上分配一个 Character,初始化其属性,并返回一个指针
    • attack:接收两个 Character 指针(攻击者和目标),将目标的生命值减去攻击者的伤害值
    • is_alive:接收一个指向 const Character 的指针,如果生命值大于 0,则返回 1;否则返回 0
    • print_status:接收一个指向 const Character 的指针,并按 Health: X 格式打印角色的生命值
    • free_character:释放已分配的内存
  • main.c:创建一场战斗模拟!读取四个整数,分别表示:英雄的生命值、英雄的伤害值、敌人的生命值和敌人的伤害值。使用你的构造函数创建两个角色。然后模拟战斗回合,每回合由英雄先攻击,再由敌人反击。如果英雄的攻击使敌人的生命值降至 0 或更低,敌人就会被击败,并且本回合不会反击。持续战斗,直到有一个角色倒下。每回合结束后,打印两个角色的状态(先英雄,后敌人)。战斗结束时,根据存活者打印 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 在线编译器