首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

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

2013-10-23 
中国象棋程序的设计与实现(十)--棋盘的定义和绘制本篇简要介绍棋盘类的定义、棋盘的关键属性、棋盘绘制算法

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

本篇简要介绍棋盘类的定义、棋盘的关键属性、棋盘绘制算法的骨架。

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

棋盘类的定义

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);    }


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

棋盘截图

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

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

网友的一个吐槽

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

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

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

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

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

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

相关阅读

http://FansUnion.cn/articles/2905

热点排行