连连看算法及源代码

转载 2012年03月23日 11:28:38

闲着无聊,编个连连看玩玩,用了魔兽里面的头像来做图片。下面记录如下:


  程序的关键在于判断用户连续点击的两个图案能否消除。两个图片可以消除的条件有两个:

  • 图片相同
  • 图片间连线的转角数不得超过2 。

  而判断能否通过小于两个转角的路径连通的算法有两种:

  • 分类判断法
  • 以转角数为标准的广度优先搜索

 

  下面对两种算法分别讨论。

 

  1. 分类判断法

      这里实质上是一种递归的思想,要判断图片A与图片B能否通过一条有N个转角的路径相连,可以转化为判断能否找到图片C,C与A能直线相连,且C与B能用一条有N-1个转角的路径相连。若这样的图片C存在,那么A与B就可以通过一条有N个转角的路径相连。

      根据转角数不得超过2个的规则,我们可以分为转角数分别为0个、1个、2个这三种情况分别讨论。

  (1)0转角连通(直线连通):两个图片的纵坐标或横坐标相等,且两者连线间没有其他图案阻隔。

  (2)一个转角连通:其实相当于两个图片划出一个矩形,这两个图片是一对对角顶点,另外两个顶点如果可以同时和这两个棋子直连,那就说明可以"一折连通"。见下图两个红色棋子的连通情况,右上角打叉的位置就是折点。

 

图1.一个转角连通 

  (3)两个转角连通: 判断图片A与图片B能否经过有两个转角的路径连通实质上可以转化为判断能否找到一个点C,这个C点与A可以直线连通,且C与B可以通过有两个转角的路径连通。若能找到这样一个C点,那么A与B就可以经过有两个转角的路径连通 。

  判断是否经两个转角连通的算法需要做两个方向上的扫描:水平扫描和垂直扫描。

  水平扫描。如下图所示,为了判断A,B能否通过2个转角连通,则从A开始在水平方向上向左右扫描,并判断经过的点能否与B点经过1个转角连通。显然C点能与B点经1个转角连通,故A,B能经2个转角连通。

 

图2.两个转角连通的判断

  垂直扫描。如下图所示,为了判断A,B能否通过2个转角连通,则从A开始在垂直方向上下扫描,并判断经过的点能否与B点经过1个转角连通。显然C点能与B点经1个转角连通,故A,B能经2个转角连通。

 

图3 .两个转角连通的判断

  

2.以转角数为基准的广度优先搜索法

  这种算法参考《编程之美》。

  这种算法的动机:若能将所有与图片A经过不多于2个转角的路径相连的图片找出来,加入一个集合S中。那么判断B与A能否相连只需判断B是否存在于集合S中即可。采用广度优先搜索算法可以方便的实现这一构想。算法的思路如下:

  (1)定义空集S与T,将A加入集合S

  (2)找出所有与A能直接相连的点,将其加入集合S

  (3)找出与集合S中的点能直接相连的点,加入集合T,然后将T中所有元素加入到集合S中,清空集合T

  (4)找出与集合S中的点能直接相连的点,加入集合T,然后将T中所有元素加入到集合S中

  (5)若B在集合S中,则A,B可以相连。否则A,B不能相连

 

  模仿图论中广度优先搜索的算法,可以写出以转角为基准的广度优先搜索的伪代码如下:

//判断图片A与图片B能否经过不多于2个转角的路径相连的算法
bool Match( Picture A,Picture B )
{
    Set< picture > S ; //已经搜索到的点的集合,集合S中每个元素与A都可以通过不多于个转角的路径连通
    Set< picture > T ; //临时存储搜索到的点
    将A加入到S中
 
    int crossNum = 0 ; //用于记录当前搜索到节点的最大转角数
 
    While( B 不在S 中&& crossNum < 3 )
    {
        for( S 中每个元素e )
        {
            将所有与e能直线连通的点加入到集合T中
        }
        T中的所有元素加入到S中
        crossNum ++ ;
    }
    if( B 在S中)
        return true ;
    else
        return false ;
}

     实际编程实现这一算法时可以采取优化措施,不一定要搜索出所有与A转角不超过2的点。

   本程序实现时采用了第一种算法。

   程序源代码见附件。

   欢迎拍砖。

    war3连连看.rar下载 

连连看游戏核心代码(C++实现)

这两天研究了一下连连看游戏的源代码,感觉它挺简单的,主要就是判断选中的两张图片能否消去。我参考了网上的源代码(抱歉的是,不记得当时下载的网址了,在此对原作者表示深深的歉意!),然后自己把核心代码整理如...
  • u013149325
  • u013149325
  • 2013年12月16日 20:04
  • 2861

JS连连看源码完美注释版(原创)

下班无事,也写一个javascript连连看,注释比较完整,想学的朋友可要看了。连连看最难的部分应该是路径搜索,即鼠标点的两点之间看有无可通的路径。 看过有人写的递归写法,心里痒痒,就捉摸了一下,发现...
  • sunxing007
  • sunxing007
  • 2010年02月03日 23:01
  • 9314

Java实战_仿QQ连连看

关于这个项目,真的是花了很多心思在上面,从开始构思,到最后完成,真的是花了整整一个月。大概是11月初开始学java swing的时候有的想法,然后开始构思整个思路,相关算法讨论以及调试。 最开始先对...
  • chance2015
  • chance2015
  • 2016年01月03日 23:56
  • 4041

[Qt C++] 连连看

断断续续地写了一个多月终于完成了,在此特别感谢两位室友的合作。       开始界面。   点击“开始游戏”可以以普通用户身份进入游戏;   点击“开始游戏(debug版)”可以进入含有人工智能的游...
  • ZJU_fish1996
  • ZJU_fish1996
  • 2016年01月06日 09:23
  • 2169

连连看游戏。。c++编写。。

直接附上代码算了。。   /**************** 连连看 *****************/ /************** 2012-11-18 ****************/...
  • ckcz123
  • ckcz123
  • 2012年11月20日 09:48
  • 3037

JavaFX小游戏——三国杀版连连看

应用JavaFX开发的小游戏《三国杀版连连看》,带音效哦! PS:目前只实现了基本功能,一些功能尚未完成,如:提示按钮功能、关卡系统等。 基本算法及源代码会日后博客给出。 下载地址:htt...
  • DestinyiChen
  • DestinyiChen
  • 2013年09月04日 11:02
  • 955

Swing实现最简单连连看的思路和源码

国庆闲着没事儿写个连连看,断断续续写了两三天,估计加起来也有8个man hour了。简单记录一下实现流程。 罗马不是一天建成的,从零开始的话还是一步一步走,写一点看一下效果,慢慢东西就出来了。 主...
  • wwwcomy
  • wwwcomy
  • 2015年10月13日 15:06
  • 869

Java语言实现数字连连看源码

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class lianliankan impl...
  • macrobed
  • macrobed
  • 2012年08月09日 13:41
  • 281

连连看设计思路与java代码

import java.util.HashSet; import java.util.Iterator; import java.util.Map.Entry; import java.util.Ra...
  • lds3366336608
  • lds3366336608
  • 2014年09月30日 12:09
  • 1279

Java经典连连看游戏源代码

Java经典连连看游戏源代码…… public class lianliankan implements ActionListener { JFrame mainFrame; // 主面板 Co...
  • tjcyjd
  • tjcyjd
  • 2011年02月11日 13:03
  • 7232
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:连连看算法及源代码
举报原因:
原因补充:

(最多只允许输入30个字)