1.14 连连看游戏设计
1.14 连连看游戏设计
基础问题:
1 怎样用简单的计算机模型来描述这个问题?
- 状态机
2 怎样判断两个图形能否相消?
- 两个图形相同
- 他们之间存在转弯数小于3的路径
3 怎样求出相同图形之间的最短路径(转弯数最少,路径经过的格子数目最少)?
- 传统的最短路径问题是求经过格子数目最少的路径然后这个题目中需要将经过格子数目最少修改成为从一个点到另外一个点的转弯次数
- 传统的最短路径可以通过bfs来求,这里求转弯数是否也可以通过bfs来求呢?答案是肯定的
求法:解决图形\(A(x_1,y_1)\)和图形\(B(x_2,y_2)\)之间的最短路径(最少转弯数目)
- 首先将\(A(x_1,y_1)\)压入队列
- 然后拓展图形\(A(x_1,y_1)\)可以直线到达的格子,记录可以直线到达的格子集合记作\(S_0\),判断\(B(x_2,y_2)\)是否在这些格子\(S_0\)里,如果在这个集合里,结束
- 否则,对于\(S_0\)中所有的空格子分别对他们进行上述操作,并且不断合并集合,在扩展的过程中,记录每一个格子是从哪一个格子过来的,最后A到B的之间的路径就可以绘制出来
4 怎样确定目前是处于死锁状态,如何设计算法来解除死锁?
- 最直接的方法就是,对于游戏中尚未消去的格子,都两两计算一下他们可以消去即可。
拓展问题:
1 在连连看设计游戏设计中,是否可以通过维护任意两个格子之间的路径来实现快速搜索?在每一次消去两个格子之后,更新我们需要维护的数据(任意两个格子之间的最短路径),这样的思路有哪些优缺点,如何实现呢?
可以,借助辅助空间 耗费空间
2 在围棋或者象棋游戏中,经过若干步操作之后,可能出现一个曾经出现过的状态,如何在围棋,象棋游戏中检测这个状态?
也是通过空间换时间
Saying Less Doing More