加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# 实现中国象棋【棋盘,棋子】

发布时间:2020-12-16 01:13:18 所属栏目:百科 来源:网络整理
导读:本文是利用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 = .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 - 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[]>();
 19             dicNums.Add("up",1)">new string[9] { 123456789" });
 20             dicNums.Add(down 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 = 5 28                 Point p3 = 9 29                 g.DrawLine(pen,p0,p1);
 30  31                 上下的文字
 32                 Point p_up = new Point(start_x + i * s_width - 5,padding / 2 33                 Point p_down = 9) + padding / 3 34                 g.DrawString(dicNums[][i],font,Brushes.Black,p_up);
 35                 g.DrawString(dicNums[ 36                 数组赋值
 37                 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             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,1)"> 49  50                  51                 9; j++ 52  53                     Point absLocation = ArrPiece[j,i].AbsoluteLocation;
 54                     absLocation.Y = start_y + i * s_heigth;
 55                     ArrPiece[j,i].AbsoluteLocation = 56  57  58             绘制九宫格
 59             2; i++ 60  61                 Point p0 = new Point(start_x + (3 + i * 2) * 62                 Point p1 = 5 - i * 2) * s_width,1)"> 63                 Point p2 = 7 64                 Point p3 =  65  66  67  68 
 69             兵和卒处有拐角,从左往右
 70             5; i++ 71  72                 int p_x = start_x + 2 * i * 73                 int p_y = start_y + 3 * 74                 DrawCorner(g,pen,p_x,p_y);
 75                 p_y = start_y + 6 * 76                 DrawCorner(g,1)">卒
 77  78             炮处的拐角,从左往右
 79              80  81                 int p_x = start_x + (1 + 6 * i) * 82                 2 * 83                 DrawCorner(g,1)">炮
 84                 p_y = start_y + 7 * 85                 DrawCorner(g,1)"> 86  87             绘制楚河汉界
 88             Point p_0 = new Point(2 * s_width,center - 25 89             Point p_1 = 7 * s_width,center +  90             font = 方正隶二繁体30 91             g.DrawString(楚河 92             Matrix mtxSave = g.Transform;
 93             Matrix mtxRotate = 94             mtxRotate.RotateAt(180 95             g.Transform = mtxRotate;
 96             g.DrawString(汉界 97             g.Transform = mtxSave;
 98             绘制外边框
 99             g.DrawRectangle(pen,1)">3,width - 6,height - 6100             g.DrawRectangle(pen,1)">10,1)">10101             g.DrawRectangle(pen,1)">7,1)">14,1)">14102         }
View Code

棋子核心代码如下:

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


源码下载链接

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读