吴昊品游戏核心算法 Round 16 ——吴昊教你玩口袋妖怪 第三弹 地洞谜题

  这样的场景我们应该经常遇到的吧,哈哈!

 

  口袋妖怪的地洞要算是最令人讨厌的了,因为,有些地洞是全黑的,你即使用了闪光灯(必选道具#03),你有时也只能用GBA外壳的荧光屏作为道具才能将整个地洞看清楚。

  如图所示,这是口袋妖怪红宝石中的一个场景,顶端的正中央是我们需要到达的重点,我们必须要使用怪力(必选道具#05)才能突出重围,到达终点。和我之前的系列Round 14一样,我们推箱子的时候是不允许连着推动两个到两个以上的箱子的(不然,谜题就太简单了),这样我们应该怎么做才能到达终点呢?

  一个比较好的策略就是,将石头尽量由紧密变为疏松,这乃是一个不错的策略,给上面的石子尽量留下一个比较宽松的空间。但是,这样的策略最终还是定性的,定性的策略缺乏可操作性,所以,我们希望将那些定性的原则尽量定量化。

 

 

  某位口袋妖怪红宝石大神的策略 

  以上是飞龙大神的策略,我觉得基本上遵循了这样一种原则:先中间,后两边。先把在其中间的那个石头移到上面,然后,再分别将左右两块石头移到两边。遵循这样一种原则进行移动,考虑到石子放置的对称性,左右的移动方法都是相同的。我们利用飞龙大神的移动方式,可以通过以上七步移动石子,最终进入终点,但是,人的观察必然带有一定的主观性,有没有更为客观的方式呢?

  我们自己的AI策略

  首先,让我们回忆一种变式,就是《吴昊品游戏核心算法 Round 14 —— 推箱子的一种变式(三个箱子)》,在这种变式下,我说明了箱子数目的增加会使问题的空间复杂度呈现指数的增加,那么,如何改进代码,用来实现这个问题呢?如何改,我们可以明确两点:(1)目的不同,我们的目的是到达终点,也可以理解为一个二维数组的目标点(2)我们没有必要再将石头搬到一个指定的位置,而是随便怎么搬都可以。

  明确了这两点之后,问题就好解决了:

  综上所述,我们在我的系列的Round 14 —— 推箱子的一种变式(三个箱子)中,实现两个要点就可以了:

  A)开一个18维的数组,16维装填箱子的(x,y)坐标,而另外两维装载人的(x,y)坐标,我们可以看到,每一个18维数组代表的是一种状态。

  B)修改辅助函数F,辅助函数是用来判断游戏是否结束了的,我们这里需要改,因为我们的判断目的已经不一样了:

    辅助函数F:判断游戏是否结束  

  bool isEnd(Node a) 

    {   

   //这里必须是三个箱子都在地图的叉叉位置上   

  if(map[a.box[0].x][a.box[0].y]=='@'&&map[a.box[1].x][a.box[1].y]=='@'&&map[a.box[2].x][a.box[2].y]=='@')  

    {     

  return true;                                                                                                           

  }       

  return false; 

   }

  我们这里只需要人走到正上方的正中央就可以了,于是,只需要把if条件换成

  if(map[a.you.x][a.you.y]=='出口')

  即可!!!

 

posted on 2013-04-01 10:26  吴昊系列  阅读(422)  评论(0编辑  收藏  举报

导航