主题:初到贵宝地,灌一点游戏开发的东东 -- foundera
浅谈RSLG类游戏的人工智能
今天我们来看看关于RSLG人工智能的设计方式。
网络上的网友问到,到底在设计人工智能的时候,是如何来决定出每一行判断式的重要性。其实笔者可以很轻松的告诉各位,在设计人工智能的时候,先想想自己是如何去思考的,然后就依自己认为的重要程度来划分每一行判断式的重要性。这种设计方法的优点就是会相当的“人性化”,设计者很容易就可以在游戏中看到电脑以自己的思考方式去进行各项行动,但是相对的缺点就是若是设计者的本事很差,那么人工智能所表现出来的一定也会很差,因为这样子的人工智能完全会反映出设计者的思路。由于这种设计方式所表现出来的是设计者的思路,因此在一些国外的西洋棋游戏中,设计公司经常会和某些高段的棋手配合,让他们来提出各项的建议,使整个游戏的人工智能更加精确,这就是为什么他们会这样做的原因。
但是现在问题又来了,西洋棋游戏可以这样作,战略游戏怎么办呢?有那一个人是真正的战略天才呢?因此笔者在这里提出一种比较法让各位能够了解设计时会碰到的问题。我们就以战略游戏为例好了,也就是目前市面上最流行的所谓RSLG。在游戏中,当一名电脑控制的角色要行动的时候,它需要考虑以下的几件事情:
行动范围内有没有可以攻击到的敌人。
移动到地理位置较好的地方。
生命是不是已经低到会死的地步。
本身是不是拥有什麽特殊的能力可以使用。
以上是笔者粗略的将可能会发生的情况归类成四项,现在我们就一项一项的来看看。首先是第一项的行动后可以攻击到敌人,光是这一个情况我们就必需要做比较仔细的推算,像是不是只有一名可以攻击到的敌人?若是不只有一名可以攻击到的敌人时,要怎么挑选攻击的目标?以及这样的攻击是不是可以将敌人击毙?是不是要以可以在这一次就击毙的敌人为目标?以及在这一次攻击之后是不是会在下一个回合就遭到敌人的回击等等。如果先将这些情况加以判断,那么可能会归类出以下的几条判断式:
A.若是只有一名可以攻击到的敌人,那么目标就是它。
B.若是有数名可以攻击到的敌人,那么选择最弱的一名。
C.若是有可以在攻击后击毙的敌人,那么它会是目标。
D.在攻击后在多少名敌人的攻击范围内。
还记得上篇文章中笔者曾经提过条列式以及积点式两种人工智慧的设计方式吗?现在我们就以这两种方法来看看关于这一部份的判断式重要性。以笔者主攻的眼光来看,若是有一名敌人可以被击毙,那么这名敌人一定是最重要的目标,接下来才是攻击最弱的敌人,接下来是可以攻击到的敌人,最后才去判断会进入多少敌人的攻击范围内。因此这四条判断式若是以条列式的判断法来排序的话,将会是以下的情况:
C > B > A > D
在这样子的设计下,这些由人工智能所控制的角色将会展现出相当强悍的主攻个性,就算是这一次的攻击后可能会遭到敌方的围攻也毫不在乎。若是各位读者觉得自己并不喜欢由人工智能控制的角色会这样子行动,希望它们能够适当的避开一些会遭到敌人围攻的情况,那么判断式的排列顺序可能会变成:
C > B > D > A
在这样的情况下由人工控制的角色不会一看到有可以攻击到的敌人时,就会像疯狗似的追着打,而会考虑一下这样子的行动会不会就遭到敌人的围攻。但是当有敌人会被击毙,或是生命相当低的时候,就会不考虑那么多了。如果各位读者觉得这样子还是不好,那么也可以将判断式的排列顺序改成如下:
D > C > B > A
在这样的情况下,由人工智能控制的角色将会相当的小心,就算是可以将敌人击毙,但是若在下一回合有被其余的敌人围攻的可能,就不会发动攻击。
接下来我们看看以积点式来设计的话,会是什么样子。同样的判断式用积点式来设计的话,就必需要给每一行算式不同的积点,但是同时必需要将算式做一点修正,因为在积点式中会有复数计算的情况发生,因此这些判断式会变成:
A.可以攻击到一名敌人的位置。
B.可以攻击到的敌人中最弱一名的位置。
C.攻击时可以击毙敌人的位置。
D.一名敌人的攻击范围内。
各位读者可以看到,其中的第四条就是可能会复数计算的。在程序进行判断的时候,这一条可能会因为有多个敌人角色都合乎这个条件,而导致积点的重复计算,因此若是重复计算的次数够多了之后,反而可以将原本一些有利的情况抵消。以前面的这四条算式来举例,若是A的积点是+2、B的积点是+4、C的积点是+8、D的积点是1,那么当一个地点虽然可以将一名敌人击毙但是又会被五名敌人围攻的话,那么这个地点的重要性就会低于一个生命力较低的敌人的位置。也由于积点式的计算方式比较精密,因此人工智能所控制的角色就不会那么的死板,而会显得比较聪明。虽然条列式的作法可以用增加判断式的办法来达到相同的目的,但是比较起来就是差了些。
由以上的这个例子中,我们可以看到不论是一种人工智能的设计方式,整个人工智能的表现都是控制在设计者的手上。条列式表现在判断式的排列顺序,而积点式表现在积点数的不同,这些都是人工智能有“人性”的地方。
--------------------------------------------------------------------------------
额外的讨论
网络上有网友问到,像笔者在上篇文章中拿宾果作说明,但是并没有很详细的以实例说明,所以他实在是不明白为什么在那篇文章中会说(No A) = 4 x 2 > (No B) = 7 x 1。因此现在笔者就将那一篇文章的范例拿出来详细的解说一下。
首先各位看看以下的这个积点表,在这个表中列出了各种情况的重要性。至于为什么积点设定为这样,也就是要让积点真正的能够发挥作用:
判断式 绩点
划一个号码後能够完成一条线 31
划一个号码後在这一条线中出现四个点 15
划一个号码後在这一条线中出现三个点 7
划一个号码後在这一条线中出现两个点 4
划一个号码後在这一条线上只有一个点 1
现在我们看看下面的这个宾果盘,上面的那些「 」符号表示这个地点的数字已经被划掉了。
宾果盘
6 11 16 21
12 17 22
3 8 13 18 23
4 9 14 19 24
10 15 25
现在各位看看这个宾果盘,有两条已经有三个点的线以及两条有两个点的线,因此现在应该要划那一点比较好呢?我们就用上面的那积分表来计算每一个点的重要性,可以得到以下的数值:
o 03:9+1=10
o 04:9+1=10
o 06:3x2=6
o 08:3+1=4
o 09:3+1x2=5
o 10:5+3=8
o 11:3+1=4
o 12:5+1=6
o 13:5+3+1x2=10
o 14:3x2=6
o 15:5+1=6
o 16:3x2=6
o 17:5+3x2=11
o 18:3+1=4
o 19:3+1=4
o 21:3x2+1=7
o 22:5+1=6
o 23:3x2=6
o 24:3x2=6
o 25:5x2+1=11
从这些算式中,我们可以看到若是划下17或是25将可以赚得最多的积点,因此这两个数字就是我们现在要考虑的。接下来再以这两个数字在宾果盘上的重要地位来判断,25的位置要比17要好,因此就可以决定划下25这个数字。这种计算方式就是积点式的典型算法,人工智能会将整的盘上的所有数字都做一番推算,然后才选出最好的一点。
网友还问到,在上一次的文章中笔者曾经说过积点式的人工智能在进行判断的时候为什么会花掉比较多的时间。以下来说明:
各位读者可以想想看,若是每一格的计算需要花掉一分钟的话,那么在积点式的判断中,每一次不论如何的行动,都需要花掉相同的时间。而条列式的判断方式会因为当时判断的位置不同而略有不同。或许各位读者会说,不过是几个步骤而已嘛,时间上能够差多少?但是各位不要忘了,在这篇文章中笔者只不过是举例,所以看起来判断式好像不多,但是在真正游戏中的人工智能却不只是这么短短几行的判断。试着想想看,若是每一行判断式是十秒钟,那么当判断式一多了之后会是怎么样呢?
这一次再向各位读者解释人工智能的运算方式,希望各位读者都能够看得懂。
- 相关回复 上下关系8
游戏Loading画面的实现 foundera 字1107 2004-06-09 20:42:28
游戏鼠标操作的思考 foundera 字4061 2004-06-09 20:41:46
飞行射击游戏中的碰撞检测 foundera 字5268 2004-06-09 20:28:23
浅谈RSLG类游戏的人工智能
电脑AI浅谈 foundera 字2883 2004-06-09 19:40:11
谈谈模拟足球游戏中人工智能 foundera 字2815 2004-06-09 19:39:38
多元化的即时战略AI foundera 字2189 2004-06-09 19:39:07
浅谈电脑游戏中的人工智能制作 foundera 字16449 2004-06-09 19:38:24