作者bleed1979 (十三)
看板AndroidDev
标题[分享] 8 puzzle game
时间Wed Sep 21 22:31:11 2011
档案连结:
http://bleed1979.myweb.hinet.net/EightPuzzleV02.apk
就典型的8 puzzle game。
还在测试找看看有没bug,就先分享给大家。
蛮无聊的,没声音,图也不好看。
唯一的卖点是电脑AI,如果你玩不下去,可以点选电脑AI,会帮你接玩到结束。
程式很简单,就不公开源码了。
请大家尽量散布。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.113.144
1F:推 givemepass:不公开source code 麻烦请移架至 android版 09/22 07:56
我补一下游戏做法好了。
initial state会是random产出但是这个random不是随便产生的。
在一开始进行游戏的时候,我会先从final state往前产生16步的所有可能。
将这些可能存放在HashMap里。
所以initial state就是从第16步的众多可能里random一个出来。
这样就确保有解。
当玩家使用电脑AI时,会从目前的盘面再产生16步的所有可能。
只要产生的图中可以在原本的HashMap查找到,代表可以从目前的盘面找到解。
产生可能的方法是BFS(宽度优先搜寻)。
而为什麽要取16步呢?因为8 puzzle最多31步(有时间的人可以跑BFS到完成)
所以我前取16步,後取16步,就一定可以连结的上。
大致上是这样。
※ 编辑: bleed1979 来自: 114.43.113.144 (09/22 12:00)
再补一下资料结构好了,免得没讲到code。
final class Puzzle {
long p; // 8 puzzle的值
int fatherIndex; // 上一步的索引
int zeroPos; // 空格的位置
int lastDir; // 上一步的方向
public Puzzle(long value, int lastIndex, int position, int direction) {
p = value;
fatherIndex = lastIndex;
zeroPos = position;
lastDir = direction;
}
}
上面的class代表一个盘面。
每4个bit代表一个数字,所以需要36个bit,用一个long就够了,不开阵列。
fatherIndex是上一步的索引。
因为我写的BFS是以queue来实作,所以要记录索引位置。
zeroPos是空格的位置,我设定空格为0,因此命名。
会多这一个栏位是因为我不想到时候再跑一个回圈去找0的位置。
lastDir是上一步的方向。
这是为了到时候电脑AI怎麽移动所记录的。
我不太懂Java的容器,所以queue的部分就随便选了ArrayList来使用。
ArrayList<Puzzle> queue ...
HashMap的部分key是盘面的值,value是索引位置。
HashMap<Long, Integer> history ...
BFS使用两个回圈完成。外回圈是步数,内回圈就是一直拿出放入queue的puzzle。
以上。
※ 编辑: bleed1979 来自: 114.43.113.144 (09/22 12:33)
2F:→ diousk:觉得想要分享就别只分享一半...... 09/22 13:40