基于C++的回合制战斗系统Combat的设计与实现

2022-05-30 04:37王梓嘉琪孙炼
电脑知识与技术 2022年16期
关键词:多态继承面向对象

王梓嘉琪 孙炼

摘要:回合制游戏也是一款需要讲究策略的游戏。在回合制游戏的设计中,需考虑玩家角色的各大方面,是否设计合理也是玩家体验感好的关键原因。文章利用面向对象思想,用C++语言对基本回合制游戏进行设计与实现,用继承与多态解决关键性设计问题。

关键词:面向对象;C++;继承;多态

中图分类号:TP311      文献标识码:A

文章编号:1009-3044(2022)16-0095-02

1 引言

在竞技类游戏火爆全球的时候,有一款名叫《梦幻西游》的回合制游戏占据了全球游戏排行榜的第三名,说明回合制游戏也并非想象的那么简单。回合制游戏就像是下棋,操作简单,可每一步都需思考,没有激烈的战斗,但玩家可以体验到“智斗”的乐趣。本文通过C++对简单回合制游戏的设计和编写,更加深入地理解C++的应用以及回合制游戏的基本原理。

2 系统设计

2.1 游戏总体分析

本文将设计一款基础简单的回合制游戏《Combat》。游戏中有2个军团,每个军团默认人数各有3人,人物角色分别为:战士、巫师、法师,每个角色均可对敌方成员进行任意的攻击,均可获得经验值及恢复生命力等。最开始任意指定一方进行攻打对方,随后双方轮流进行攻打,若第一回合未决出胜负,则开始下一回合,直到决出胜负。当敌方所有成员均灭亡时才判为胜利。

2.2 角色设计

Soldier战士:

1)属性:最大生命max HP、当前生命HP、最大体力maxima、当前体力SP、攻击力damage、经验exp、等级level、姓名name、藥瓶数量drugNum。

2)动作:决策makeDecision、攻击attack、休息rest、吃药takingDrug。

Wizard巫师:

1)属性:有战士的所有属性外加最大魔法值maxMp、当前魔法值MP。

2)动作:决策makeDecision、攻击attack、休息rest、吃药takingDrug、魔法攻击wizard_attack(名称与战士相同但操作不同)。

Master大师:

1)属性:新增属性有maxNp、当前内力NP,其余与战士和巫师一样。

2)动作:决策makeDecision、攻击attack、休息rest、吃药takingDrug、魔法攻击wizard_attack、绝杀攻击master_attack(名称一样但操作不同)。

WarSystem战斗系统:

1)属性:军团设置(军团A、军团B)。

2)动作:战斗开始startWar、回合开始startRound。

2.3 编程语言及设计环境

选择用C++语言实现。C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

选择利用Dev-C++进行编译。Dev-C++(或者叫作 Dev-Cpp)是 Windows 环境下的一个轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。它集合了功能强大的源码编辑器、MingW64/TDM-GCC 编译器、GDB 调试器和 AStyle 格式整理器等众多自由软件,适合于在教学中供 C/C++语言初学者使用,也适合于非商业级普通开发者使用。

2.4 设计思路

程序最终不展示动画,利用文字展示出双方战绩及战况。

1)玩家视角:

首先展示初始界面,提示玩家可进行相关准备。

可为A、B军团分别设置其战士、巫师、大师的名字。

随后玩家可看见A、B军团初始情况。

回合开始开启任意值抽取来决定哪一方先开始决策且先开始的一方血瓶数减少。

不同的决策会有不同显示结果,每次决策后对双方的影响将在选择决策并完成后显示。

每一回合结束后,界面会显示每方各自角色的情况及伤亡情况。

若回合结束未决出胜负,进行下一轮对战,新回合开始仍然以随机数决定哪一方先进行决策。

循环回合操作直到决出胜负。

玩家每回合进行决策,思考可对敌方进行最大伤害且可以保护自己和团队的最佳方式,只有每回合的最开始为随机挑选首发决策方,其余时候为双方轮流决策,而非自动回合制系统。

2)程序设计核心思路:

游戏实现的重点与难点是实现各角色间的互动,如何更正确、更便捷地区分各军团的各角色。

采取面向对象设计的思想,将三大角色(战士、巫师、大师)以及战斗系统用类划分,而非自顶而下的结构化方式。

其中战士类可作为三大角色类的父类,其他两个分别为直接继承和间接继承。而两个子类中有与父类相同名称的函数,则需进行重写,而在父类中此函数设为虚函数,可实现多态。

为更好实现角色的指向互动,在战斗系统类中,将战士类作为整个军团的指挥,指向整个军团,可以直接带出剩余的两个角色,利用对象的双重指针即可。

3 算法分析与实现

3.1 主函数main()中核心代码

主函数中定义基本变量,产生最初随机数判断优先决策方,调用战斗系统类函数触发回合开始。

主函数中实现对各角色的定义,及军团的指向的代码:

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;

主函数与战斗系统类对象的联系实现代码如下:

WarSystem fight1(A,B);

主函数实现初始随机数产生代码如下:

srand((unsigned)time(NULL));

for(i=0; i<1; i++)

{

random=1+ rand() % 2;

}

若随机数为1则A军团先开始,为2则B军团先开始

3.2 战斗系统类WarSystem中核心代码

战斗系统类中函数可实现互动机制以及判断胜负机制。

战斗系统类声明代码:

class WarSystem{

private:

Soldier **pgroupA;

Soldier **pgroupB;

public:

int anygrouplose(Soldier **A,Soldier **B);//判断是否被打败

void startwar(int i,ofstream&ofs);//i为初始随机数

void startround(Soldier **A,Soldier **B);

WarSystem(Soldier **A,Soldier **B);//构造函数,参数分别指向各自军团

~WarSystem();

};

startround函数定义代码:(实现两军团的互动)

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 战士类Soldier(父类)

战士类作为三大角色类的父类,其中有些函数需定义为虚函数实现多态。

战士类中核心核心成员声明代码如下:

virtual void makeDecision(Soldier **enemy);//决定对对方的哪个角色进行攻击

void attack(Soldier **enemy);

virtual void rest();    //注意virtual關键字是为了实现多态

virtual void show(ofstream&ofs);//界面显示

virtual void setname();

3.4 巫师类Wizard(继承战士类)

巫师从战士继承下的同名函数需重写,完成不同操作。

巫师类中核心成员声明代码如下:

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);//大师类的决策,仍可实现多态

void rest();

void show(ofstream& ofs);

void setname();

4 测试与验证

通过程序测试可以检测程序有无编译上和逻辑上的漏洞。

程序编写期间,不确定是否实现基本需求时,可以设置断点进行调试。编写核心类WarSystem类时,在startround函数处设置断点,查看是否实现军团互动,经测试知军团互动实现代码无误。

程序编写全部完成后,进行最后的测试验证。经测试,首先进入对两军团的命名,随后进入战斗系统类中对军团进行初始化,随机数判断机制无误,回合正式开始,军团轮流决策机制无误,每回合战况统计无误。

经过最终测试,本程序通过编译后逻辑上目前未发现大问题,且运行结果界面显示与预期一致。

5 结束语

本文基于C++对基础回合制游戏进行设计与实现。设计过程中遇到的问题主要为如何设计两军中各角色的交替对战与互动,利用继承与多态实现了这一需求。结果表明,程序最终的界面结果展示与预期结果一致,逻辑上无大漏洞。

参考文献:

[1] 谭浩强.C++程序设计[M].3版.北京:清华大学出版社,2015.

[2] 万坤,苏雪莲,冉瑞生.基于C/S架构的五子棋游戏软件的设计与实现[J].电脑知识与技术,2019,15(22):94-96,102.

[3] 朱悦.基于UE4的射击类手机游戏系统的设计与实现[D].武汉:华中科技大学,2018.

[4] 王斌,迟凯,林晓慧.浅谈游戏制作[J].计算机产品与流通,2019(5):273.

[5] 孙志轩.从C++的角度分析手机游戏《Fate Grand Order》中的攻击模式[J].家庭生活指南,2018(7):58.

【通联编辑:李雅琪】

猜你喜欢
多态继承面向对象
分层多态加权k/n系统的可用性建模与设计优化
参差多态而功不唐捐
面向对象的计算机网络设计软件系统的开发
面向对象的数据交换协议研究与应用
浅谈杜审言、杜甫的祖孙关系:推崇、继承、发展
面向对象Web开发编程语言的的评估方法
面向对象信息提取中影像分割参数的选择
烟碱型乙酰胆碱受体基因多态与早发性精神分裂症的关联研究