连连看的主要思路

 

                 连连看的玩法大家都知道,就是两张图片相同,且相连的路径转弯次数不超过两次。

        其实如果不太要求游戏的性能的话,连连看这游戏实现起来还算容易,接下来我把主要的思路说一下。

        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:实现放大镜功能,也就是所谓的帮忙查找功能,有了之前的广度搜索,这个功能就很好实现了,就是传入一些开始点和结束点,判断是否可以消去,可以的话我们就可以将这两点显示出来,给玩家看。

      

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值