C# 實現連連看功能

来源:http://www.cnblogs.com/hsiang/archive/2017/07/03/7108274.html
-Advertisement-
Play Games

本文是利用C#實現連連看的小例子,以供學習分享使用。 思路: 涉及知識點: 效果圖圖下(一)【開始,初始化後,倒計時功能,停止功能】: 效果圖(二)【時間結束】 核心代碼如下: 1 /// <summary> 2 /// 連連看幫助類 3 /// </summary> 4 public class ...


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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在有這麼一個場景:我是一個很忙的大老闆,我有100個手機,手機來信息了,我的秘書就會告訴我“老闆,你的手機來信息了。”我很生氣,我的秘書就是這樣子,每次手機來信息就只告訴我來信息了,老闆趕緊去看。但是她從來不把話說清楚:到底是哪個手機來信息啊!我可有100個手機啊!於是,我只能一個一個手機去查看, ...
  • 管理員許可權運行“命令提示符” 輸入:netsh winsock reset 然後重啟電腦即可 ...
  • 本文目錄: 14.1 按下電源和bios階段 14.2 MBR和各種bootloader階段 14.2.1 boot loader 14.2.2 分區表 14.2.3 採用VBR/EBR方式引導操作系統 14.3 grub階段 14.3.1 使用grub2時的啟動過程 14.3.2 使用傳統grub ...
  • 1、故障現象 CentOS 6.5重啟後顯示grub loading stage2,屏幕顯示一直停在這個地方。 2、故障原因 系統啟動找不到引導盤 3、解決辦法 BMC中通過虛擬光碟機掛載同一系統鏡像,重新啟動 選擇rescue installed system 進入Shell腳本輸入界面後輸入命令 ...
  • unix是一個多用戶多任務的操作系統。早期電腦昂貴,所以當時使用便宜的設備連接到電腦上(當時還沒有鍵盤和顯示器,使用紙帶和卡片來輸入輸出)來使用操作系統,這個便宜的設備就是終端,也可以認為終端是一種控制台。所以可以認為電腦本身是console終端,便宜的連接設備是物理終端pty。 Linux是類un ...
  • vmware12上安裝的CentOs6.8,最終實現物理機上的windows10能正常訪問CentOs上的FTP伺服器。 一、查看是否安裝有ftp相關的安裝包。 # rpm -qa | grep vsftpd //ftp的安裝包就是vsftpd 查看到我的系統中沒有安裝相關的包,所以先把安裝包裝上。 ...
  • " 1、批量修改文件名 " " 2、批量重啟服務 " " 3、全盤搜索指定文件 " "3.1、全盤搜索名稱為 mm.jpg 的文件,獲取其全路徑" "3.2、查找系統中所有名稱以 .docx 結尾的文件" " 4、調用可執行程式 " "4.1、調用系統自帶的應用程式" "4.2、調用第三方應用程式" ...
  • 需求:磁碟D的文件夾A需同步到磁碟E 步驟: 1.在磁碟E中新建公文包B 2.將D盤的文件夾A複製到公文包B 3.修改文件夾A中的內容 4.選中公文包B,右鍵"全部更新" ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...