王梓嘉琪 孫煉
摘要:回合制游戲也是一款需要講究策略的游戲。在回合制游戲的設計中,需考慮玩家角色的各大方面,是否設計合理也是玩家體驗感好的關(guān)鍵原因。文章利用面向?qū)ο笏枷耄肅++語言對基本回合制游戲進行設計與實現(xiàn),用繼承與多態(tài)解決關(guān)鍵性設計問題。
關(guān)鍵詞:面向?qū)ο?C++;繼承;多態(tài)
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2022)16-0095-02
1 引言
在競技類游戲火爆全球的時候,有一款名叫《夢幻西游》的回合制游戲占據(jù)了全球游戲排行榜的第三名,說明回合制游戲也并非想象的那么簡單。回合制游戲就像是下棋,操作簡單,可每一步都需思考,沒有激烈的戰(zhàn)斗,但玩家可以體驗到“智斗”的樂趣。本文通過C++對簡單回合制游戲的設計和編寫,更加深入地理解C++的應用以及回合制游戲的基本原理。
2 系統(tǒng)設計
2.1 游戲總體分析
本文將設計一款基礎簡單的回合制游戲《Combat》。游戲中有2個軍團,每個軍團默認人數(shù)各有3人,人物角色分別為:戰(zhàn)士、巫師、法師,每個角色均可對敵方成員進行任意的攻擊,均可獲得經(jīng)驗值及恢復生命力等。最開始任意指定一方進行攻打?qū)Ψ剑S后雙方輪流進行攻打,若第一回合未決出勝負,則開始下一回合,直到?jīng)Q出勝負。當敵方所有成員均滅亡時才判為勝利。
2.2 角色設計
Soldier戰(zhàn)士:
1)屬性:最大生命max HP、當前生命HP、最大體力maxima、當前體力SP、攻擊力damage、經(jīng)驗exp、等級level、姓名name、藥瓶數(shù)量drugNum。
2)動作:決策makeDecision、攻擊attack、休息rest、吃藥takingDrug。
Wizard巫師:
1)屬性:有戰(zhàn)士的所有屬性外加最大魔法值maxMp、當前魔法值MP。
2)動作:決策makeDecision、攻擊attack、休息rest、吃藥takingDrug、魔法攻擊wizard_attack(名稱與戰(zhàn)士相同但操作不同)。
Master大師:
1)屬性:新增屬性有maxNp、當前內(nèi)力NP,其余與戰(zhàn)士和巫師一樣。
2)動作:決策makeDecision、攻擊attack、休息rest、吃藥takingDrug、魔法攻擊wizard_attack、絕殺攻擊master_attack(名稱一樣但操作不同)。
WarSystem戰(zhàn)斗系統(tǒng):
1)屬性:軍團設置(軍團A、軍團B)。
2)動作:戰(zhàn)斗開始startWar、回合開始startRound。
2.3 編程語言及設計環(huán)境
選擇用C++語言實現(xiàn)。C++是C語言的繼承,它既可以進行C語言的過程化程序設計,又可以進行以抽象數(shù)據(jù)類型為特點的基于對象的程序設計,還可以進行以繼承和多態(tài)為特點的面向?qū)ο蟮某绦蛟O計。C++擅長面向?qū)ο蟪绦蛟O計的同時,還可以進行基于過程的程序設計。C++不僅擁有計算機高效運行的實用性特征,同時還致力于提高大規(guī)模程序的編程質(zhì)量與程序設計語言的問題描述能力。
選擇利用Dev-C++進行編譯。Dev-C++(或者叫作 Dev-Cpp)是 Windows 環(huán)境下的一個輕量級 C/C++ 集成開發(fā)環(huán)境(IDE)。它是一款自由軟件,遵守GPL許可協(xié)議分發(fā)源代碼。它集合了功能強大的源碼編輯器、MingW64/TDM-GCC 編譯器、GDB 調(diào)試器和 AStyle 格式整理器等眾多自由軟件,適合于在教學中供 C/C++語言初學者使用,也適合于非商業(yè)級普通開發(fā)者使用。
2.4 設計思路
程序最終不展示動畫,利用文字展示出雙方戰(zhàn)績及戰(zhàn)況。
1)玩家視角:
首先展示初始界面,提示玩家可進行相關(guān)準備。
可為A、B軍團分別設置其戰(zhàn)士、巫師、大師的名字。
隨后玩家可看見A、B軍團初始情況。
回合開始開啟任意值抽取來決定哪一方先開始決策且先開始的一方血瓶數(shù)減少。
不同的決策會有不同顯示結(jié)果,每次決策后對雙方的影響將在選擇決策并完成后顯示。
每一回合結(jié)束后,界面會顯示每方各自角色的情況及傷亡情況。
若回合結(jié)束未決出勝負,進行下一輪對戰(zhàn),新回合開始仍然以隨機數(shù)決定哪一方先進行決策。
循環(huán)回合操作直到?jīng)Q出勝負。
玩家每回合進行決策,思考可對敵方進行最大傷害且可以保護自己和團隊的最佳方式,只有每回合的最開始為隨機挑選首發(fā)決策方,其余時候為雙方輪流決策,而非自動回合制系統(tǒng)。
2)程序設計核心思路:
游戲?qū)崿F(xiàn)的重點與難點是實現(xiàn)各角色間的互動,如何更正確、更便捷地區(qū)分各軍團的各角色。
采取面向?qū)ο笤O計的思想,將三大角色(戰(zhàn)士、巫師、大師)以及戰(zhàn)斗系統(tǒng)用類劃分,而非自頂而下的結(jié)構(gòu)化方式。
其中戰(zhàn)士類可作為三大角色類的父類,其他兩個分別為直接繼承和間接繼承。而兩個子類中有與父類相同名稱的函數(shù),則需進行重寫,而在父類中此函數(shù)設為虛函數(shù),可實現(xiàn)多態(tài)。
為更好實現(xiàn)角色的指向互動,在戰(zhàn)斗系統(tǒng)類中,將戰(zhàn)士類作為整個軍團的指揮,指向整個軍團,可以直接帶出剩余的兩個角色,利用對象的雙重指針即可。
3 算法分析與實現(xiàn)
3.1 主函數(shù)main()中核心代碼
主函數(shù)中定義基本變量,產(chǎn)生最初隨機數(shù)判斷優(yōu)先決策方,調(diào)用戰(zhàn)斗系統(tǒng)類函數(shù)觸發(fā)回合開始。
主函數(shù)中實現(xiàn)對各角色的定義,及軍團的指向的代碼:
Soldier a0,b0;
Wizard a1,b1;
Master a2,b2;
Soldier *A[3], *B[3];
A[0]=&a0;
A[1]=&a1;
A[2]=&a2;
B[0]=&b0;
B[1]=&b1;
B[2]=&b2;
主函數(shù)與戰(zhàn)斗系統(tǒng)類對象的聯(lián)系實現(xiàn)代碼如下:
WarSystem fight1(A,B);
主函數(shù)實現(xiàn)初始隨機數(shù)產(chǎn)生代碼如下:
srand((unsigned)time(NULL));
for(i=0; i<1; i++)
{
random=1+ rand() % 2;
}
若隨機數(shù)為1則A軍團先開始,為2則B軍團先開始
3.2 戰(zhàn)斗系統(tǒng)類WarSystem中核心代碼
戰(zhàn)斗系統(tǒng)類中函數(shù)可實現(xiàn)互動機制以及判斷勝負機制。
戰(zhàn)斗系統(tǒng)類聲明代碼:
class WarSystem{
private:
Soldier **pgroupA;
Soldier **pgroupB;
public:
int anygrouplose(Soldier **A,Soldier **B);//判斷是否被打敗
void startwar(int i,ofstream&ofs);//i為初始隨機數(shù)
void startround(Soldier **A,Soldier **B);
WarSystem(Soldier **A,Soldier **B);//構(gòu)造函數(shù),參數(shù)分別指向各自軍團
~WarSystem();
};
startround函數(shù)定義代碼:(實現(xiàn)兩軍團的互動)
void WarSystem::startround(Soldier **A,Soldier **B)
{
int i;
for(i=0;ifellownum;i++)
{
if(A[i]->getHP()>0)
A[i]->makeDecision(B);//核心代碼
}
return;
}
3.3 戰(zhàn)士類Soldier(父類)
戰(zhàn)士類作為三大角色類的父類,其中有些函數(shù)需定義為虛函數(shù)實現(xiàn)多態(tài)。
戰(zhàn)士類中核心核心成員聲明代碼如下:
virtual void makeDecision(Soldier **enemy);//決定對對方的哪個角色進行攻擊
void attack(Soldier **enemy);
virtual void rest();? ? //注意virtual關(guān)鍵字是為了實現(xiàn)多態(tài)
virtual void show(ofstream&ofs);//界面顯示
virtual void setname();
3.4 巫師類Wizard(繼承戰(zhàn)士類)
巫師從戰(zhàn)士繼承下的同名函數(shù)需重寫,完成不同操作。
巫師類中核心成員聲明代碼如下:
virtual void makeDecision(Soldier** enemy);//巫師角色的決策
virtual void rest();//巫師角色的休息
void Wizard_attack(Soldier** enemy);
void attack(Soldier **enemy);
virtual void show(ofstream&ofs);
void setname();
3.5 大師類Master(從巫師類繼承)
大師類中核心成員聲明代碼如下:
void Master_attack(Soldier **enemy);
void attack(Soldier **enemy);
void Wizard_attack(Soldier **enemy);
void makeDecision(Soldier** enemy);//大師類的決策,仍可實現(xiàn)多態(tài)
void rest();
void show(ofstream& ofs);
void setname();
4 測試與驗證
通過程序測試可以檢測程序有無編譯上和邏輯上的漏洞。
程序編寫期間,不確定是否實現(xiàn)基本需求時,可以設置斷點進行調(diào)試。編寫核心類WarSystem類時,在startround函數(shù)處設置斷點,查看是否實現(xiàn)軍團互動,經(jīng)測試知軍團互動實現(xiàn)代碼無誤。
程序編寫全部完成后,進行最后的測試驗證。經(jīng)測試,首先進入對兩軍團的命名,隨后進入戰(zhàn)斗系統(tǒng)類中對軍團進行初始化,隨機數(shù)判斷機制無誤,回合正式開始,軍團輪流決策機制無誤,每回合戰(zhàn)況統(tǒng)計無誤。
經(jīng)過最終測試,本程序通過編譯后邏輯上目前未發(fā)現(xiàn)大問題,且運行結(jié)果界面顯示與預期一致。
5 結(jié)束語
本文基于C++對基礎回合制游戲進行設計與實現(xiàn)。設計過程中遇到的問題主要為如何設計兩軍中各角色的交替對戰(zhàn)與互動,利用繼承與多態(tài)實現(xiàn)了這一需求。結(jié)果表明,程序最終的界面結(jié)果展示與預期結(jié)果一致,邏輯上無大漏洞。
參考文獻:
[1] 譚浩強.C++程序設計[M].3版.北京:清華大學出版社,2015.
[2] 萬坤,蘇雪蓮,冉瑞生.基于C/S架構(gòu)的五子棋游戲軟件的設計與實現(xiàn)[J].電腦知識與技術(shù),2019,15(22):94-96,102.
[3] 朱悅.基于UE4的射擊類手機游戲系統(tǒng)的設計與實現(xiàn)[D].武漢:華中科技大學,2018.
[4] 王斌,遲凱,林曉慧.淺談游戲制作[J].計算機產(chǎn)品與流通,2019(5):273.
[5] 孫志軒.從C++的角度分析手機游戲《Fate Grand Order》中的攻擊模式[J].家庭生活指南,2018(7):58.
【通聯(lián)編輯:李雅琪】