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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...