连连看的玩法大家都知道,就是两张图片相同,且相连的路径转弯次数不超过两次。
其实如果不太要求游戏的性能的话,连连看这游戏实现起来还算容易,接下来我把主要的思路说一下。
1:将整张地图拆分为n行m列,接着用一个二维数组表示将在地图中显示什么,例如0表示此处没有东西(如果两张图片可以消除时,就可以将数组中对应的元素赋为0。
2:游戏中需要处理鼠标按下时间和获取鼠标当前点击坐标信息
3:如果其在地图范围内按下某张图片,则将其转换为在二维数组中对应的行和列。
4:游戏关键就是 如何判断两张图片可以消除,这也是连连看游戏的关键吧。其实消去的话如果用广度优先搜索算法的话,实现起来还是比较方便的。
广度优先遍历的思路是这样的: 首先我们已经取得了 第一张图片 和第二张图片的信息了,将其坐标都转换为 二维数组中对应的 map[start.x][start.y]和map[end.x][end.y]。
如果map[start.x][start.y]!=map[end.x][end.y],这就代表他们图片不相等,这时就不需要进行搜索了。
否则我们可以将 开始点的 前后左右 四个方向的结点都推入队列中,继续查看其前后左右的 前后左右,如果其中有为0的(代表此处没有图片,存在通路),还是元素值和开始点 相同的都推入队列中。
在判断前后左右时就可以对 转弯次数 进行累加了,如果还是原来的方向,则保持转弯次数不变,否则转弯次数+1。
如果搜索的过程中,发现存在转弯的次数少于或者等于2的,且其结点信息和 结束点一样,代表我们已经找到了开始点 和结束点之间的通路了,这时也就是两张图片可以消去了。
5:如何画出两张图片消去的路径呢,我的思路是这样的,每次寻找到一个新结点时,我们可以将其上一步结点的信息也保存下来,这样当我们找到结束点时,我们就可以沿着相反的方向,搜索回去,找出原来的整条路径。
搜索代码:
void CGameMap::bfs() //搜索看两张图片是否可以消去
{
for(int ii=0;ii<12;ii++) //初始化为全部没有遍历过
{
for(int jj=0;jj<17;jj++)
{
hash[ii][jj]=15;
}
}
hash[m_startPos.y][m_startPos.x]=0;
node now,t;
while(!m_fangkuai.empty()) //遍历队列
{
now=m_fangkuai.front();
m_fangkuai.pop();
if(now.x==m_endPos.x && now.y==m_endPos.y && now.turn<=2)
{
flag=true;
m_end=now;
while(!m_fangkuai.empty())
m_fangkuai.pop();
return;
}
for(int i=0;i<4;i++)
{
t.x=now.x+m_dir[i][0],t.y=now.y+m_dir[i][1];
t.father.x=now.x;
t.father.y=now.y;
t.father.d=now.d;
if(now.d==i)
t.turn=now.turn,t.d=now.d;
else
t.turn=now.turn+1,t.d=i;
if(in(t)&&(m_map[t.y][t.x]==0|| (t.x==m_endPos.x&&t.y==m_endPos.y) ) && hash[t.y][t.x]>=t.turn)
{
hash[t.y][t.x]=t.turn,m_fangkuai.push(t);
m_lujing.push_back(t);
}
}
}
}
6:实现放大镜功能,也就是所谓的帮忙查找功能,有了之前的广度搜索,这个功能就很好实现了,就是传入一些开始点和结束点,判断是否可以消去,可以的话我们就可以将这两点显示出来,给玩家看。