本篇简要介绍棋盘类的定义、棋盘的关键属性、棋盘绘制算法的骨架。
棋盘的详细绘制算法等内容,我们将在接下来的几篇进行详细介绍。
棋盘类的定义
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
答:車馬炮等中国象棋中的一些名词,是中国独有的游戏。翻译成对应的英文,比较费事。
假设我翻译成了英文,我看得懂,但是很多人是分不清的。
首先,我有一套自己的编码规范,但是我不会为了所谓的“编码规范”,把自己“束缚”了。
该灵活的就灵活,如果谁看了不舒服,可以修改成自己习惯的方式。
相关阅读
原文参见:http://FansUnion.cn/articles/2905