C#實現十五子游戲

来源:http://www.cnblogs.com/hhwang/archive/2017/05/07/6820883.html
-Advertisement-
Play Games

最近由於工作需要,做一個C#的簡單程式。學習了一些基礎東西先記下來。 主要有: 1.生成初始框架 2.打亂順序 3.游戲部分,點擊按鈕後與空白部分交換的只是Text和Visible部分 ...


最近由於工作需要,做一個C#的簡單程式。學習了一些基礎東西先記下來。

主要有:

1.生成初始框架

2.打亂順序

3.游戲部分,點擊按鈕後與空白部分交換的只是Text和Visible部分

  1 const int N = 4;  //行列數
  2 Button[,] buttons = new Button[N, N];
  3 
  4 private void Form1_Load(object sender, EventArgs e)
  5 {
  6     //產生所有按鈕
  7     GenerateAllButtons();
  8 }
  9 
 10 private void button1_Click(object sender, EventArgs e)
 11 {
 12     //打亂順序
 13     Shuffle();
 14 }
 15 
 16 //生成按鈕
 17 void GenerateAllButtons()
 18 {
 19     int x0 = 100, y0 = 10, w = 45, d = 50;
 20      for( int row = 0; row < N; row++ )
 21         for ( int col = 0; col < N; col++ )
 22         {
 23             int num = row * N + col;    //數字編號
 24             Button btn = new Button();
 25             btn.Text = (num + 1).ToString();
 26             btn.Top = y0 + row * d;
 27             btn.Left = x0 + col * d;
 28             btn.Width = w;
 29             btn.Height = w;
 30             btn.Visible = true;
 31             btn.Tag = row * N + col;    //button位置
 32 
 33             //註冊button點擊事件
 34             btn.Click += new EventHandler(btn_Click);
 35 
 36             buttons[row, col] = btn;
 37             this.Controls.Add(btn);
 38         }
 39     buttons[N - 1, N - 1].Visible = false;
 40 }
 41 
 42 void Shuffle()
 43 {
 44     Random rnd = new Random();
 45     for (int i = 0; i < 100; i++ )
 46     {
 47         int a = rnd.Next(N);
 48         int b = rnd.Next(N);
 49         int c = rnd.Next(N);
 50         int d = rnd.Next(N);
 51         Swap(buttons[a, b], buttons[c, d]);
 52     }
 53 }
 54 // 進行游戲
 55 private void btn_Click(object sender, EventArgs e)
 56 {
 57     Button btn = sender as Button;
 58     Button blank = FindHiddenButton();
 59 
 60     // 判斷是否相鄰
 61     if ( IsNeighbor(btn, blank) )
 62     {
 63         Swap(btn, blank);
 64         blank.Focus();
 65     }
 66 
 67     // 判斷是否完成
 68     if ( ResultIsOk() )
 69     {
 70         MessageBox.Show("OK!");
 71     }
 72 }
 73 
 74 // 查找空白按鈕
 75 Button FindHiddenButton()
 76 {
 77     for (int row = 0; row < N; row++)
 78         for (int col = 0; col < N; col++)
 79         {
 80             if (!buttons[row,col].Visible)
 81             {
 82                 return buttons[row, col];
 83             }
 84         }
 85     return null;
 86 }
 87 
 88 // 判斷是否相鄰
 89 bool IsNeighbor(Button btnA, Button btnB)
 90 {
 91     int a = (int)btnA.Tag;
 92     int b = (int)btnB.Tag;
 93     int r1 = a / N, c1 = a % N;
 94     int r2 = b / N, c2 = b % N;
 95 
 96     if ( (r1 == r2 && (c1 == c2 + 1 || c1 == c2 - 1))
 97         || (c1 == c2 && (r1 == r2 + 1 || r1 == r2 - 1)) )
 98         return true;
 99     return false;
100 }
101 
102 //檢查是否完成
103 bool ResultIsOk()
104 {
105     for (int r = 0; r < N; r++)
106         for (int c = 0; c < N; c++)
107         {
108             if (buttons[r, c].Text != (r * N + c + 1).ToString())
109             {
110                 return false;
111             }
112         }
113     return true;
114 }
115 //交換兩個按鈕
116 void Swap(Button btna, Button btnb)
117 {
118     string t = btna.Text;
119     btna.Text = btnb.Text;
120     btnb.Text = t;
121 
122     bool v = btna.Visible;
123     btna.Visible = btnb.Visible;
124     btnb.Visible = v;
125 }

 


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

-Advertisement-
Play Games
更多相關文章
  • 一轉眼務農6年了,呆過大公司也去過小作坊,碼農的人生除了摳腚還是摳腚。在所有呆過的公司里,感覺項目沒有不延期的,真的是因為自己不努力嗎?也沒有呀!上班不怎麼聊QQ回家也很少看動作片,還搞過幾次通宵擼碼的。 以前總感覺是項目經理把工時估少了,後來自己也做過項目管理,按照以往的經歷估工時,做到最後還是會 ...
  • 1 public static class DataSetUtilities { 2 public static void SendDataSet(DataSet ds) { 3 if (ds == null) { 4 throw new ArgumentException("SendDataSet... ...
  • 什麼是架構,談下你項目中用的是什麼樣的架構?!! What?這個問題怎麼熟悉!!原來是在面試的時候經常面試官會問出這個問題。 架構是項目系統實施的整個思維過程。他不是一件容易的事。 需要架構師能夠充分把握業務需求,對行業及項目具有前瞻性的眼光,對抽象思維有精深的能力,應對變化有足夠的反應,這樣才... ...
  • 《Effective C#》快速筆記 - C# 中的動態編程 靜態類型和動態類型各有所長,靜態類型能夠讓編譯器幫你找出更多的錯誤,因為編譯器能夠在編譯時進行大部分的檢查工作。C# 是一種靜態類型的語言,不過它加入了動態類型的語言特性,可以更高效地解決問題。 本系列 《Effective C#》快速筆 ...
  • 背水一戰 Windows 10 之 控制項(ScrollViewer 特性): Chaining - 鎖鏈, Rail - 軌道, Inertia - 慣性, Snap - 對齊, Zoom - 縮放 ...
  • 根據一個給定經緯度的點和距離,搜索附近5公裡範圍的地點 –合理利用演算法 功能需求:需要查詢一個站點(已知該站點經緯度)5公裡範圍內的其它站點。 方 法 一 :對每條記錄,去進行遍歷,跟資料庫中的每一個點進行距離計算,當距離小於5公裡時,認為匹配(效率極其低下,耗時長)。 方 法 二 :先過濾出大概的 ...
  • "沒有時間了!" 本次學習mongoDB,參考瞭如下文章: Using MongoDB with ASP.NET Core – Part II (Implementation) 來自 MongoDB學習筆記(二) 通過samus驅動實現基本數據操作 來自 略去如何安裝和調試MongoBD,可參見上述... ...
  • 我遇到問題產生的原因:資料庫表的某個欄位為不能為空。在修改實體屬性的時候,實體對應的表中不能為空的欄位為null。 詳情: 資料庫: c #: 錯誤代碼: 正確代碼: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...