加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# 实现连连看功能

发布时间:2020-12-16 01:13:15 所属栏目:百科 来源:网络整理
导读:本文是利用C#实现连连看的小例子,以供学习分享使用。如有不足之处,还望指正。 思路: 初始化布局(横竖十行十列,共100个单元格,每一个格一个按钮,背景图为水果图片,随机生成) 。 初始化对应棋盘(用二维数组表示【0表示空白,非0表示界面对象】)和页

本文是利用C#实现连连看的小例子,以供学习分享使用。如有不足之处,还望指正。

思路:

  1. 初始化布局(横竖十行十列,共100个单元格,每一个格一个按钮,背景图为水果图片,随机生成) 。
  2. 初始化对应棋盘(用二维数组表示【0表示空白,非0表示界面对象】)和页面相对应,同步操作。
  3. 判断点击的图片是否可以消掉(转化为二维数组【以水平方向,垂直方向,一个拐角,两个拐角的步骤进行判断】)。
  4. 如可以消掉,隐藏图片,增加分数。
  5. 时间限制,采用倒计时方式。

涉及知识点:

  1. 线程:Thread,后台运行时间控制【倒计时方式】。
  2. 界面闪烁:当界面中的控件较多,且有背景图时,界面就会出现闪烁【解决方式:1,双缓冲方式 2. 设置控件创建样式,统一刷新】。
  3. TableLayoutPanel:表示一个面板,它可以在一个由行和列组成的网格中对其内容进行动态布局【新增元素,设置行列,以及样式】。
  4. 资源文件:Resources 用于存放图片及其他资源。
  5. Button:FlatAppearance获取用于指示选中状态和鼠标状态的边框外观和颜色。

效果图

(一)【开始,初始化后,倒计时功能,停止功能】:

效果图(二)【时间结束】

核心算法

连连看核心算法代码如下:

  1     /// <summary>
  2     /// 连连看帮助类
  3     </summary>
  4     public class LinkHelper
  5     {
  6           7          连连看,看板
  8           9         int[,] LinkBoard { get; set; }
 10 
 11          12          连线成功事件
 13          14         event EventHandler SucClick;
 15 
 16          17          连接失败事件
 18          19          EventHandler FailClick;
 20 
 21         private int col = 10;
 22 
 23         int Col
 24         {
 25             get
 26             {
 27                 return col;
 28             }
 29 
 30             set
 31  32                 col = value;
 33  34         }
 35 
 36         int row =  37 
 38          Row
 39  40              41  42                  row;
 43  44 
 45              46  47                 row = 48  49  50 
 51          52          尝试连线
 53          54         void LinkLine(Point first,Point second)
 55  56             EventArgs e = new EventArgs();
 57             if (checkLink(first,second))
 58  59                 //连线成功
 60                 this.LinkBoard[first.X,first.Y] = 0 61                 this.LinkBoard[second.X,second.Y] =  62                 if (this.SucClick != null)
 63                 {
 64                     SucClick(this,e);
 65                 }
 66  67             else {
 68                 连线失败
 69                 this.FailClick !=  70  71                     FailClick( 72  73  74  75 
 76          77          是否赋值
 78          79         <param name="p"></param>
 80         <returns></returns>
 81         bool IsChecked(Point p)
 82  83             bool flag = false 84             if (p.X != -1 && p.Y != -1 85  86                 flag = true 87  88              flag;
 89  90 
 91         #region 核心算法
 92 
 93          94          判断是否连线成功
 95          96         <param name="a">第一个点击对象</param>
 97         <param name="b">第二个点击对象 98          99          checkLink(Point a,Point b)
100 101             if (!Point.Equals(a,b))
102 103                 this.LinkBoard[a.X,a.Y] == .LinkBoard[b.X,b.Y])
104 105                     if (a.X == b.X && horizon(a,1)">106                     {
107                         return 108                     }
109                     if (a.Y == b.Y && vertical(a,1)">110 111                         112 113                      (oneCorner(a,1)">114 115                         116 117                     else
118 119                          twoCorner(a,b);
120 121 122                 123                     如果点击的不是同一个图案,直接返回false
124                     125 126 127             128                 如果点击的是同一个位置的图案,直接返回false;
129                 130 131 132 
133         134          水平连线
135         136         <param name="a"></param>
137         <param name="b"></param>
138         139          horizon(Point a,1)">140 141             int col_start = a.Y < b.Y ? a.Y : b.Y;        获取a,b中较小的y值
142             int col_end = a.Y < b.Y ? b.Y : a.Y;          143            
144             遍历a,b之间是否通路,如果一个不是就返回false;
145             for (int i = col_start + 1; i < col_end; i++146 147                 148 149                     150 151 152             153 154 
155         156          垂直连线
157         158         159         160         161          vertical(Point a,1)">162 163             int row_start = a.X < b.X ? a.X : b.X;
164             int row_end = a.X < b.X ? b.X : a.X;
165             int i = row_start + 1; i < row_end; i++166 167                 this.LinkBoard[i,a.Y] != 168 169                     170 171 172             173 174 
175         176          一个拐角
177         178         179         180         181          oneCorner(Point a,1)">182 183             Point c =  Point(b.X,a.Y);
184             Point d =  Point(a.X,b.Y);
185             判断C点是否有元素                
186             this.LinkBoard[c.X,c.Y] == 187 188                 bool path1 = horizon(b,c) &&189                  path1;
190 191             判断D点是否有元素
192             this.LinkBoard[d.X,d.Y] == 193 194                 bool path2 = horizon(a,d) && vertical(b,d);
195                  path2;
196 197             198 199                 200 201 202 
203         204          两个拐角
205         206         207         208         209          twoCorner(Point a,1)">210 211             List<Line> ll = scan(a,1)">212             if (ll.Count == 213 214                 215 216             int i = 0; i < ll.Count; i++217 218                 Line tmpLine = ll[i];
219                 if (tmpLine.direct == 220 221 
222                     if (vertical(a,tmpLine.a) &&223 224                         225 226 227                 else 228 229                     if (horizon(a,1)"> horizon(b,1)">230 231                         232 233 234 235             236 237 
238         239          扫描A与B之间的连接点组成的线
240         241         242         243         244         private List<Line> scan(Point a,1)">245 246             List<Line> linkList = new List<Line>();
247             检测a点,b点的左侧是否能够垂直直连
248             int i = a.Y; i >= 0; i--249 250                 0 && this.LinkBoard[b.X,1)">0 && vertical(new Point(a.X,i),251 252                     linkList.Add(new Line(new Point(b.X,));
253 254 255             256             int i = a.Y; i < Col; i++257 258                 259 260                     linkList.Add(261 262 263             264             int j = a.X; j >= 0; j--265 266                 this.LinkBoard[j,a.Y] == 0 && horizon(new Point(j,a.Y),1)"> Point(j,b.Y)))
267 268                     linkList.Add(269 270 271             272             int j = a.X; j < Row; j++273 274                 275 276                     linkList.Add(277 
278 279 280 
281              linkList;
282 283 
284         #endregion
285     }
View Code

关于连连看核心算法讲解,请参考链接

源码下载

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读