在现代社会中,一个蠢笨的游戏是没有人来玩的,因为人会学习,而程序是不会学习的。因此,要让游戏好玩一些的好办法就是让游戏具有一点智能。当然了,这种智能达不到人工智能的水平,但是至少可以通过程序对游戏环境的变化或者条件的变化来增加游戏的难度与可玩性。
首先,先讲一个随机掷骰子的智能问题。不知大家有没有玩过掷骰子的游戏,就是掷一个骰子,然后玩家赌大小,这个游戏最方便做智能了。请看下面的代码:
number = random(6)+1;
if (用户选择大 and number>=4) {
number = random(6)+1;
} else {
if (用户选择小 and number<=3) {
number = random(6)+1;
}
}
if (用户选择小 and number<=3) {
trace("恭喜,赌正确了");
}
if (用户选择大 and number>=4) {
trace("恭喜,赌正确了");
}
这样编程很明显就让游戏难度增加了。表面上看好像计算机只出了一个随机数,但是,程序运行时实际上出了两次随机数。第一个随机数根本不显示出来,只有两次都正确才叫正确,这就是最简单的游戏智能!让我们看看还有什么办法给游戏增加智能吧。一般智能可分成下面几种情况:
这个应该是最常见的了,在很多小游戏里经常见到。最简单的是根据游戏主角和跟踪物体的坐标计算出角度,然后把它运动的方向改为朝游戏主角运动,再配上不同的速度或者曲线方程,将它完成得非常流畅。
复杂一些的还可以增加障碍物。这时,就需要让敌人移动的算法复杂一些,可能要让“它”计算一下。具体的计算方式是根据具体的游戏情况来制定的,多数要求不高的游戏用简单的数组就可以解决了。
简单的游戏里,可能敌人一直在攻击。但是大多数游戏里面,敌人还是表现出一些“狡猾”,他们在主角靠近的时候才采取行动。比如说主角靠近时用剑来攻击,在离得较远时就用远距离的攻击方式比如魔法攻击或者发射子弹等。
最简单的解决方法就是判断两者之间的最短距离,在Flash中就是中心点之间的距离。它的计算公式就是Math.sqrt((x–x1)*(x–x1)+(y–y1)*(y–y1)),其中(x,y)和(x1,y1)分别代表两个物体中心的坐标。
当有障碍物的时候,算法会复杂一些。此时要绕过障碍物,而绕过障碍物的算法很多,简单的算法可以将自己直线或者斜向移动一格,然后再判断有没有阻挡,如果阻挡了,就再移动,直至不再阻挡为止。当然了,这种算法有明显的不足,就是效率低下,而且会有可能永远走不出去。好的绕过障碍物的算法可以用A×算法,这属于一种最短路径的算法,在计算机数据结构里有专门的算法介绍。这里由于篇幅所限不做深入探讨。
这种敌人非常常见,而且有效,玩家只要摸清楚敌人的规律,然后采取自己的行动来对付敌人。在 Flash 里面要实现这个非常容易,只需采用按路径移动(Orient to path)便可让敌人在一个区域内或者按有规律的路线进行移动了。
《盟军敢死队》大家都玩过吧?那里面敌人的视线范围是不是对我们很有启发?如果采用 Flash 来实现这个功能的话,还是比较容易的(先排除障碍情况)。我们知道,判断游戏是否完结的一个重要标准就是碰撞。如果敌人和主角碰撞,一般情况下就应该结束(当然,游戏结束的条件有很多,这里仅仅从这个角度来看)。这也很容易移植到敌人的视觉上。
在Flash里面,可以很容易地在敌人的 MovieClip 上增加一个视觉范围的 MovieClip,然后判断这个视觉范围是否和主角碰撞(采用hittest函数,这个在本书精华集1的接金币游戏中介绍过),如果碰撞成立的话,那么敌人就可以开始行动了。
“好了,现在我找到武器了,敌人,敌人在哪里?”这个时候,敌人是可以望风而逃的,那么,他们怎么知道主角跑过来了呢?判断坐标是个好方法。还有一个方法可能更加适合 Flash,就是从上一个段落里面刚刚学习了给敌人增加视觉范围的方法,这样就可以用视觉范围来判断主角是否到了身边——这样更加真实,当敌人背对主角的时候,不会发生动作。可是一般情况下,敌人要“望风而逃”。那么,更简单的做法是,给敌人增加一个这样的 MovieClip:以敌人为中心,放置一个圆形的 MovieClip,半径随便定义,然后判断主角是否同圆形碰撞,如果碰撞,那么敌人赶紧朝反方向逃跑。当然,还有一个办法,就是给每一种武器设定一个攻击范围,如果玩家1找到远距离的武器,而自己又在离攻击范围“不远”的地方,敌人就马上逃跑,这个不远的值到底是多少可以由程序来定义。
由程序来响应玩家的各种输入(比如键盘、鼠标)是游戏中必需的,因此玩家的一举一动,程序全知道。这样这个程序也就相当于有头脑了。比如说制作街头霸王程序,要玩家与电脑对战,就得让电脑具有相当的智能。比如一个无影脚绝技,其攻击范围有50个点,要求的按键组合是脚、下、打这三个键,然后程序可以判断当玩家按了脚这个键时电脑就自动做出反应,跳出这个攻击的范围之内。当然了,这是最理想的状态,因为攻击秘技决不止一个,也就是说玩家在按了脚键之后不一定就用这个无影脚秘技,或者用火龙秘技。这个秘技后的两个按键不同,攻击力更远,就算逃出了无影脚的功能范围,也有可能还是逃不出火龙的攻击范围。
关于游戏智能的内容很多很复杂。这里仅仅做一些理论上的引导工作,无法列出具体的程序。希望这些思路能给游戏增加可玩性与趣味性。这里还要感谢边城浪子,本书的一些算法思想是他在“游戏理论——狡猾的敌人”一文中介绍的,希望这些方法能够给大家一些启发。如果觉得这些算法思想有考虑不周的或者错误的,欢迎来闪客帝国网站的论坛探讨。