漫游(追逐)AI的实现
作为游戏开发者,要给玩家制造挑战,只要使游戏的难度有所增加,使游戏中的假想敌人像玩家一样机智,一样具有人类的智慧和应变能力。这就需要使用一种计算机专业领域新兴的一门科学
AI
(
artificial intelligence
,人工智能)。
人工智能,作为一门新兴科学,人类思维的模拟是
AI
的主要研究领域,也是难、热点之一。人类的思维是一个十分不确定性的过程,要对其精确建模十分困难。在我做的这个游戏中所使用的
AI
还很粗糙,是属于人工智能的基础性知识。游戏开发专家将和游戏相关的
AI
划分为3种基本类型:
·漫游
AI
——确定一个游戏对象如何在一个虚拟的游戏世界中漫游;
·行为
AI
——确定跟踪或追逐在一个游戏对象或多个游戏对象后面的别一个游戏对象是多么具有攻击性;
·策略
AI
——在一个策略游戏中,从一组固定的实现定义的漫游规则中确定最佳的移动。
漫游AI是射击类游戏最常见的
AI
方法,是对游戏对象建模的
AI
,也就是说,游戏对象做出决定,确定它们如何在一个虚拟世界中漫游。漫游AI的一个典型的例子就是像
Galaga
的太空射击游戏,其中外星人常常试图跟踪和追逐玩家。同样,漫游
AI
也用来实现按照预先定义的方式飞行,发射子弹或射击的敌机。基本上,对于由计算机(或程序)控制的对象,不论是它必须做出决定改变当前的路径,还是要游戏中实现需要的结果,或者只是简单地遵守某种特定的移动方式,都要用到漫游
AI
。在我做的这个游戏中,敌方飞机所需要的结果就是遵从某种移动方式,同时尝试和玩家的飞机发生碰撞并玩家生命值降低。在其他的游戏中,计算机玩家所需要的结果可能是避开人类玩家所发射的子弹。
实现漫游
AI
通常比较简单,一般包括一个对象(玩家的飞机)的位置,改变别一个对象(敌人的飞机)的速度或位置。对象的漫游移动也可以由随机的或预先定义的方式的影响。通常有3种类型的漫游
AI
:追逐、躲避和模式。
追逐是这样一种漫游:一个游戏对象跟踪或追逐另外一个游戏对象或多个游戏对象。追逐是很多射击类游戏所使用的一种方法,其中敌方飞机常常追逐玩家飞机。根据玩家飞船的位置,改变外星人的速度和位置,这就实现了追逐。
例如,我做的这个游戏中实现追逐的算法:
/*flag标记具有跟踪能力的小飞机*/
private int flag=-1;
for( int i=0;i<MAX_SP;i++)
if(smallPlane[i].isVisible())
{
if(i==flag)
{
if(smallPlane[i].getX()>playerSprite.getX())
smallPlane[i].move(-speedOfSP, speedOfSP);
else
smallPlane[i].move(speedOfSP, speedOfSP);
}
else
smallPlane[i].move(0,speedOfSP);
}
private int flag=-1;
for( int i=0;i<MAX_SP;i++)
if(smallPlane[i].isVisible())
{
if(i==flag)
{
if(smallPlane[i].getX()>playerSprite.getX())
smallPlane[i].move(-speedOfSP, speedOfSP);
else
smallPlane[i].move(speedOfSP, speedOfSP);
}
else
smallPlane[i].move(0,speedOfSP);
}
如程序中可以看出,玩家飞机
smallPlane[i]
的坐标位置
(smallPlane[i].getX())
根据玩家飞机
playerSprite
的位置
(playerSprite.getx())
而改变。这段代码可能产生的问题就是可能AI工作的非常良好,敌人飞机几乎可能毫不犹豫地纠缠住玩家,基本上使得玩家没有机会躲开它,这可能是游戏设计者所需要的,但是,玩家更希望敌人在追逐玩家的时候能够多飞一会儿。如果希望这个过程更加完美一些,玩家至少有机会能够以机动性战胜外星人。即敌人飞机在追逐玩家精灵时不应该全力以赴地进行躲闪,而是有余力去追击敌人。
使追逐算法变得更加平和的一种方法就是,在过程中加入一点随机性,我做的这个游戏使用的是这样一种方法:
/*有跟踪能力的小飞机的出现具有随机性*/
x=( int)(random.nextInt()%3);
if(x==0)
{
flag=i; // flag标记具有跟踪能力的小飞机
}
break;
x=( int)(random.nextInt()%3);
if(x==0)
{
flag=i; // flag标记具有跟踪能力的小飞机
}
break;
在这段代码中,敌人飞机只有三分之一的机会能够跟踪玩家。即便只有三分之一的机会能够追逐到玩家,敌人飞机还是对玩家具有攻击性,而这也使玩家能够争取逃脱的机会。
在漫游
AI
中,还有一个分类,即是按照预先定义的方式飞行,发射子弹或射击的敌方机体。在我做的这个游戏中,敌机由计算机(程序)来进行控制,几乎敌机的所有行为均由程序控制。
对于逃避、模式漫游戏
AI
,行为
AI
我做的这个游戏中没有具体的实现,所以只是简单地进行介绍(可以参看《
J2ME
手机游戏编程入门》第三部分,第13章)。逃避
AI
在逻辑上与逃
避
AI
是相对的,即敌机试图躲避玩家飞机的射击。和追逐一样,逃避也可以使用随机方法或者模式移动来减缓。比如逃避的一个经典例子是
Pac-Man
。模式移动指得是游戏对象使用一组预定义的移动的一种漫游
AI
类型。模式移动的典型例子是经典街机
Galaga
中的外星人,它们在屏幕上表演各种各样的漂亮的特技飞行。模式包括圆圈,八字形等等。
AI
的
另外一大类是行为
AI
,它常常是一组混和漫游
AI
算法赋予游戏对象特定的地为。比如敌方机体有时候追逐,有时候躲避,并且每次交替时间都是随机的。常常在实现中,先定义几种行为:追逐、躲避、按某模式飞行或随机飞行,并且可以上述行为分配时间百分比,如50%追逐,10%躲避,40%随机飞行等。实现行为
AI
的伪码可以这样表示。
int behavior=Math.abs(rand.nextInt())%100;
if(behavior<50)
//追逐
else if(behavior<60)
//躲避
else
//随机飞行
if(behavior<50)
//追逐
else if(behavior<60)
//躲避
else
//随机飞行
最后一种AI类型即是策略AI,这种AI机制常常在棋牌类,益智类游戏中比较常见。
本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/187540,如需转载请自行联系原作者