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

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

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

棋盘类的定义

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

你可能感兴趣的:(算法,graphics,画图,棋盘,中国象棋)