J2ME(追逐)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);
}
如程序中可以看出,玩家飞机smallPlane[i]的坐标位置(smallPlane[i].getX())根据玩家飞机playerSprite的位置(playerSprite.getx())而改变。这段代码可能产生的问题就是可能AI工作的非常良好,敌人飞机几乎可能毫不犹豫地纠缠住玩家,基本上使得玩家没有机会躲开它,这可能是游戏设计者所需要的,但是,玩家更希望敌人在追逐玩家的时候能够多飞一会儿。如果希望这个过程更加完美一些,玩家至少有机会能够以机动性战胜外星人。即敌人飞机在追逐玩家精灵时不应该全力以赴地进行躲闪,而是有余力去追击敌人。使追逐算法变得更加平和的一种方法就是,在过程中加入一点随机性,我做的这个游戏使用的是这样一种方法:
/*有跟踪能力的小飞机的出现具有随机性*/
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
//随机飞行