C# 实现连连看功能

C# 实现连连看功能,第1张

概述利用C#实现连连看功能

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

思路:

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

涉及知识点:

线程:Thread,后台运行时间控制【倒计时方式】。界面闪烁:当界面中的控件较多,且有背景图时,界面就会出现闪烁【解决方式:1,双缓冲方式 2. 设置控件创建样式,统一刷新】。tableLayoutPanel:表示一个面板,它可以在一个由行和列组成的网格中对其内容进行动态布局【新增元素,设置行列,以及样式】。资源文件:Resources 用于存放图片及其他资源。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                     else118 119                          twoCorner(a,b);120 121 122                 123                     如果点击的不是同一个图案,直接返回false124                     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         #endregion285     }
VIEw Code

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

源码下载

总结

以上是内存溢出为你收集整理的C# 实现连连看功能全部内容,希望文章能够帮你解决C# 实现连连看功能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1213805.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存