一款基於控制台的文字角色扮演遊戲,約 1174 行代碼,採用模塊化頭文件劃分職責。雖為早期練習作,但清晰展示了「面向對象在 C++ 中的工程化實踐」:單一職責、依賴倒置、靜態成員管理全局狀態。

| 頭文件 | 類名 | 核心職責 | 關鍵數據/接口 |
|---|---|---|---|
Character.h | Character | 玩家屬性、裝備、背包、金錢、經驗 | 靜態屬性變量;display()、view_properties()、show() |
Enemy.h | Enemy | 普通怪物與 BOSS 屬性配置 | set(name)、display();靜態 e_hp/att/def、boss_* |
Fighting.h | Fighting | 戰鬥邏輯、傷害計算、對話顯示、隨機數 | display(mode)、hurt()、d_speed()、random() |
Blacksmith.h | Blacksmith | 鐵匠鋪:武器強化、前綴附魔 | display() |
Select.h | Select | 主選單:進入戰鬥/鐵匠鋪/屬性/退出 | display() |
Wait.h | Wait | 「大腳丫」等待動畫(過場特效) | display(time) |
// Character.h 片段
class Character {
static int money, lv, exp_max, exp_min;
static int life_max, life_min, magic_max, magic_min;
static double b_attack, attack, b_defense, defense;
static string name, b_weapons_name, b_prefix_name, b_clothes_name;
static int b_weapons, b_prefix, b_clothes;
// 庫存
static string weapons_name[5]; static int weapons[5];
static string prefix_name[4]; static int prefix[4];
// ...
};
避免了全局變量污染命名空間,邏輯上屬於「玩家唯一實例」。
friend 打破封裝實現跨模塊協作
// Character.h
friend void Fighting::display(string); // 戰鬥需讀寫玩家屬性
friend void Fighting::hurt(string); // 傷害結算
friend void Blacksmith::display(); // 強化修改裝備屬性
friend void Select::display(); // 主選單顯示狀態
// Enemy.h
friend void Fighting::display(string);
friend void Fighting::hurt(string);
雖違純 OOP 原則,但在小型控制台項目中極大簡化了參數傳遞,屬實用主義取捨。
Select 僅前向聲明或包含 Fighting/Blacksmith,調用其靜態 display()。Wait 作為純工具類,被 Fighting/Blacksmith 調用,無反向依賴。
#ifndef ONE // Character.h
#define ONE
// ...
#define ONE
#endif
每個頭文件獨立宏名(ONE、ONE1…),防止重複包含。
Select/Fighting/Blacksmith 封裝為狀態類,主循環驅動狀態轉換。windows.h(Sleep、system("cls")),用 ANSI 轉義序列或 ncurses/PDCurses 適配 Linux。rand() 為 <random> 引擎(mt19937 + 分佈)。這組頭文件雖樸素,卻完整演示了「高內聚、低耦合」在 C++ 控制台遊戲中的落地:每個類單一職責、靜態成員承載領域狀態、friend 精準開放協作接口、宏防衛保障編譯衛生。對於初學者,是從「寫在 main 裏」走向「模塊化工程」的優秀範本。