当前位置:编程学习 > VC++ >>

(Visual C++)游戏开发笔记十六 讲解一个完整的回合制游戏demo

上一篇:http://www.zzzyk.com/kf/201204/126625.html

首先,我们来了解这种行为型AI的设计方法。

游戏程序中计算机角色的思考与行为,实际上是对各种不同事件进行分析思考,然后根据不同的情况作出相应的反应。但如何对发生的条件进行判断,并作出相应的反应呢?


对,我们可以利用“if-else”条件句以及“switch-case”语句这类的判断式来完成。

通常情况下,设计此类AI,会涉及到连串的条件判断句,简单数易做图算,及一些数据结构的知识。

下面我们就来具体讲解这个demo涉及到的一些知识点:


一、AI怪物攻击与思考方式设计

例如今天我们要展示的这个回合制游戏demo里的AI,就有如下几种行为:


(1)利爪攻击

(2)闪电链攻击

(3)致命一击

(4)使用梅肯斯姆回复生命值

(5)逃跑


那么我们可以根据以上设计的怪物行为,设计以下一段算法,用来模拟怪物对战时的思考与行为的方式


[cpp]
if(monster.nHp > 20)  //生命值大于20  

if(rand()%5!= 1)            
 //进行利爪攻击概率4/5  
else 
       //进行闪电链攻击概率1/5  

else     //生命值小于20  

switch(rand()%5) 

case 0:  //利爪攻击  
break; 
case 1:  //释放闪电链  
break; 
case 2:  //致命一击  
break; 
case 3:  //使用梅肯斯姆回复  ;  
break; 
case 4:  //逃跑  
if(1== rand()%3 )     //逃跑成功几率1/3  
//逃跑成功  
else 
//逃跑失败  
break; 


if(monster.nHp > 20)  //生命值大于20
{
if(rand()%5!= 1)          
 //进行利爪攻击概率4/5
else
       //进行闪电链攻击概率1/5
}
else  //生命值小于20
{
switch(rand()%5)
{
case 0:  //利爪攻击
break;
case 1:  //释放闪电链
break;
case 2:  //致命一击
break;
case 3:  //使用梅肯斯姆回复  ;
break;
case 4:  //逃跑
if(1== rand()%3 )     //逃跑成功几率1/3
//逃跑成功
else
//逃跑失败
break;
}
}

 

这段代码中,利用if-else判断式判断怪物生命值,然后怪物有4/5的几率释放普通的利爪攻击,有1/5的几率释放闪电链魔法攻击,当怪物重伤生命值小于20点时,也有一定的几率逃跑。


以上的利用“if-else”、“switch”语句,使计算机角色进行事件情况判断,然后写出相应的动作实现代码,这就是行为型游戏AI

设计的核心精神。

 

 

 

 

 

 


二,玩家角色攻击方式设计

 


然后我们再来设计一下玩家的攻击技能。

今天放出的这个demo里我给人物设定了两个技能,一个主动的普通攻击技能“无敌斩”,伤害计算公式为damage = rand()%10 + player.lv*player.w(player.lv为角色等级,player.w为攻击系数)。

而被动技能为可以有一定几率打出4倍暴击伤害的“恩赐解脱”,这个技能是Dota里面幻影刺客\的大招(呵呵,浅墨玩dota时可是超级幻刺控~~)。

其实暴击的实现方式很简单,就是用if条件句进行概率的判断(浅墨在这里利用4==rand( )%5来设定暴击概率为20%),如果判断成功就将“倍率x普通攻击”作为damage的值。

(哈哈,浅墨专门找到了Dota里面这两个技能的图标\以及\用到了这个demo里面,具体效果图在下面)

 

 

下面贴出实现人物技能的代码:

 


[cpp]
if (4==rand()%5)                   // 20%几率触发幻影刺客的大招,恩赐解脱,4倍暴击伤害  

damage = 4*(rand()%10 + player.lv*player.w); 
monster.nHp -= (int)damage; 
sprintf(str,"恩赐解脱触发,这下牛逼了,4倍暴击...对怪物照成了%d点伤害",damage); 
}  
else 

damage = rand()%10 + player.lv*player.w; 
monster.nHp -= (int)damage; 
sprintf(str,"玩家使用了无敌斩,伤害一般般...对怪物照成了%d点伤害",damage); 

if (4==rand()%5)                   // 20%几率触发幻影刺客的大招,恩赐解脱,4倍暴击伤害
{
damage = 4*(rand()%10 + player.lv*player.w);
monster.nHp -= (int)damage;
sprintf(str,"恩赐解脱触发,这下牛逼了,4倍暴击...对怪物照成了%d点伤害",damage);
}
else
{
damage = rand()%10 + player.lv*player.w;
monster.nHp -= (int)damage;
sprintf(str,"玩家使用了无敌斩,伤害一般般...对怪物照成了%d点伤害",damage);
}

 

 

 

 

 

三、完整的回合制游戏源代码

 

 

基础部分就讲解完了,下面就贴出注释详细的,完整的回合制游戏demo的代码吧:

 


[cpp] 
#include "stdafx.h"  
#include <stdio.h>  
 
//定义一个结构体  
struct chr 

    int     nHp; 
    int     fHp; 
    int     lv; 
    int     w; 
    int     kind; 
}; 
 
//全局变量声明  
HINSTANCE hInst; 
HBITMAP bg,sheep,girl,skill,skillult,slash,magic,recover,game; 
HDC     hdc,mdc,bufdc; 
HWND    hWnd; 
DWORD   tPre,tNow; 
int     pNum,f,txtNum; 
bool    attack,over; 
chr     player,monster; 
char    text[5][100]; 
 
 
 
 
//全局函数声明  
ATOM                MyRegisterClass(HINSTANCE hInstance); 
BOOL                InitInstance(HINSTANCE, int); 
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM); 
void                MyPaint(HDC hdc); 
void                MsgInsert(char*); 
void                CheckDie(int hp,bool player); 
 
//****WinMain函数,程序入口点函数**************************************  
int APIENTRY WinMain(HINSTANCE hInstance, 
                     HINSTANCE hPrevInstance, 
                     LPSTR     lpCmdLine, 
                     int     

补充:软件开发 , Vc ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,