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之中国象棋 很小就会下象棋了, 这是象棋的测试地址:点击我吧 然后点击里面的象 ...
随机推荐
- Intellij IDEA神器居然还有这些小技巧
概述 Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜.出于对Intellij IDEA的喜爱,我决定写一个与其相关的专栏或者系列,把一些好用的Intel ...
- Java高阶回调,回调函数的另一种玩法
工具类package com.sctek; import java.lang.reflect.Field; import android.os.CountDownTimer;import androi ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- Android切换横竖屏不销毁前台Activity,也不影响后台Activity
在切换屏幕方向的时候,Activity默认会走销毁->重建的生命周期,而有时候我们不希望如此,就需要做些额外的设置了: 1.在AndroidMainifest.xml中对应的Activity标签 ...
- Spring系列之IOC的原理及手动实现
目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...
- TOMCAT启动流程分析
------------------tomcat服务开启----------2014-9-26 9:17:07 org.apache.catalina.core.AprLifecycleListene ...
- MFC原理第四讲.动态创建机制
MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...
- WebSocket 协议
1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用到 HTTP 轮询的方式.围绕轮询产生了 “短轮询” 和 “长轮询”. 短轮询 浏览器赋予了脚本网络通信的编程 ...
- MAC 地址(单播、组播、广播地址分类)
简介 一个制造商在生产制造网卡之前,必须先向 IEEE 注册,以获取到一个长度为 24bit 的厂商代码,也称为 OUI(Organizationally-Unique Identifier).制造商 ...
- 分享一个爬取HUST(哈理工)学生成绩的Python程序(OCR自动识别验证码)
Python版本:3.5.2 日期:2018/1/21 __Author__ = "Lance#" # -*- coding = utf-8 -*- from urllib imp ...