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