本文是利用C# 实现中国象棋的棋盘绘制,以及初始化布局,并不实现中国象棋的对弈逻辑。仅供学习参考使用。

思路:

  1. 绘制中国象棋棋盘,竖线九条,横线十条。再中间绘制‘楚河’,‘汉界’ 。
  2. 绘制棋子,然后将棋子布局在棋盘上即可。

涉及知识点:

  1. 用户控件:用于实现棋盘的绘制,重写 OnPaint(PaintEventArgs e) 方法。
  2. Matrix:封装表示几何变换的 3x3 仿射矩阵。本例中主要用于旋转绘制反方的‘汉界’。
  3. GraphicsPath:表示一系列相互连接的直线和曲线。本例中主要用于绘制圆形棋子。

效果图如下:

(一)

(二)

核心代码

棋盘核心代码如下:

 protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e); //初始化数组
InitArrPieceInfo(); Graphics g = e.Graphics;
int width = this.Width;
int height = this.Height;
int padding = this.Padding.All * ;
int center = height / ;//垂直中心位置
int s_width = (width - * padding) / ;//每一条横线的间距
int s_heigth = (height - * padding) / ;//每一条竖线的间距
int start_x = padding;//起始位置
int start_y = padding;//起始位置
Pen pen = new Pen(Brushes.Black, 1.5f);
Dictionary<string, string[]> dicNums = new Dictionary<string, string[]>();
dicNums.Add("up", new string[] { "", "", "", "", "", "", "", "", "" });
dicNums.Add("down", new string[] { "九", "八", "七", "六", "五", "四", "三", "二", "一" });
Font font = new Font("宋体", , FontStyle.Regular);
for (int i = ; i < ; i++)
{
//竖线九条
Point p0 = new Point(start_x + i * s_width, start_y);
Point p1 = new Point(start_x + i * s_width, start_y + (s_heigth * ));
Point p2 = new Point(start_x + i * s_width, start_y + (s_heigth * ));
Point p3 = new Point(start_x + i * s_width, start_y + (s_heigth * ));
g.DrawLine(pen, p0, p1);
g.DrawLine(pen, p2, p3);
//上下的文字
Point p_up = new Point(start_x + i * s_width - , padding / );
Point p_down = new Point(start_x + i * s_width - , start_y + (s_heigth * ) + padding / );
g.DrawString(dicNums["up"][i], font, Brushes.Black, p_up);
g.DrawString(dicNums["down"][i], font, Brushes.Black, p_down);
//数组赋值
for (int j = ; j < ; j++)
{
Point absLocation = ArrPiece[i, j].AbsoluteLocation;
absLocation.X = start_x + i * s_width;
ArrPiece[i, j].AbsoluteLocation = absLocation;
}
}
for (int i = ; i < ; i++)
{
//横线十条
Point p0 = new Point(start_x, start_y + i * s_heigth);
Point p1 = new Point(start_x + s_width * , start_y + i * s_heigth);
g.DrawLine(pen, p0, p1);
//数组赋值
for (int j = ; j < ; j++)
{
Point absLocation = ArrPiece[j, i].AbsoluteLocation;
absLocation.Y = start_y + i * s_heigth;
ArrPiece[j, i].AbsoluteLocation = absLocation;
}
}
//绘制九宫格
for (int i = ; i < ; i++)
{
Point p0 = new Point(start_x + ( + i * ) * s_width, start_y);
Point p1 = new Point(start_x + ( - i * ) * s_width, start_y + (s_heigth * ));
Point p2 = new Point(start_x + ( + i * ) * s_width, start_y + (s_heigth * ));
Point p3 = new Point(start_x + ( - i * ) * s_width, start_y + (s_heigth * ));
g.DrawLine(pen, p0, p1);
g.DrawLine(pen, p2, p3);
} //兵和卒处有拐角,从左往右
for (int i = ; i < ; i++)
{
int p_x = start_x + * i * s_width;
int p_y = start_y + * s_heigth;
DrawCorner(g, pen, p_x, p_y);//兵
p_y = start_y + * s_heigth;
DrawCorner(g, pen, p_x, p_y);//卒
}
//炮处的拐角,从左往右
for (int i = ; i < ; i++)
{
int p_x = start_x + ( + * i) * s_width;
int p_y = start_y + * s_heigth;
DrawCorner(g, pen, p_x, p_y);//炮
p_y = start_y + * s_heigth;
DrawCorner(g, pen, p_x, p_y);//炮
}
//绘制楚河汉界
Point p_0 = new Point( * s_width, center - );
Point p_1 = new Point( * s_width, center + );
font = new Font("方正隶二繁体", , FontStyle.Regular);
g.DrawString("楚河", font, Brushes.Black, p_0);
Matrix mtxSave = g.Transform;
Matrix mtxRotate = g.Transform;
mtxRotate.RotateAt(, p_1);
g.Transform = mtxRotate;
g.DrawString("汉界", font, Brushes.Black, p_1);
g.Transform = mtxSave;
//绘制外边框
g.DrawRectangle(pen, , , width - , height - );
g.DrawRectangle(pen, , , width - , height - );
g.DrawRectangle(pen, , , width - , height - );
}

棋子核心代码如下:

         protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
GraphicsPath gPath = new GraphicsPath();
// Set a new rectangle to the same size as the button's ClientRectangle property.
Rectangle rectangle = this.ClientRectangle;
g.DrawEllipse(new Pen(this.FlatAppearance.BorderColor), rectangle);
gPath.AddEllipse(rectangle); // Set the button's Region property to the newly created circle region.
this.Region = new Region(gPath);
Rectangle inRect = new Rectangle(, , this.Width - , this.Height - );
g.FillEllipse(new SolidBrush(this.BackColor), rectangle);
g.DrawEllipse(new Pen(Color.Black,), inRect); Font font = new Font("楷体", , FontStyle.Regular);
g.DrawString(this.Text, font, new SolidBrush(this.ForeColor), ,);
}

源码下载链接

C# 实现中国象棋【棋盘,棋子】的更多相关文章

  1. Qt绘制中国象棋棋盘

    这里主要用的是#include <QPainter>里面的paintEvent void Board::paintEvent(QPaintEvent*) { QPainter painte ...

  2. 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...

  3. JavaScript中国象棋程序(2) - 校验棋子走法

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  4. JavaScript中国象棋程序(1) - 界面设计

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第1节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  5. JavaScript中国象棋程序(3) - 电脑自动走棋

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第3节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  6. JavaScript中国象棋程序(6) - 克服水平线效应、检查重复局面

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第6节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  7. 中国象棋游戏Chess(3) - 实现走棋规则

    棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...

  8. 中国象棋游戏Chess(2) - 走棋

    之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...

  9. HTML5之中国象棋,附带源码!

    好久没写随笔了,好怀恋2013年的日子,因为现在不能回到过去了! 再见了 感谢你为我做的一切! 进入正题:HTML5之中国象棋 很小就会下象棋了,  这是象棋的测试地址:点击我吧   然后点击里面的象 ...

随机推荐

  1. 部署 HTTPS 访问 ( https:// )

    简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比http协议安全. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是4 ...

  2. Android--使用剪切板在Activity中传值

    在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的任何程序都可以从剪切板中获取 ...

  3. centos7非centos标准服务 /etc/init.d/service_name start || stop 启动异常

    公司自己写的java程序,在centos7系统执行/etc/init.d/service_name start||stop的时候报错: grafana二次开发的程序 [root@docp1 init. ...

  4. python练习四—简单的聊天软件

    python最强大的是什么?库支持!!有了强大的库支持,一个简单的聊天软件实现就更简单了,本项目思路如下 # 项目思路 1. 服务器的工作 * 初始化服务器 * 新建一个聊天房间 * 维护一个已链接用 ...

  5. windows上python的安装

    一,python3.X的点击式安装 第一次写博客,我就是想记载一下自己对Python的探索过程,理解过程,学习过程,我接触python已经一年多了,但是真正的学习摸索是半年前,现在才走上正轨,这是我刚 ...

  6. python学习笔记之自定义函数的导入

    python可以将自己编写的类放在py文件中,然后由其他程序调用,今天分享下:如何在shell中从文件引用自定义类和函数,下面是具体的过程: 第一步将你编写的文件声明编码类型 然后将你编写的文件保存为 ...

  7. date、sleep和usleep命令

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 date命令 date用于获取和设置操作系统的时间,还 ...

  8. Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  9. MySQL之实现Oracle中的rank()函数的功能

      假设表格为student, 数据如下:   我们要在MySQL中实现Oracle中的rank()函数功能,即组内排序,具体来说: 就是对student表中按照课程(course)对学生(name) ...

  10. Redis学习笔记(3)-XShell连接CentOSMini,并安装Redis

    使用XShell远程连接CentOSMini 点击download下载XShell5.0. 下载之后安装.配置XShell. 配置XShell前的准备 打开VM,启动CentOSMini.CentOS ...