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

news/2024/11/23 9:39:19/

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

1.棋子类的定义。

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

   shuaihongxianghongshihongpaohongmahongjubing

   jiangheixiangheishiheipaoheimaheijuzu

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


相关阅读

中国象棋程序的设计与实现(零)--原始版源码

中国象棋程序的设计与实现(一)--项目截图

中国象棋程序的设计与实现(二)--源码

中国象棋程序的设计与实现(三)--2012本科毕业论文等重要文档资料

中国象棋程序的设计与实现(四)-- 一次“流产”的写书计划

中国象棋程序的设计与实现(五)--回答CSDN读者的一些问题

中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)

中国象棋程序的设计与实现(七)--心得体会和开发日志


CSDN博客目标CSDN第一综合性博客

特别说明:我的CSDN博客FansUnion和我的独立博客小雷网(FansUnion.cn)几乎是同一时间发表(10秒内)。

如果有兴趣,强烈建议持续关注我的CSDN博客FansUnion,最近3月,每周发表3到10篇原创。

未来计划

未来3个月到1年,我将尽快把中国象棋-楚汉棋兵系列,全部写完。

觉得还不错的,帮我“顶”啊!

原文参见http://FansUnion.cn/articles/2883


http://www.ppmy.cn/news/694908.html

相关文章

中国象棋人工智能实现

中国象棋在我看来最难的人工对战中电脑怎能走这个问题&#xff0c;以下为本人浅见&#xff0c;希望各位多多包涵&#xff01; 1.初步尝试 电脑的优势在于强大的计算能力&#xff0c;虽然其不知道怎么走合适&#xff0c;但是它能够模拟的将每一种走法都走一遍&#xff0c;选最优…

软考A计划-系统集成项目管理工程师-项目立项-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

js实现中国象棋

闲的没事干写的js代码。使用table元素作表格&#xff0c;div元素作象棋。 效果如下&#xff1a; 代码如下&#xff1a; <html> <head> <title>中国象棋</title> <meta charset"UTF-8"> <style> table{margin:10px;border-coll…

365值得吗 office_对于一个大学生来说,Office365是否值得购买?

值得 入了office365 家庭版&#xff0c;拼的车&#xff0c;一年算下来也就50块左右 怎么评价Office365呢&#xff1f; 1.首先&#xff0c;Office将组件大家都清楚&#xff0c;办公学习考试啥的&#xff0c;啥都要用&#xff0c;金山的wps做出来的东西在导入或者导总会有或多或少…

## term没有查到数据分析

match 一般要结合 text 类型一起使用 而 term 要结合 keyword 类型一起使用&#xff0c;这样才是有意义的 这里的理解有些人可能有误区, "name" : {"type" : "text","fields" : {"keyword" : {"type" : "…

zoho邮箱收费和免费区别_集成MS Office和您的Zoho在线帐户

zoho邮箱收费和免费区别 Have you been looking to integrate MS Office install and your Zoho online account? Then join us as we look at the Zoho Plugin for Microsoft Office. 您是否一直在寻找将MS Office安装和您的Zoho在线帐户集成在一起的方法&#xff1f; 然后加…

计算机二级office如何考取高分?

【知识兔】学姐为了系统地汇总Excel函数公式&#xff0c;我们查阅了所有的计算机二级office真题&#xff0c;经过三天的整理、分类、筛选、修改&#xff0c;反复的校对&#xff0c;知识兔团队希望自己整理出的知识点能够帮助更多的人学习office技能考取计算机二级证书。知识兔本…

Office 2019怎么下载?附学习视频教程

只能网络下载&#xff0c;仅支持Win10系统&#xff01;领&#xff01; 根据微软的说法&#xff0c;Office 2019不再提供MSI本地安装包&#xff0c;仅通过Click-to-Run网络安装包的方式发放。如此一来&#xff0c;每一次用户安装Office 2019的时候就只能下载数量庞大的组件&…