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

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

2013-10-21 
中国象棋程序的设计与实现(八)-如何构造一个棋子(車馬炮等)本篇详细介绍,在中国象棋程序中,如何构造一个棋

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

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

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你多提点建议额。

热点排行