中國象棋程式的設計與實現(八)-如何構造一個棋子(車馬炮等)
本篇詳細介紹,在中國象棋程式中,如何構造一個棋子。
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);
}
}
相關閱讀
如果有興趣,強烈建議持續關注我的CSDN部落格FansUnion,最近3月,每週發表3到10篇原創。
未來計劃
未來3個月到1年,我將盡快把中國象棋-楚漢棋兵系列,全部寫完。
覺得還不錯的,幫我“頂”啊!