注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

转---游戏中的人工智慧(1)  

2012-05-10 19:20:37|  分类: VC C++ MFC JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

在去年十二月的杂志中,笔者曾经就游戏的人工智慧和各位探讨过一些人工智慧的设计问题,没有想到在杂志 出刊的几天後,就从网路上接到几位读者询问这些问题的信件,因此趁着大家对前一篇文章的记忆还深的情况 下,我们就再来看看关於人工智慧的设计方式。 网路上的网友问到,到底在设计人工智慧的时候,是如何来决定出每一行判断式的重要性。其实笔者可以很轻 松的告诉各位,在设计人工智慧的时候,先想想自己是如何去思考的,然後就依自己认为的重要程度来划分每 一行判断式的重要性。这种设计方法的优点就是会相当的「人性化」,设计者很容易就可以在游戏中看到电脑 以自己的思考方式去进行各项行动,但是相对的缺点就是若是设计者的本事很差,那麽人工智慧所表现出来的 一定也会很差,因为这样子的人工智慧完全会反映出设计者的思路。由於这种设计方式所表现出来的是设计者 的思路,因此在一些国外的西洋棋游戏中,设计公司经常会和某些高段的棋手配合,让他们来提出各项的建议 ,使整个游戏的人工智慧更加精确,这就是为什麽他们会这样做的原因。 但是现在问题又来了,西洋棋游戏可以这样作,战略游戏怎麽办呢?有那一个人是真正的战略天才呢?因此笔 者在这里提出一种比较法让各位能够了解设计时会碰到的问题。我们就以战略游戏为例好了,也就是目前市面 上最流行的所谓rslg。在游戏中,当一名电脑控制的角色要行动的时候,它需要考虑以下的几件事情: 1. 行动范围内有没有可以攻击到的敌人。 2. 移动到地理位置较好的地方。 3. 生命是不是已经低到会死的地步。 4. 本身是不是拥有什麽特殊的能力可以使用。 以上是笔者粗略的将可能会发生的情况归类成四项,现在我们就一项一项的来看看。首先是第一项的行动後可 以攻击到敌人,光是这一个情况我们就必需要做比较仔细的推算,像是不是只有一名可以攻击到的敌人?若是 不只有一名可以攻击到的敌人时,要怎麽挑选攻击的目标?以及这样的攻击是不是可以将敌人击毙?是不是要 以可以在这一次就击毙的敌人为目标?以及在这一次攻击之後是不是会在下一个回合就遭到敌人的回击等等。 如果先将这些情况加以判断,那麽可能会归类出以下的几条判断式: 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这个 数字。这种计算方式就是积点式的典型算法,人工智慧会将整的盘上的所有数字都做一番推算,然後才选出最 好的一点。 网友还问到,在上一次的文章中笔者曾经说过积点式的人工智慧在进行判断的时候为什麽会花掉比较多的时间 。以下来说明: 各位读者可以想想看,若是每一格的计算需要花掉一分钟的话,那麽在积点式的判断中,每一次不论如何的行 动,都需要花掉相同的时间。而条列式的判断方式会因为当时判断的位置不同而略有不同。或许各位读者会说 ,不过是几个步骤而已嘛,时间上能够差多少?但是各位不要忘了,在这篇文章中笔者只不过是举例,所以看 起来判断式好像不多,但是在真正游戏中的人工智慧却不只是这麽短短几行的判断。试着想想看,若是每一行 判断式是十秒钟,那麽当判断式一多了之後会是怎麽样呢? 这一次再向各位读者解释人工智慧的运算方式,希望各位读者都能够看得懂,若是各位对游戏企划有任何问题 ,或是对笔者所介绍的地方有疑问,都欢迎各位来信询问。

  评论这张
 
阅读(298)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017