C# 实现连连看功能
发布时间:2020-12-16 01:13:15 所属栏目:百科 来源:网络整理
导读:本文是利用C#实现连连看的小例子,以供学习分享使用。如有不足之处,还望指正。 思路: 初始化布局(横竖十行十列,共100个单元格,每一个格一个按钮,背景图为水果图片,随机生成) 。 初始化对应棋盘(用二维数组表示【0表示空白,非0表示界面对象】)和页
本文是利用C#实现连连看的小例子,以供学习分享使用。如有不足之处,还望指正。 思路:
涉及知识点:
效果图 (一)【开始,初始化后,倒计时功能,停止功能】: 效果图(二)【时间结束】 核心算法 连连看核心算法代码如下: 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 } 关于连连看核心算法讲解,请参考链接 源码下载 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |