读书人

中国象棋程序的设计与实现(八)-怎么构

发布时间: 2013-10-21 17:00:48 作者: rapoo

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

本篇详细介绍,在中国象棋程序中,如何构造一个棋子。

1.棋子类的定义。

  public class ChessPiece extends JLabel  棋子是一个继承自JLabel的图形界面组件,当添加到棋盘中的时候,看起来比较美观。

中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)

中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)中国象棋程序的设计与实现(八)-怎么构造一个棋子(炮等)

2.棋子类的属性。

/**     * 棋子的类别     */    private PieceCategory category;    /**     * 棋子所属方的名字:黑方或红方     */    private String name;    /**     * 棋子的宽度     */    private int width;    /**     * 棋子的高度     */    private int height;    /**     * 棋子的id     */    private PieceId id;    /**     * 棋子的坐标 1<=x<=9,1<=y<=10     */    private Point position;


3.详细介绍棋子的每一个属性。

3.1 id

棋子id,枚举类型。

 
public static enum PieceId {        HONGJU1, HONGJU2, HONGMA1, HONGMA2, HONGXIANG1, HONGXIANG2, HONGSHI1, HONGSHI2, SHUAI, HONGPAO1, HONGPAO2,BING1, BING2, BING3, BING4, BING5,        HEIJU1, HEIJU2, HEIMA1, HEIMA2, HEIXIANG1, HEIXIANG2, HEISHI1, HEISHI2, JIANG, HEIPAO1, HEIPAO2, ZU1, ZU2, ZU3, ZU4, ZU5;    }



保证棋子ID是唯一的,并且容易理解。

中国象棋中一共有32个不同的棋子,每一个棋子都是相互独立的。

3.2 category

棋子类别,枚举类型。

 public static enum PieceCategory {        JU, MA, PAO, HONGXIANG, HEIXIANG, HONGSHI, HEISHI, JIANG, SHUAI, ZU, BING    }


保证棋子类别是唯一的,并且容易理解。

中国象棋中一共有11种不同类型的棋子。

32个棋子,有32个id是很容易理解的。

很多人肯定会问,为什么要定义11个分类?

炮,JU, MA, PAO 之所以没有区分是“红方”还是“黑方”,是考虑到 炮可以“位于棋盘中的任何一个位置”。

炮棋子移动的规则,不需要区分到底是“红方”还是“黑方”。

而象、士、将、卒HONGXIANG, HEIXIANG, HONGSHI, HEISHI, JIANG, SHUAI, ZU, BING却需要区分,是因为

这些棋子“只能位于棋盘中有限的位置”,方便在棋子移动等游戏规则的实现。

3.3 name

棋子所属方的名字,String类型。

可选的值是“黑方”或“红方”。

这个名字容易产生“误解”,误认为是“棋子的名字”。

3.4 position

棋子在棋盘中的坐标,Point类型。

坐标范围 {(x,y)| 1<=x<=9,1<=y<=10}

印象中,在高中数学中,是这样表示集合的吧!

为什么会存在“坐标”的概念?

本中国象棋程序-楚汉棋兵,棋盘是用“二维数组”表示的,方便理解。

棋子的坐标,对实现棋子的移动规则有很大帮助。

3.5 width

宽度,int类型。

程序中用的是44-4=40,代表宽40像素。

3.6 height

高度,int类型

程序中用的是44-4=40,代表高40像素。

4.构造一个棋子。

/** 构造函数,初始化棋子的信息 */    public ChessPiece(PieceId id, String name, PieceCategory category,            int width, int height) {        this.id = id;        this.category = category;        ImageIcon imageIcon = PieceUtils.getImageIcon("jiang.png");        this.width = imageIcon.getIconWidth();        this.height = imageIcon.getIconHeight();        this.name = name;        // 将棋子图片的大小设置为“首选大小”,这样棋子看起来和图片一模一样        this.setPreferredSize(new Dimension(width, height));        switch (id) {        case HONGJU1:        case HONGJU2:            setIcon(PieceUtils.getImageIcon("hongju.png"));            break;        validate();        repaint();    } 


获取棋子图片

public final class PieceUtils{ private static HashMap<String, ImageIcon> imageIcons;    static {        imageIcons = new HashMap<String, ImageIcon>();        String[] imgNames = { "bing.png", "hongju.png", "hongma.png",                "hongxiang.png", "hongshi.png", "shuai.png", "hongpao.png",                "zu.png", "heiju.png", "heima.png", "heixiang.png",                "heishi.png", "heipao.png", "jiang.png" };        int size = imgNames.length;        for (int index = 0; index < size; index++) {            ImageIcon imageIcon = ChessUtils.getImageIcon("piece/"                    + imgNames[index]);            imageIcons.put(imgNames[index], imageIcon);        }    }    public static ImageIcon getImageIcon(String imgName) {        return imageIcons.get(imgName);    }}


相关阅读

http://FansUnion.cn/articles/2883

1楼u0119604022小时前
你的中国象棋系列可以出书了,哈哈
Re: FansUnion1小时前
回复u011960402n全部写完了,有一定可能啊。n写书很费时间的。n和写文章还是有很大区别的。n你多提点建议额。

读书人网 >软件开发

热点推荐