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之中国象棋 很小就会下象棋了, 这是象棋的测试地址:点击我吧 然后点击里面的象 ...
随机推荐
- ubuntu 16.04 python版本切换(python2和python3)
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternati ...
- JavaScript的屏幕输出及时间函数
Js屏幕输出 重定向页面输出: 更改输出流,如果在加载时使用则会正常排序,如果在HTML加载完成后使用,如点击事件,则会全部覆盖原HTML的内容. 1 <script> 2 //参数为输出 ...
- Spring Boot到底是怎么运行的,你知道吗?
导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较流行的微服务框架Spring ...
- 微信小程序入门(三)
11.开发框架基本介绍 四个组成部分,其它三个前面介绍过了,主要WXS: WXS:对wxml增强的一种脚本语言,可以对请求的数据进行filter或者做计算处理,帮助wxml快速构建出页面结构. 12. ...
- JwtBearer认证
ASP.NET Core 认证与授权[4]:JwtBearer认证 在现代Web应用程序中,通常会使用Web, WebApp, NativeApp等多种呈现方式,而后端也由以前的Razor渲染HT ...
- leetcode — trapping-rain-water
/** * Source : https://oj.leetcode.com/problems/trapping-rain-water/ * * Created by lverpeng on 2017 ...
- 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置
介绍 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务中网关和子服务如何使用统一的权限认证 主要介绍内容为: 1.子服务如 ...
- Linux comm命令求出文件的交集、差集
A(1,2,3)和B(3,4,5),A和B的交集是3,A对B的差集是1和2,B对A的差集是4和5,A和B求差的结果是1.2.4.5. 在Linux中可以使用comm命令求出这些集. [root@xue ...
- 建了个QQ群,不定期分享一些资料,欢迎加入
技术源于生活,大家一起进阶 Java学习交流QQ群:603654340 大数据学习交流QQ群:217770236 感谢您的来访,不妨关注一下我吧……
- 在AspNetCore中扩展Log系列 - 介绍开源类库的使用(一)
转发时请注明原创作者及地址,否则追究责任. 原创:alunchen 当创建AspNetCore项目时 当我们创建一个AspNetCore项目时,需要我们手动添加Log: services.AddLog ...