通过俄罗斯方块浅谈游戏中的AI(四)路点

:谈到“路点”大家想到的应该是cs中的bot waypoint,

有waypoint的map可以使用bot,没有waypoint的map就不行。

于是大家都去下载每个地图的“路点(WayPoint)

 

其实这两个游戏的路点虽然从规模上有较大差距,但从思想上还真差不多。

 

 

我认为cs的路点实现:


 

 

1、cs的路点并不会存储让bot如何瞄准,而只会记录当前位置和下一个可选位置的关系,以及按照什么路线走过去。

 

好的路点文件可以让bot走的路线很不容易被人看到,一般的路点就会沿着大道中间走;

2、bot在某个点上做某些动作的真正原因是bot本身的AI所致,bot这个对象具备随时观察情况的能力,也许他们之间还有通讯的能力,

有此作为铺垫,路点才能更容易实现。

3、路点的结构应该是一个图,图的节点是每一个可能的转折点:如分岔路,需要跳跃或者辅助攀岩的位置。而对于什么时候该换枪、该往哪里瞄准,完全不需要路点去描述。

 


 

正文:

 

Tetris的路点却有一些不同,Tetris的每一个块的个体不需要具备AI,Tetris本身是个纯大局观的游戏,单个个体起到的作用远不及cs大

--别鄙视我说cs也是大局观的游戏,我也清楚,任何东西大局观有问题都不行,但是至少cs可以个人英雄,Tetris没有可能。。。。。。

 

所以在路点这块,需要武装到牙齿:下一个位置是哪里;先横移还是先纵移动;应该在哪里变化方块才更容易达到位置;应该用快速下落还是应该稍微慢点,等等。

 

对于Tetris中的每一个小块自己是不需要任何AI的,只需要执行指令。完全由总AI作为统一调度。

 

为了把问题阐述的更清晰,先看一下我定义的struct WayPoint

 

由于代码中有足够的注释,我就不再对结构体本身作解释,我把WayPoint的应用逻辑以伪代码的方式列出,方便大家理解。

 

 

step1:  


 

转动次数++;

转动次数>4?'异常':(转动一次,判断是否是目标样式?step2:step1); 

★(转动次数>4)的解释:任何方块自己找到WayPoint后,会转动4次以内,直到达到了TheAimSet的对象就停止,当4次都不能达到这个状态,就抛出异常,重新进行AI。

如:‘7’形的set是‘L’形的set左转两次能得到的。它们是两个不同的对象。

 

step2:

横向移动先?

   (判断当前的方块x坐标是否到达目标x坐标?setp3:一次向目标的x坐标横移一格):

   (判断当前的方块y坐标是否到达目标y坐标?setp3:一次下降一格);

step3:

横向移动先?

 

   (判断当前的方块y坐标是否到达目标y坐标?setp4:(最后一个WayPoint?瞬间下降到底:一次下降一格)): 

 

   (判断当前的方块x坐标是否到达目标x坐标?setp4:一次向目标的x坐标横移一格);

step4:

是否最后一个路点?over:(切换到下一个路点,step1);


 

 

下面再举个几个小例子。

 

case 1:当我们下来一个 L形的方块,而我们最右边有个空挡正好可以让它变化两次后插入,消除3行, 

对于这种最简单的情况,我们只需要一个WayPoint即可:WayPoint(目标位置(9,16),‘7’形的set,true);

case 2:当我们发现最后一行有个虚洞,需要L型的下降到最后然后横移的,照样一个WayPoint即可:WayPoint(目标位置(4,18),‘L’形的set,false);不同点在最后一个参数为false;

 

case 3:当我们发现要必须变成 ━┛ 形状,然后才能往最后一层有两个连续的虚洞的位置插入时;甚至下落过程必须沿着边用2个宽度的‘7’形下落,等下降到一定位置才能转动的情况下,我们就不得不用多个WayPoint表达这个方块的移动轨迹,

如:WayPoint1(目标位置(9,10),‘7’形set,true);达到最边上,以2个宽度的‘7’形进行下降。

WayPoint2(目标位置(4,18),‘━┛ 形’,false);先变化,再下降,在横向移动。

可以想象的是,除非及特殊情况,通常一个waypoint足够解决绝大多数问题。


 

本节总结:

   路点(waypoint)是我分析过,认为能比较好解决效率和简化算法的一个中间产物,不排除用更逻辑更好的即时计算的方案,比如每移动一次用路径搜索算法进行计算,是否能达到位置,达到位置应该如何变化。但考虑到效率问题,我还是用了waypoint做中间产物。

   以后的程序在计算waypoint的时候,会预先使用A*算法,将可能的最短路径给找出来,由这个路径翻译成路点。一次计算的时间越长,对于当前操作者的影响越大。如果对方用频繁1行攻击的话,电脑需要一次次重新计算路点的可行性。找到一个快速的路径搜索算法并配合路点存储是解决这个问题的最好办法。

下一章节讲提高效率之一的位运算代替数组运算;在再一章节就会介绍变化的A*算法。

为什么变化了的A*算法呢?先留个问题让大家思考一下吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值