C++:ゲームロジックエンジンを開発する


ゲームを開発するのは難しいかもしれませんが、C++の助けで、もっと簡単になります.ゲームを開発するベテランなら、Unityエンジンを知っているはずです.このエンジンは論理的なサポートだけでなく、UIのサポートも提供しています.いわば五臓そろっている.しかし、私たちもゲームエンジンを開発したいと思っています.実現できる.でも・・・今日は私たちの主役は純粋な論理エンジンです.つまり、論理(つまり機能)のサポートをし、UIのサポートをしないという意味です.よし、これ以上は言わないで、急いで本題に入りましょう.
CかC++のどちらかを選択します
C++に偏っている人が多いかもしれません.C++の機能は明らかにCよりずっと強いからです.およびC++のオブジェクト向け.△この点はとても重要です.C++のオブジェクト指向が重要といえる.どうしてですか.1つの例「秒理解」:
//C
#include 
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 
#include 
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 
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を見ることができるように、関数を使って修正しなければなりません.(私は難しすぎると言っています)
ガード値
防御値も重要!100 HP、50 DV、20 AGGがあれば.相手は100 HP、0 DV、50 AGGを持っていますが、誰が勝って誰が負けたと思いますか?もちろん君が勝ったんだよ.あなたの50 DVは相手の攻撃力(AGG)を完全に免疫しているので、ゲームの合理性を保証するために、開発者の皆さんはエンジンを使うときに必ずこのDVの設定に注意することをお勧めします(暴撃で盾を打ち抜くことができますが......)いいでしょう.くだらないことは言わないで、コードをつけます.
void set_dv(double setdv){
     
		dv=setdv;
		if(debug){
     
			cout<<"   "<<name<<"        "<<dv<<endl;
		}
	}

はははは、またDebugで、とても无言だと感じますか?
カスタムBUFF
上には2つのBUFFがあります.1つのbuffと1つのプレイヤーです.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~~
プリセット
ゲーム開発者がエンジンをテストできるように、3つのキャラクタプリセットを用意しました.
No.1 Swordsman
No.2 Archer
No.3 giant

(PS:Google翻訳やっぱり香)この3つのプリセットは肯定的に関数を設定します!
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; //    False
			if(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、申し訳ありません!