开心网的“谁最牛”模块有一个叫“AI智能人”的Flash游戏。偶每次玩到第10关都被难住。哀叹自己智商如此低下之余,也十分好奇这关到底应该咋过呢?网上又没找到攻略秘籍,只好自己DIY一个作弊程序了。

游戏的地址为:http://xyx.kaixin.com/upload/detail.php?game=A_I, 游戏规则是每次可以命令任意一个机器人朝某个方向行进,只有遇到其它机器人才会停下来,如果没有其他机器人的阻挡,就会一直走到棋盘边缘并坠落,任务失败。使红色机器人停留在棋盘中心的紫色格子里则过关。有兴趣的话可以玩一下。
可以用一个矩阵来表示棋盘。0代表空白的方格,1代表灰色机器人,2代表红色机器人。上图中的棋盘就可以这样来表示:
m = [[1,0,0,0,0],
        [0,0,0,1,0],
        [0,0,1,0,0],
        [0,0,0,0,0],
        [1,1,0,2,0]]
算法的话就是直接递归穷举所有可能的走法。Ruby代码如下。
文件名AI.rb

代码写得很丑(真是书到用时方很少呀),真是对不起Ruby这么优雅的语言了,汗。其中的 “pp_extension” 在我的这篇文章里。 运行之后的效果:


按照右侧的输出的每一步把机器人从“#”移动到“$”即可。
程序已通过全部18关测试,看到自己的名字显示在前10以内,虚荣心真是小小地满足了一把,吼吼吼。


在一个地方被折磨了很久。就是AI.rb的地79行:
 if(state_stack.has_key?(next_m) == false) then

        state_stack[next_m] = 'exists'
本来我写的是
 if(state_stack.has_key?(next_m.hash) == false) then
        state_stack[next_m.hash] = 'exists'

因为state_stack的作用就是记录一下已经遍历过的状态,防止重复遍历,所以想存放hash值可以省些内存,结果发现程序时而好用时而不好用,调试了半天才发现如果有两个矩阵s1和s2,
s1 = [[1, 0, 0, 0, 0],
        [1, 1, 0, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 1, 0, 0],
        [0, 1, 2, 0, 0]]
 
 s2 = [[1,0,0,0,0],
        [1,1,0,0,0],
        [0,1,2,0,0],
        [0,0,1,0,0],
        [0,0,0,0,0]]
s1.hash 和 s2.hash居然是相等的!都是3589,真是搞不懂。liangliangzai 和众位高手,请指点一二。

2008-1-14 更新

为了对得起Ruby,我又把这个程序重写了一遍,这回感觉好多了。代码:

文件名 AI3.rb


比较难的几关的攻略:

第9关

第10关

第11关

第13关

第14关

第15关
第16关

第18关
     


posted on 2009-01-14 15:26  1-2-3  阅读(1449)  评论(2编辑  收藏  举报