游戏的地址为: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代码如下。
代码写得很丑(真是书到用时方很少呀),真是对不起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'
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,我又把这个程序重写了一遍,这回感觉好多了。代码:
比较难的几关的攻略:
[[1, 1, 0, 0, 1],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 1],
[0, 2, 0, 0, 0]]
---1---
[["|", "|", "1", "|", "0"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---2---
[["|", "|", "|", "|", "|"],
["1", "|", "|", "|", "|"],
["0", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---3---
[["|", "0", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---4---
[["0", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---5---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "0", "|", "1", "|"],
["|", "|", "|", "|", "|"]]
---6---
[["|", "0", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---7---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "1", "0", "|"],
["|", "|", "|", "|", "|"]]
---8---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "1", "0"],
["|", "|", "|", "|", "|"]]
---9---
[["|", "|", "|", "|", "|"],
["|", "|", "1", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "0", "|", "|"],
["|", "|", "|", "|", "|"]]
---10---
[["|", "|", "|", "|", "|"],
["|", "1", "0", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---11---
[["|", "|", "|", "|", "|"],
["|", "0", "|", "|", "|"],
["|", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---12---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "0", "1", "|", "|"],
["|", "|", "|", "|", "|"]]
---13---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "2", "|", "|", "|"],
["|", "0", "|", "|", "|"]]
---14---
[["|", "|", "|", "|", "|"],
["|", "|", "1", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "0", "|", "|"],
["|", "|", "|", "|", "|"]]
---15---
[["|", "|", "|", "|", "|"],
["0", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---16---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "0", "2", "|", "|"],
["|", "|", "|", "|", "|"]]
---17---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "2", "|", "|"],
["|", "|", "0", "|", "|"],
["|", "|", "|", "|", "|"]]
[[1, 0, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 0, 0],
[1, 1, 0, 0, 1]]
---1---
[["|", "1", "|", "0", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---2---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "1", "|", "0"]]
---3---
[["0", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["1", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]
---4---
[["|", "|", "|", "|", "|"],
["|", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "0", "|", "|", "|"]]
---5---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "1", "0", "|", "|"]]
---6---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "1", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "0", "|", "|", "|"]]
---7---
[["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "2", "0", "|"],
["|", "|", "|", "|", "|"],
["|", "|", "|", "|", "|"]]