编程之美一------连连看游戏设计

连连看游戏设计

连连看游戏需要考虑的几个问题:

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)    收藏  举报

导航