开发一款游戏也许看起来十分困难,但在C++的帮助下,将会变得更加简单。
如果你是一个开发游戏的老手,应该知道Unity引擎。这个引擎不但提供了逻辑的支持,还提供了UI的支持。可以说的五脏俱全。
但是,我们也想开发一个游戏引擎。可以实现。但是……
今天我们的主角是纯逻辑引擎,意思就是说,给与逻辑(也就是功能)的支持,不给予UI的支持。
好了,不要说这么多了,赶紧进入正题吧!

选用C还是C++

也许很多人更偏向C++。因为C++的功能明显比C强很多。以及C++的面向对象。(这点十分重要!)
C++的面向对象可以说是至关重要。为什么呢?一个例子“秒懂”:

//C
#include <stdio.h>
int main(){int player1_hp=100,player1_agg=50;int player2_hp=120,player2_agg=20;printf("player1攻击了player2");player1_hp-=player2_agg;printf("%d",player1_hp);return 0;
}

而C++:

//C++
#include <iostream>
#include <string>
using namespace std;
class Player{public:string name="无名氏";double hp=100.00;double agg=50.00;double dv=20.00;void agg_to(double *hp,double *dv){*hp-=agg-*dv;}
};
int main(){Player Player1;Player Player2;Player2.hp=120.00;Player1.agg_to(&Player2.hp,&Player2.dv);cout<<Player2.hp<<endl;
}

C++的指针以及面向对象给了我们很好的开发方法。我们利用这些新特性,可以更快、更好的开发游戏逻辑引擎!

项目声明

版权归本人所有,未经允许不可转载。
不可用于商业用途,可联系作者购买版权并用于商业。

项目开发过程

纠结症必看

我们采用的是dev-cppIDE开发环境。其实我觉得已经足够了。如果用vs怕磁盘爆掉,用codeblock怕不熟练。想来想去最后还是决定使用dev-cpp,各位可以使用也可以自选。

开始开发

我们新建一个项目,新建一个文件(game.h),准备开始开发:

#include <iostream>
using namespace std;

先将这个基础打好后,我们再来写一个class:

class Player{public:/* 特别注意 *//* 部分设置不能直接使用Player.xxx=xxx更改!需要使用指定函数!不然会导致一些连锁作用无法执行! */string name="Guest";  //角色名 可用Player.name=xxx更改 double hp=0; //生命值  必须使用Player.set_hp设置,如需减少需使用Player.reduce_hp减少指定数值,增加需使用Player.plus_hp增加 double dv=0; //防御值 必须使用Player.set_dv设置,当触发攻击时自动运算并修改 string buff="无BUFF"; //New! 你可以设置Buff来让角色更加强大 此选项供开发者自行调用,可使用Player.buff=xxx double agg=0; //攻击力 必须使用Player.set_agg设置,会自动修改 double chp=0; //暴击力 必须使用Player.set_chp设置,会自动修改 double scp=0; //超级暴击伤害力 必须使用Player.set_scp设置,会自动修改 /* 接下来是特殊属性 */ double power=0; //力气,让角色的攻击力、暴击力通过力气提升 必须使用Player.set_power修改 double endurance=0; //耐力,耐力越高,生命值以及暴击伤害越高 必须用Player.set_endurance 修改 double agile=0; //敏捷力。如果敏捷力高,角色可以更高概率躲避暴击 必须用Player.set_agile double intelligence=0; //智力。如果智力高,敏捷力、耐力都会随之变高。 必须用Player.set_intelligence/* 如需初始化特殊属性,可直接用Player.xxx=xxx修改 *//* 预设 */int player=0; //需使用Player.set_player(X)设置,可选:1:剑士 2:弓箭手 3:巨人int player_buff=0; //使用Player.set_player_buff(X)设置,可选:1:神清气爽(耐力、力气、智力、敏捷力提高10)2:大快朵颐(通常在食用某种食品后,智力、耐力提高50) /* 详细设置 */double dwa=0; //收到攻击时的额外伤害,可直接修改,可用于特殊关卡double ms=0; //移速,可直接修改,供自行调用int chr=0;//暴击可能性(1 几率小 2 随机 3 几率大),需使用Player.set_chr(X)设置/* 自定义高级参数 */bool obm=false; //是否打开“荆棘模式”(伤害反弹) 需使用Player.set_obm(True or False)bool survival=true; //是否存活。需使用Player.set_survival(True or False)设置bool debug=false; //角色是否开启Debug.需使用Player.set_debug(True or False)设置/* 坐标 */ double x=0; //坐标X,供2D/3D游戏定位使用 ,直接修改 double y=0; //坐标Y ,供2D/3D游戏定位使用 ,直接修改 double z=0; //坐标Z,,供3D游戏定位使用,直接修改 /* 等级系统 */int lv=1; //等级 可直接修改,但不会有属性提升。需要使用upgrade升级

这些基本的功能我们都必须要实现。否则这个逻辑引擎将会没有意义。本引擎可用于很多开发用途,自选。
既然框架已经打好了,接下来,便是一个个完成功能了!

生命值

生命值是游戏里很关键的一部分。(缩写hp)它用来判断这个角色的存活,以及这个角色的——用最简单的网络用语来说,就是“血厚不厚”。
生命值越高,不一定能决定胜负。假设你的生命值500,对方100,但是你攻击力10,它攻击力100,这简直不能比,对不对?
既然生命值这么重要,我们就来开发第一个功能:生命值设置、减少、增加。
也许你很奇怪,为啥不直接Player.hp=xxx?
因为我们还得加上一些“连锁反应”!

void set_hp(double sethp){hp=sethp;if(debug){cout<<"设置了角色"<<name<<"的生命值为"<<hp;}}     void reduce_hp(double reducehp){hp-=reducehp;if(debug){cout<<"将角色"<<name<<"的生命值减去了"<<reducehp<<endl;}}void plus_hp(double plushp){hp+=plushp;if(debug){cout<<"将角色"<<name<<"的生命值增加了"<<plushp<<endl;}}

细心地朋友发现了,之前有一个debug选项。没错,为了让开发者可以看到debug,不得不让他们使用函数修改。(我表示我太难了)

防御值

防御值也十分重要!如果你有100HP,50DV,20AGG。而对方有100HP,0DV,50AGG,你猜猜,谁赢谁输?
当然是你赢啊!因为——你的50DV完全免疫了对方的攻击力(AGG)。
所以,为了保证游戏合理性,推荐各位开发者在使用引擎时务必注意这个DV的设置(虽然有时候有暴击可以把盾打穿,但……)
好吧,废话不多说,上代码。

void set_dv(double setdv){dv=setdv;if(debug){cout<<"将角色"<<name<<"的防御值设置为了"<<dv<<endl;}}

哈哈哈,又是Debug,是不是感觉很无语?

自定义BUFF

上面有两个BUFF——一个buff和一个player_buff。这两个有什么不同?仔细阅读注释,你应该会恍然大悟。
buff值供开发者自行调用(例如自己编写一个BUFF特性),而player_buff存储了一些已经写好的buff特效,供开发者调用。
buff这个单词,其实很早就出现了。如果你敲上fanyi.baidu.com,一搜……浅黄色!
呵呵,其实不是这个意思。这个词主要是在网络上经常出现。意思就是一种技能。获取后可以加强某些参数(例如agg)
好了,也不废话了,上代码!
唉唉,搞错了搞错了,注释后面写了直接调用[笑],真是糊涂了。

攻击力

“一寸攻击一寸金,寸金难买VIP”这句话最近在我身边朋友口中疯传(我说的……)。哈哈,这句话很好的说明了攻击力的作用。攻击力越高,取胜可能性越大。但也要结合DV、HP来进行分析(我听到有人说hp是*普,不是不是)(我又听到有人说我做植入广告,不是的啦!)
好了,接下来,上代码!

void set_agg(double setagg){agg=setagg;if(debug){cout<<"将角色"<<name<<"的攻击力设置为了"<<agg<<endl;}}

emmm……继续debug……

CHP AND SCP:暴击力 And 超级暴击力!

暴击力其实没啥用(我玩游戏从来不看暴击……),为什么?因为暴击顶多多几个伤害,但却可能性非常小。
“风吹马尾千条线,暴击完全不兑现。”这句话也许也是挺………………但是也可以体现出暴击的不重要性(偷笑)。
好了,上代码!

void set_chp(double setchp){chp=setchp;if(debug){cout<<"将角色"<<name<<"的暴击力设置为了"<<agg<<endl;}}void set_scp(double setscp){scp=setscp;if(debug){cout<<"将角色"<<name<<"的超级暴击力设置为了"<<scp<<endl;}}

哈哈,继续Debug,嘚嘚~

特殊选项

玩游戏经常有一些特殊选项。例如肚子饿不饿啊,力气足不足啊,精力咋样啊,这些都是很常见的。所以,我们不得不实现。
code!

void set_power(double setpower){power=setpower;agg+=setpower*5;chp+=setpower*5;if(debug){cout<<"将角色"<<name<<"的力气设置为了"<<power<<endl;}}void set_endurance(double setendurance){endurance=setendurance;hp+=setendurance*10;chp+=setendurance*5;if(debug){cout<<"将角色"<<name<<"的耐力设置为了"<<endurance<<endl;}}void set_agile(double setagile){agile=setagile;if(debug){cout<<"将角色"<<name<<"的敏捷力设置为了"<<agile<<endl;}}void set_intelligence(double setintelligence){intelligence=setintelligence;set_agile(agile+setintelligence*5);set_endurance(endurance+setintelligence*8);if(debug){cout<<"将角色"<<name<<"的智力设置为了"<<intelligence<<endl;}}

哇塞,除了debug外终于来新人了,好Happy~~

预设

为了让游戏开发者可以先测试一下引擎,我们准备了三个角色预设:

No.1 Swordsman
No.2 Archer
No.3 giant

(PS:Google翻译果然香)
这三个预设肯定得函数设置的啦!

void set_player(int player){if(player==1){// 默认角色:剑士 set_hp(100.00);set_agg(15.05);set_dv(5.25);name="剑士";}else if(player==2){// 默认角色:弓箭手set_hp(80.00);set_agg(22.00);set_dv(5.00);name="弓箭手"; }else{// 默认角色:巨人 set_hp(500.50);set_agg(25.05);set_dv(0); name="巨人";}}

接着,就是我们的自带BUFF:

void set_player_buff(int buff){if(debug){cout<<name<<"的系统自带BUFF被改为参数:"<<buff<<endl;}if(buff==1){// 神清气爽set_agile(agile+10);set_endurance(endurance+10);set_intelligence(intelligence+10);set_power(power+10);}else if(buff==2){// 大快朵颐 set_endurance(endurance+50);set_intelligence(intelligence+50);}else if(buff==-1){// 恢复神清气爽buff之前的状态set_agile(agile-10);set_endurance(endurance-10);set_intelligence(intelligence-10);set_power(power-10);}else if(buff==-2){// 恢复大快朵颐set_endurance(endurance-50);set_intelligence(intelligence-50);}}

高级特性

一把上代码吧:

int set_chr(int setchr){// 1 非常小 2 随机 3 很大chr=setchr;return 1;}void set_obm(bool setobm){obm=setobm;if(debug){cout<<name<<"的OBM值被设置为了"<<obm<<endl;}}int set_survival(bool setsurvival){if(setsurvival!=true){survival=false;if(debug){cout<<name<<"的存活值被设置为了"<<setsurvival<<" 此角色已退出游戏"<<endl;}}else{survival=true;}return survival;}int set_debug(bool setdebug){if(setdebug){debug=true;}return 1;}int ua(Player aPlayer){// 角色被攻击// aPlayer>攻击角色的另一个角色if(survival && aPlayer.survival){double za=0; //最后受到的攻击力za+=aPlayer.agg;za-=dv;za-=rand()%5;if(za<=0){if((rand()%5)==1){return -1; //-1代表免疫了 }// 有几率免疫,如果没有免疫,就将攻击力提升za+=aPlayer.agg;za-=dv;za-=rand()%3;if(za<=0){// 实在无法计算,返回-2,说明比赛不公平,无法进行if(debug){cout<<"太不公平了!通过护盾的抵御,攻击被瓦解!"<<endl; }return -2; } }// 设置好最后受到的攻击后 // 判断暴击与超级暴击srand((int)time(0));if(chp!=0){if(agile>10){//结束暴击 }else{if(chr==1){if(rand()%100==18){za=aPlayer.chp;}} if(chr==2){int randnum=rand()%100;if(randnum==18 || randnum==12 || randnum==48 || randnum==69 || randnum==89 || randnum==99){za=aPlayer.chp;}} if(chr==3){int randnum=rand()%100;if(randnum>50 && randnum<80){za=aPlayer.chp;}}}}int randnum2=rand()%100;if(aPlayer.scp!=0){if(randnum2==1){za=aPlayer.scp;}}if(debug){cout<<"角色"<<name<<"即将受到"<<za<<"点攻击。"<<endl;}hp-=za;if(debug){cout<<"角色"<<name<<"的血量变为"<<hp<<"点。"<<endl;}if(hp<=0){survival=false; //自动设置Falseif(debug){if(survival){cout<<name<<"在与"<<aPlayer.name<<"的作战中死了。"<<endl;}} }return 1;}else{if(debug){cout<<"角色"<<name<<"或者角色"<<aPlayer.name<<"已经死了"<<endl;}}}void print_all(){cout<<"PRINT_ALL"<<endl;/* 特别注意 *//* 部分设置不能直接使用Player.xxx=xxx更改!需要使用指定函数!不然会导致一些连锁作用无法执行! */cout<<"角色名:"<<name<<endl;  //角色名 可用Player.name=xxx更改 cout<<"生命值:"<<hp<<endl; //生命值  必须使用Player.set_hp设置,如需减少需使用Player.reduce_hp减少指定数值,增加需使用Player.plus_hp增加 cout<<"防御值:"<<dv<<endl; //防御值 必须使用Player.set_dv设置,当触发攻击时自动运算并修改 cout<<"自定义BUFF:"<<buff<<endl; //New! 你可以设置Buff来让角色更加强大 此选项供开发者自行调用,可使用Player.buff=xxx cout<<"攻击力:"<<agg<<endl; //攻击力 必须使用Player.set_agg设置,会自动修改 cout<<"暴击力:"<<chp<<endl; //暴击力 必须使用Player.set_chp设置,会自动修改 cout<<"超级暴击力:"<<scp<<endl; //超级暴击伤害力 必须使用Player.set_scp设置,会自动修改 /* 接下来是特殊属性 */ cout<<"特殊属性列表:"<<endl<<power<<endl; //力气,让角色的攻击力、暴击力通过力气提升 必须使用Player.set_power修改 cout<<endurance<<endl; //耐力,耐力越高,生命值以及暴击伤害越高 必须用Player.set_endurance 修改 cout<<agile<<endl; //敏捷力。如果敏捷力高,角色可以更高概率躲避暴击 必须用Player.set_agile cout<<intelligence<<endl; //智力。如果智力高,敏捷力、耐力都会随之变高。 必须用Player.set_intelligence/* 如需初始化特殊属性,可直接用Player.xxx=xxx修改 *//* 预设 */cout<<"预设列表:"<<endl<<player<<endl; //需使用Player.set_player(X)设置,可选:1:剑士 2:弓箭手 3:巨人cout<<player_buff<<endl; //使用Player.set_player_buff(X)设置,可选:1:神清气爽(耐力、力气、智力、敏捷力提高10)2:大快朵颐(通常在食用某种食品后,智力、耐力提高50) /* 详细设置 */cout<<"详细设置列表:"<<endl;cout<<dwa<<endl; //收到攻击时的额外伤害,可直接修改,可用于特殊关卡cout<<ms<<endl; //移速,可直接修改,供自行调用cout<<chr<<endl;//暴击可能性(1 几率小 2 随机 3 几率大),需使用Player.set_chr(X)设置/* 自定义高级参数 */cout<<"自定义高级参数:"<<endl; cout<<obm<<endl; //是否打开“荆棘模式”(伤害反弹) 需使用Player.set_obm(True or False)cout<<survival<<endl; //是否存活。需使用Player.set_survival(True or False)设置cout<<debug<<endl; //角色是否开启Debug.需使用Player.set_debug(True or False)设置/* 坐标 */ cout<<"位置:"<<endl;cout<<x<<endl; //坐标X,供2D/3D游戏定位使用 ,直接修改 cout<<y<<endl; //坐标Y ,供2D/3D游戏定位使用 ,直接修改 cout<<z<<endl; //坐标Z,,供3D游戏定位使用,直接修改 }

其他角色

既然Player对象已经完美完工了,接下来就得写其它的了。
玩游戏,你最常见……
NPC!
全部代码:

class npc{public:// NPC角色// NPC功能不够完善,见谅 string name; //名字,使用npc.name=XX修改 double hp=0; //生命值,使用npc.set_hp(X)修改 double agg=0; //攻击力,使用npc.set_agg(X)修改 double x; //坐标X,供2D/3D游戏定位使用 ,直接修改 double y; //坐标Y ,供2D/3D游戏定位使用 ,直接修改 double z; //坐标Z,,供3D游戏定位使用,直接修改string say[]; //设置说的话,游戏界面可以通过npc.say[x]获取,更便捷bool survival; //自行修改,用来在游戏里判断存活 void set_hp(double sethp){hp=sethp;}void set_agg(double setagg){agg=setagg;}
};

(PS:NPC只给了框架,没有其他的)
那么,还有……
物品!

class Prop{public:string name; //道具名称(可直接修改) string introduce;//道具介绍  (可直接修改) int prid;//道具ID(可直接修改)/* 使用道具后角色变化 */string buff="无BUFF"; //设置角色会有什么自定义buff(可直接修改)int player_buff=0; //设置角色会新增什么默认buff (直接修改)(详见player类)int power=0; //增加力气值,让角色的攻击力、暴击力通过力气提升 必须使用prop.set_power修改 int endurance=0; //增加耐力值,耐力越高,生命值以及暴击伤害越高 必须用prop.set_endurance 修改 int agile=0; //增加敏捷力值。如果敏捷力高,角色可以更高概率躲避暴击 必须用prop.set_agile int intelligence=0; //增加智力值。如果智力高,敏捷力、耐力都会随之变高。 必须用prop.set_intelligence/* 使用参数 */string use_type; //可加上你的使用类型(例如:饮料、食物、药品)int use_lv=0; //限制使用等级 void set_power(int setpower){power=setpower;}void set_endurance(int setendurance){endurance=setendurance;}void set_agile(int setagile){agile=setagile;}void set_intelligence(int setintelligence){intelligence=setintelligence;}int use(Player usePlayer){if(usePlayer.lv>=use_lv){usePlayer.buff=buff;usePlayer.player_buff=player_buff;usePlayer.set_power(usePlayer.power+power);usePlayer.set_intelligence(usePlayer.intelligence+intelligence);usePlayer.set_agile(usePlayer.agile+agile);usePlayer.set_endurance(usePlayer.endurance+endurance);if(usePlayer.debug){cout<<"角色"<<usePlayer.name<<"使用了道具"<<name<<endl;}return 1;}else{return 0;//等级不足 }}};

完毕

好了,整个项目已经完工了(取名EasyGame)
版本号:1.0.0
已经开源到Gitee:https://gitee.com/tiantian520tt/easygame/
本人11,有不足见谅!

C++:开发一个游戏逻辑引擎相关推荐

  1. 探索开发一个游戏引擎需要那些知识和技术

    探索开发一个游戏引擎需要那些知识和技术 说到游戏引擎我们可能会想到Unity3D,虚幻引擎等.可是我们对于开发一个游戏引擎了解甚微,作为一名游戏开发者在开发游戏的同时我觉得也有必要了解并熟知如何开发一 ...

  2. 如何在cocos2d-x中使用ECS(实体-组件-系统)架构方法开发一个游戏?

    引言 在我的博客中,我曾经翻译了几篇关于ECS的文章.这些文章都是来自于Game Development网站.如果你对这个架构方式还不是很了解的话,欢迎阅读理解 组件-实体-系统和实现 组件-实体-系 ...

  3. 如何开发一个游戏工作室?

    对比其他行业,游戏市场可以用庞大来形容,每年新出的游戏数不胜数.开游戏工作室要比普通的上班族,实现目标会更高一些,需要每天不断地学习一些新游戏,了解一些新游戏的设置以及技巧等,同时也要对当前的网络游戏 ...

  4. 10分钟开发一个游戏服务器

    前言   安利一个游戏服务器框架colyseus,使用起来十分简单,只需要一丢丢的代码就可以实现一个状态同步的服务器,10分钟主题,废话不多说,Let's Rock! 安装&项目设置 使用np ...

  5. 开发一个Canvas小游戏 实现一个游戏“引擎”

    前言 这个游戏其实在三四年前就写了,中间还重构过好几次,之前都是用简单的面向对象和函数式编程来写,游戏中的元素关系到还是分的挺开,但是游戏的渲染,运算等逻辑分的不够清晰,整个逻辑基本都是自顶向下的流水 ...

  6. Unity VS Unreal,游戏开发该如何选择引擎?

    一.引擎的介绍 随着游戏开发的不断进步,游戏开发越来越庞大复杂,因此游戏引擎已经成为游戏开发必不可少的工具.引擎对基本的功能封装,对工具链的提供等都可以大幅降低游戏引擎的开发难度,提高开发速度和质量. ...

  7. 一个游戏是如何被设计和开发出来的(怎样开发一款游戏)

    本专栏是着重于讨论"开发一款游戏需要怎样的能力",以及"如何学习开发游戏所需的所有技能".在开始讨论我们的两个主题之前,我认为非常有必要让初学者了解一下:一个游 ...

  8. 从零开发一个灰太狼游戏是什么样的体验?(建议收藏)

    极客江南: 一个对开发技术特别执着的程序员,对移动开发有着独到的见解和深入的研究,有着多年的iOS.Android.HTML5开发经验,对NativeApp.HybridApp.WebApp开发有着独 ...

  9. 开发H5游戏引擎的选择:Egret或Laya?

    一.H5游戏开发的引擎介绍 开发H5游戏的引擎有很多,比如egret.laya.cocos-js等等.这里主要是分析的是egret和laya,因为我们团队是从as3转过来的.所以天然地在有as3基因的 ...

最新文章

  1. 工艺技术:14nm与28nm工艺
  2. 大地震前有三个明显征兆:1.井水异常2.牲畜反应异常3.专家出来辟谣。但是细心网友指出,第三和第二重复了。...
  3. 蓝牙激光雕刻机android,迷你型激光雕刻机!私人定制随你玩
  4. 【Java线程安全】一个简单的多线程程序
  5. protocol buffers使用说明
  6. node.js ejs的视图模块引擎
  7. 事件EVENT与waitforsingleobject的使用以及Mutex与Event的区别
  8. postman启动没反应_电脑主机开机但显示器没反应?检查这4个地方,2分钟内找出问题...
  9. matlab在电磁学中的应用,MATLAB在电磁学中的应用
  10. readline库实现命令行自动补全
  11. TypeScript_学习笔记
  12. Ubuntu 16.04编译Android 7.1.2
  13. 【转载】身份证号码验证算法
  14. qc中的流程图怎么画_超级详细的QC七大工具绘制方法,手把手教你做出漂亮图表...
  15. 简简的语法3:对句子按用途进行划分
  16. sudo chmod -R 777
  17. 遭遇:“说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。”错误...
  18. [Go WebSocket] 为什么我选用Go重构Python版本的WebSocket服务?
  19. Windows下Putty使用ssh密钥对远程连接阿里云服务器
  20. 用JSSE定制SSL连接

热门文章

  1. 解决从Android studio 粘贴代码到印象笔记格式混乱的问题
  2. libpcap使用整理
  3. 基于飞凌NXP i.MX6UL实现中央空调集中器
  4. GBASE 8s中 onunloadonload
  5. 网络编程实现FTP服务器
  6. OpenDDS内部关键的idl文件(Federation)
  7. 鸿蒙hilink的关系,华为继续应用鸿蒙OS助力智能生活 HiLink生态用户超过5000万
  8. 求解:使用Antv x6引入插件出现‘ToolItem’问题
  9. 软件过程管理第一章(绪论)
  10. win7下运行linux命令,win7系统32位旗舰版iso运行linux shell脚本的操作办法