博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中国象棋程序的设计与实现(十)--棋盘的定义和绘制
阅读量:5291 次
发布时间:2019-06-14

本文共 2770 字,大约阅读时间需要 9 分钟。

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

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

棋盘类的定义

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

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

棋盘截图

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

网友的一个吐槽

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

参见

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

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

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

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

相关阅读

原文参见

转载于:https://www.cnblogs.com/qitian1/p/6463519.html

你可能感兴趣的文章
python tkinter GUI绘制,以及点击更新显示图片
查看>>
Spark基础脚本入门实践3:Pair RDD开发
查看>>
HDU4405--Aeroplane chess(概率dp)
查看>>
python使用easyinstall安装xlrd、xlwt、pandas等功能模块的方法
查看>>
CS0103: The name ‘Scripts’ does not exist in the current context解决方法
查看>>
20130330java基础学习笔记-语句_for循环嵌套练习2
查看>>
Spring面试题
查看>>
窥视SP2010--第一章节--SP2010开发者路线图
查看>>
MVC,MVP 和 MVVM 的图示,区别
查看>>
C语言栈的实现
查看>>
代码为什么需要重构
查看>>
TC SRM 593 DIV1 250
查看>>
SRM 628 DIV2
查看>>
2018-2019-2 20165314『网络对抗技术』Exp5:MSF基础应用
查看>>
统计单词,字符,和行
查看>>
jQuery垂直滑动切换焦点图
查看>>
Python-S9-Day127-Scrapy爬虫框架2
查看>>
模运算
查看>>
python多线程的使用
查看>>
团队编程项目作业1-成员简介及分工
查看>>