您的位置:首页 > 其它

中国象棋程序的设计与实现(十)--棋盘的定义和绘制

2015-10-22 00:00 537 查看
本篇简要介绍棋盘类的定义、棋盘的关键属性、棋盘绘制算法的骨架。

棋盘的详细绘制算法等内容,我们将在接下来的几篇进行详细介绍。

棋盘类的定义

public abstract class ChessBoard extends JPanel


棋盘是一个继承自JLabel的图形界面组件,当在界面展示,看起来比较美观。

细心的读者注意到,abstract表明 这是一个抽象类。

本中国象棋程序,实现了联网对战、残局打谱、全局打谱、人机对弈等多种形式的功能。

不同的功能,它们所对应的棋盘有一些差别,因此,将共同的功能和设计,抽象为一个类。

棋盘类的关键属性

// 棋子点,共90个,横9*纵10
public ChessPoint chessPoints[][];

// 红方16个棋子
public ChessPiece 红車1, 红車2, 红馬1, 红馬2, 红相1, 红相2, 红帥, 红仕1, 红仕2, 红兵1, 红兵2,
红兵3, 红兵4, 红兵5, 红炮1, 红炮2;

// 黑方16个棋子
public ChessPiece 黑車1, 黑車2, 黑馬1, 黑馬2, 黑象1, 黑象2, 黑將, 黑士1, 黑士2, 黑卒1, 黑卒2,
黑卒3, 黑卒4, 黑卒5, 黑炮1, 黑炮2;


构造棋盘对象

/**
* 构造棋盘
*/
public ChessBoard() {
super();
// 不可忽视
setLayout(null);
// 设置棋盘的背景色
setBackground(getBackgroundColor());
// 鼠标适配器
addMouseListener(getMouseAdapter());

// 初始化棋子点
chessPoints = new ChessPoint[X + 1][Y + 1];
for (int i = 1; i <= X; i++) {
for (int j = 1; j <= Y; j++) {
chessPoints[i][j] = new ChessPoint(i * UNIT_WIDTH, j
* UNIT_HEIGHT);
}
}
// 为32个棋子分配空间
init32Pieces();
// 初始化32个棋子的工具提示
init32PiecesTooltip();

// 棋谱类
chessManual = new ChessManual(this);

// 初始化炮和兵的位置,以便画出标记
initPBFlag();

// 棋子闪烁线程

winkThread = new Thread(this);
winkThread.start();
}


到目前的讲解,读者朋友只能读懂上面的一部分代码。

棋盘是GUI界面的重要的关键的组成部分,和其它模块交互比较多,理解起来有点费事。

不过,不要紧,先读下去,等了解了更多信息后,再回头来读。

绘制棋盘

/**
* 绘制棋盘:10条横线、9条纵线、炮兵卒14个标记、九宫格、楚河漢界
*
* 根据需要还绘制棋子移动的标记
*/
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// 绘制棋盘背景
drawBackgroundImage(g);

Graphics2D g2 = (Graphics2D) g;
// 兵、卒、炮标记笔画
BasicStroke bsFlag = new BasicStroke(2);
// 楚河汉界、棋盘边框笔画
BasicStroke bsLine = new BasicStroke(2);

// 棋盘线笔画
BasicStroke bs1 = new BasicStroke(1);

// 绘制直线
drawLines(g2, bsLine, bs1);
// 绘制九宫格
drawJiuGongLines(g2, bs1);
// 绘制楚河漢界
drawChuheHanjieString(g2);
// 绘制炮和兵标记
drawPaoBingFlag(g2, bsFlag);

// 如果有棋子移动,画出2个提示框,每个提示框由8条线组成
drawMoveFlag(g2);
// 绘制可选走法的提示框
drawWillMoveFlag(g2);

// 设置字体和线宽,为画坐标做准备
BasicStroke bsOld = new BasicStroke(1);
g2.setStroke(bsOld);
g2.setFont(new Font("宋体", Font.PLAIN, 14));
g2.setColor(new Color(0, 0, 0));
// 绘制竖线标记
drawShuXianFlag(g2);
}


以上,是棋盘绘制算法的骨架。

棋盘截图





考虑到棋盘的绘制比较复杂,我们将在下一篇,详细介绍如何绘制棋盘。

网友的一个吐槽

"楼主的中文命名法 让我和蛋疼。"

参见 http://blog.csdn.net/fansunion/article/details/12903991

答:車馬炮等中国象棋中的一些名词,是中国独有的游戏。翻译成对应的英文,比较费事。

假设我翻译成了英文,我看得懂,但是很多人是分不清的。

首先,我有一套自己的编码规范,但是我不会为了所谓的“编码规范”,把自己“束缚”了。

该灵活的就灵活,如果谁看了不舒服,可以修改成自己习惯的方式。

相关阅读

中国象棋程序的设计与实现(零)--原始版源码

中国象棋程序的设计与实现(一)--项目截图

中国象棋程序的设计与实现(二)--源码

中国象棋程序的设计与实现(三)--2012本科毕业论文等重要文档资料

中国象棋程序的设计与实现(四)-- 一次“流产”的写书计划

中国象棋程序的设计与实现(五)--回答CSDN读者的一些问题

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

中国象棋程序的设计与实现(七)--心得体会和开发日志

中国象棋程序的设计与实现(八)-如何构造一个棋子(車馬炮等)

中国象棋程序的设计与实现(九)–棋子点,棋子的小窝

原文参见http://FansUnion.cn/articles/2905

版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息