编程之美一------连连看游戏设计
连连看游戏设计
连连看游戏需要考虑的几个问题:
1,判断两个图形是否相同?
我想这个很简单,给图像一个tag,很容易比较图像是否相同。
2,怎么样求出相同图形之间的最短路径?
这个是难点。连连看要求相同图形转弯数目不能超过3。这是一个典型的最短路问题。不过目标函数换了,变为了转弯数目的函数。最短路问题我们采用宽度优先搜索。
宽度有限算法的框架如下:
BFS(G,s)
for each vertex u except s do //对除源顶点外的所有节点进行初始化
begin
visited[u]:=false; //是否访问过
distance[u]:=infinite; //距源顶点距离
parent[u]:=NIL; //父节点
end;
visited[s]:=true; //对源顶点进行初始化
distance[s]:=0;
parent[s]:=NIL;
ENQUEUE(Q,s); //入队;Q为队列
while not(empty(Q)) do //队列不空
begin
u:=DEQUEUE(Q); //队首元素出队
for each vertex V belongs to Adj[u] do //扩展每个邻接节点
if visited[v]=false then //如果未访问
begin
visited[v]:=true; //标记已访问
distance[v]:=distance[u]+1; //距离更新
parent[v]:=u; //父节点记录
ENQUEUE(Q,v); //入队
end;
end;
首先把转弯数目为0(也就是直线可达)的压入队列,可达也分为两种,一种是可以扩展的,一种是不可以扩展的。不可扩展的节点其实没有必要加入队列。在遍历中如果发现不可扩展节点就和终点匹配。可以扩展的节点就继续扩展,直到找到终点为止。
仅仅考虑转弯数目,简单套用BFS模板就可以了,但是如果需要考虑经过经过的格子数目,那么麻烦一点。
BFS会生成一颗bfs生成树,记录父节点,从终点开始,可以打印出一整条路径。(BFS只是要打印一条最短路径,不是说要打印出所有的路径,打印出所有的路径就会更麻烦了)
3,判断当前局面是否存在死锁,本质上还是可以通过两个顶点直接是否存在转弯数目小于3的问题来解决
具体实现还是以后有时间再写一写
参考资料: http://www.cnblogs.com/bvbook/archive/2008/07/28/1254266.html
代码清单1-22
生成游戏初始局面
Grid preClick = NULL, curClick = NULL;
while(游戏没有结束)
{
监听用户动作
if(用户点击格子(x, y),且格子(x, y)为非空格子)
{
preClick = curClick;
curClick.Pos = (x, y);
}
if(preClick != NULL && curClick != NULL
&& preClick.Pic == curClick.Pic
&& FindPath(preClick, curClick) != NULL)
{
显示两个格子之间的消去路径
消去格子preClick, curClick;
preClick = curClick = NULL;
}
}
posted on 2014-05-04 16:31 Champion Lai 阅读(236) 评论(0) 收藏 举报
浙公网安备 33010602011771号