C# 实现中国象棋【棋盘,棋子】
本文是利用C# 实现中国象棋的棋盘绘制,以及初始化布局,并不实现中国象棋的对弈逻辑。仅供学习参考使用。
思路:
- 绘制中国象棋棋盘,竖线九条,横线十条。再中间绘制‘楚河’,‘汉界’ 。
- 绘制棋子,然后将棋子布局在棋盘上即可。
涉及知识点:
- 用户控件:用于实现棋盘的绘制,重写 OnPaint(PaintEventArgs e) 方法。
- Matrix:封装表示几何变换的 3x3 仿射矩阵。本例中主要用于旋转绘制反方的‘汉界’。
- 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# 实现中国象棋【棋盘,棋子】的更多相关文章
- Qt绘制中国象棋棋盘
这里主要用的是#include <QPainter>里面的paintEvent void Board::paintEvent(QPaintEvent*) { QPainter painte ...
- 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...
- JavaScript中国象棋程序(2) - 校验棋子走法
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- JavaScript中国象棋程序(1) - 界面设计
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第1节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- JavaScript中国象棋程序(3) - 电脑自动走棋
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第3节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- JavaScript中国象棋程序(6) - 克服水平线效应、检查重复局面
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第6节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- 中国象棋游戏Chess(3) - 实现走棋规则
棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...
- 中国象棋游戏Chess(2) - 走棋
之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...
- HTML5之中国象棋,附带源码!
好久没写随笔了,好怀恋2013年的日子,因为现在不能回到过去了! 再见了 感谢你为我做的一切! 进入正题:HTML5之中国象棋 很小就会下象棋了, 这是象棋的测试地址:点击我吧 然后点击里面的象 ...
随机推荐
- python 读取wav 音频文件的两种方式
python 中,常用的有两种可以读取wav音频格式的方法,如下所示: import scipy from scipy.io import wavfile import soundfile as sf ...
- 你不知道的JavaScript --- 作用域相关
本篇是<你不知道的JavaScript>的读书笔记 什么是作用域? 程序离不变量,那么变量存储在哪里?程序需要时如何找到他们? 这些问题说明需要一套设计良好的规则来存储变量, 并且之后可以 ...
- 解决删除chrome注册表残留问题
将下面这个全部复制下来并粘贴到命名为“remove.reg”的文件中.双击执行即可 Windows Registry Editor Version 5.00 ;WARNING, this file ...
- Spring框架(1)---Spring入门
Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...
- API防重放机制
说说API的防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你的请求原封不动地再发送一次,两次...n次,一般正常的请求都会通过验证进入到正常逻辑中,如果 ...
- Leetcode 1-10
这篇文章介绍Leetcode1到10题的解决思路和相关代码. 1. Two sum 问题描述:给定一个整数数组,返回两个数字的索引,使它们加起来等于一个特定的目标. 例子: Given nums = ...
- Ansible--Ad-Hoc
什么是Ad-Hoc (这其实是一个概念性的名字,是相对于写Ansible playbook来说的.类似于在命令行敲入shell命令和写shell scripts两者之间的关系)... 如果我们敲入一些 ...
- 【原创】NVIC中断
(1)NVIC 全称为Next Vector Interrupt Controoler,嵌套中断向量控制器,是ARM Cortex M3的内部设备之一,任何一款基于ARM Cortex M3的 ...
- Go基础系列:defer、panic和recover
defer关键字 defer关键字可以让函数或语句延迟到函数语句块的最结尾时,即即将退出函数时执行,即便函数中途报错结束.即便已经panic().即便函数已经return了,也都会执行defer所推迟 ...
- 怎么使用小程序的data-*属性?
参考文档:小程序事件 怎么使用小程序的data-*属性?[data-type,data-num,……] dataset 在组件中可以定义数据,这些数据将会通过事件传递给 SERVICE. 书写方式: ...