C# 實現中國象棋【棋盤,棋子】

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

本文是利用C# 實現中國象棋的棋盤,棋子繪製,以及初始化佈局,並不實現中國象棋的對弈邏輯 ...


本文是利用C# 實現中國象棋的棋盤繪製,以及初始化佈局,並不實現中國象棋的對弈邏輯。僅供學習參考使用。

思路:

  1. 繪製中國象棋棋盤,豎線九條,橫線十條。再中間繪製‘楚河’,‘漢界’ 。
  2. 繪製棋子,然後將棋子佈局在棋盤上即可。

涉及知識點:

  1. 用戶控制項:用於實現棋盤的繪製,重寫 OnPaint(PaintEventArgs e) 方法。
  2. Matrix:封裝表示幾何變換的 3x3 仿射矩陣。本例中主要用於旋轉繪製反方的‘漢界’。
  3. GraphicsPath:表示一系列相互連接的直線和曲線。本例中主要用於繪製圓形棋子。

效果圖如下:(一)

(二)

核心代碼

棋盤核心代碼如下:

  1 protected override void OnPaint(PaintEventArgs e)
  2         {
  3             base.OnPaint(e);
  4 
  5             //初始化數組
  6             InitArrPieceInfo();
  7 
  8             Graphics g = e.Graphics;
  9             int width = this.Width;
 10             int height = this.Height;
 11             int padding = this.Padding.All * 20;
 12             int center = height / 2;//垂直中心位置
 13             int s_width = (width - 2 * padding) / 8;//每一條橫線的間距
 14             int s_heigth = (height - 2 * padding) / 9;//每一條豎線的間距
 15             int start_x = padding;//起始位置
 16             int start_y = padding;//起始位置
 17             Pen pen = new Pen(Brushes.Black, 1.5f);
 18             Dictionary<string, string[]> dicNums = new Dictionary<string, string[]>();
 19             dicNums.Add("up", new string[9] { "1", "2", "3", "4", "5", "6", "7", "8", "9" });
 20             dicNums.Add("down", new string[9] { "", "", "", "", "", "", "", "", "" });
 21             Font font = new Font("宋體", 12, FontStyle.Regular);
 22             for (int i = 0; i < 9; i++)
 23             {
 24                 //豎線九條
 25                 Point p0 = new Point(start_x + i * s_width, start_y);
 26                 Point p1 = new Point(start_x + i * s_width, start_y + (s_heigth * 4));
 27                 Point p2 = new Point(start_x + i * s_width, start_y + (s_heigth * 5));
 28                 Point p3 = new Point(start_x + i * s_width, start_y + (s_heigth * 9));
 29                 g.DrawLine(pen, p0, p1);
 30                 g.DrawLine(pen, p2, p3);
 31                 //上下的文字
 32                 Point p_up = new Point(start_x + i * s_width - 5, padding / 2);
 33                 Point p_down = new Point(start_x + i * s_width - 5, start_y + (s_heigth * 9) + padding / 3);
 34                 g.DrawString(dicNums["up"][i], font, Brushes.Black, p_up);
 35                 g.DrawString(dicNums["down"][i], font, Brushes.Black, p_down);
 36                 //數組賦值
 37                 for (int j = 0; j < 10; j++)
 38                 {
 39                     Point absLocation = ArrPiece[i, j].AbsoluteLocation;
 40                     absLocation.X = start_x + i * s_width;
 41                     ArrPiece[i, j].AbsoluteLocation = absLocation;
 42                 }
 43             }
 44             for (int i = 0; i < 10; i++)
 45             {
 46                 //橫線十條
 47                 Point p0 = new Point(start_x, start_y + i * s_heigth);
 48                 Point p1 = new Point(start_x + s_width * 8, start_y + i * s_heigth);
 49                 g.DrawLine(pen, p0, p1);
 50                 //數組賦值
 51                 for (int j = 0; j < 9; j++)
 52                 {
 53                     Point absLocation = ArrPiece[j, i].AbsoluteLocation;
 54                     absLocation.Y = start_y + i * s_heigth;
 55                     ArrPiece[j, i].AbsoluteLocation = absLocation;
 56                 }
 57             }
 58             //繪製九宮格
 59             for (int i = 0; i < 2; i++)
 60             {
 61                 Point p0 = new Point(start_x + (3 + i * 2) * s_width, start_y);
 62                 Point p1 = new Point(start_x + (5 - i * 2) * s_width, start_y + (s_heigth * 2));
 63                 Point p2 = new Point(start_x + (3 + i * 2) * s_width, start_y + (s_heigth * 7));
 64                 Point p3 = new Point(start_x + (5 - i * 2) * s_width, start_y + (s_heigth * 9));
 65                 g.DrawLine(pen, p0, p1);
 66                 g.DrawLine(pen, p2, p3);
 67             }
 68 
 69             //兵和卒處有拐角,從左往右
 70             for (int i = 0; i < 5; i++)
 71             {
 72                 int p_x = start_x + 2 * i * s_width;
 73                 int p_y = start_y + 3 * s_heigth;
 74                 DrawCorner(g, pen, p_x, p_y);//
 75                 p_y = start_y + 6 * s_heigth;
 76                 DrawCorner(g, pen, p_x, p_y);//
 77             }
 78             //炮處的拐角,從左往右
 79             for (int i = 0; i < 2; i++)
 80             {
 81                 int p_x = start_x + (1 + 6 * i) * s_width;
 82                 int p_y = start_y + 2 * s_heigth;
 83                 DrawCorner(g, pen, p_x, p_y);//
 84                 p_y = start_y + 7 * s_heigth;
 85                 DrawCorner(g, pen, p_x, p_y);//
 86             }
 87             //繪製楚河漢界
 88             Point p_0 = new Point(2 * s_width, center - 25);
 89             Point p_1 = new Point(7 * s_width, center + 20);
 90             font = new Font("方正隸二繁體", 30, FontStyle.Regular);
 91             g.DrawString("楚河", font, Brushes.Black, p_0);
 92             Matrix mtxSave = g.Transform;
 93             Matrix mtxRotate = g.Transform;
 94             mtxRotate.RotateAt(180, p_1);
 95             g.Transform = mtxRotate;
 96             g.DrawString("漢界", font, Brushes.Black, p_1);
 97             g.Transform = mtxSave;
 98             //繪製外邊框
 99             g.DrawRectangle(pen, 3, 3, width - 6, height - 6);
100             g.DrawRectangle(pen, 5, 5, width - 10, height - 10);
101             g.DrawRectangle(pen, 7, 7, width - 14, height - 14);
102         }
View Code

棋子核心代碼如下:

 1         protected override void OnPaint(PaintEventArgs e)
 2         {
 3             base.OnPaint(e);
 4             Graphics g = e.Graphics;
 5             GraphicsPath gPath = new GraphicsPath();
 6             // Set a new rectangle to the same size as the button's ClientRectangle property.
 7             Rectangle rectangle = this.ClientRectangle;
 8             g.DrawEllipse(new Pen(this.FlatAppearance.BorderColor), rectangle);
 9             gPath.AddEllipse(rectangle);
10 
11             // Set the button's Region property to the newly created  circle region.
12             this.Region = new Region(gPath);
13             Rectangle inRect = new Rectangle(2, 2, this.Width - 4, this.Height - 3);
14             g.FillEllipse(new SolidBrush(this.BackColor), rectangle);
15             g.DrawEllipse(new Pen(Color.Black,2), inRect);
16 
17             Font font = new Font("楷體", 25, FontStyle.Regular);
18             g.DrawString(this.Text, font, new SolidBrush(this.ForeColor), 0,5);
19         }
View Code


源碼下載鏈接

 


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

-Advertisement-
Play Games
更多相關文章
  • 成功登錄進入CentOS系統之後,我們首先看到的桌面就是GNOME圖形界面,下麵來看一下相關的基本操作。 個性化設置 1,設置屏幕解析度 進入菜單 2,更換桌面背景 進入下麵菜單。 選擇一張背景圖片,然後點擊OK。 3,更改視窗打開方式 預設每次都打開一個新的視窗,這樣看起來比較凌亂,如下圖。 進入 ...
  • 自動獲取動態IP地址 設置靜態IP地址 ...
  • 1.只顯示當前目錄 找到位置: 將這兩個小寫的w換成大寫W,然後source ~/.bashrc即可 2.終端顏色美化 vim ~/.bashrc 然後下麵這行的註釋去掉,打開這個變數的開關,即可使用彩色的命令行提示符 關閉force_color_prompt的的效果如下圖: 而打開後的效果如下圖: ...
  • memcached Memcached多用於作為資料庫的前端cache使用,從而減少資料庫的負載。Memcached是一種記憶體緩存,用於存儲鍵值對。 工作流程: (1) 檢查客戶端請求的數據是否在Memcached中,如果在,把請求的數據返回給客戶端。 (2) 客戶端請求的數據不在Memcached ...
  • nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時間段的訪問次數. ngx_http_limit_conn_module:該模塊用於限制每個定義的密鑰的連接數,特別是單個IP​​地址的連接數.使用limit ...
  • 解決win7無法打開chm格式文件的問題。(一)、簡單方法(本人用的這個)1.打開chm2.win7提示安全問題3.chm無法顯示內容4.關閉chm5.右鍵點擊chm,點擊“解除鎖定”,ok 沒有“解除鎖定”,暈。。。請往下6.右鍵點擊chm,點擊“壓縮到*.rar”,壓縮chm7.雙擊生成的壓縮文 ...
  • IdentityServer4 是一個提供 認證服務,單點登錄/登出(SSO),API訪問控制,聯合認證通道的可定製、免費商業支持的框架。 ...
  • .NET Core 2.0來了,你還等什麼?使用VS Code開發一個基於.NET Core 2.0的 MVC Web應用程式,時尚又閃耀的CMS就要出場啦。好,我這就要開始趟坑了,要不要和我一起哇? ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...