本文是利用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# 实现连连看功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)