玩家出了一手牌,咱們的遊戲確定是須要將其顯示出來的。無論是給哪一個玩家看,顯示出來是必須的,並且得至關的顯眼,最好是對每種牌型都提供一種對應的顯示方式。固然,目前還不考慮語音方面的設計。
java
如何才能針對不一樣的牌型以不一樣的方式顯示出來?答案很簡單,先重構一下HandCard及其子類,還有就是給HandCardType添加新屬性。具體修改以下:
ide
1. HandCard添加了新方法設計
/** * 手牌描述 * @return */ public abstract String getDescribe();
2.HandCardType添加了新屬性code
/** 雙王描述*/ public static final String DOUBLE_KING_DESC = "doubleKingDesc"; /** 四個,炸彈描述 */ public static final String BOMB_DESC = "bombDesc"; /** 單牌描述 */ public static final String A_DESC = "aDesc"; .....
3.HandCard子類實現了getDescribe方法,例如類A
繼承
@Override public String getDescribe() { return HandCardType.A_DESC; }
經過上面的重構,咱們就能夠判斷一手牌的牌型了,新建一個DeskView桌面視圖類,主要功能就是顯示玩家剛出的一手牌。而後用策略模式實現手牌顯示模塊,咱們定義了一個接口,代碼以下
接口
/** * <p>Title: IHandCardShow.java</p> * <p>Description:手牌顯示接口 </p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月23日 * @version 1.0 */ public interface IHandCardShow { void show(Graphics g); }
只須要往show中傳遞一個g實例便可,手牌的顯示就交給了實現IHandCardShow接口的子類。目前只提供了一種顯示方式,這種方式在一個HandCardShow抽象類中實現,咱們看下HandCardShow類代碼遊戲
/** * <p>Title: HandCardShow.java</p> * <p>Description: 手牌顯示父類</p> * <p>Copyright: Copyright (c) 2007</p> * @author Tunie * @date 2014年9月23日 * @version 1.0 */ public abstract class HandCardShow implements IHandCardShow { protected List<CardView> cardViews; public HandCardShow() { cardViews = new ArrayList<CardView>(); } public void show(Graphics g) { cardViews.clear(); List<Card> cards = Judger.handCard.getCardGroup().getCardList(); CardView cardView; for(int j = 0; j < cards.size(); j ++ ){ cardView = new CardView(cards.get(j)); cardViews.add(cardView); } doShow(g); } protected void doShow(Graphics g) { doShow(g, 40, 40); } /** * 在一條直線上顯示 * @param g * @param gap */ protected void doShow(Graphics g, int gap , int paddingTop) { Graphics2D graphics2d = (Graphics2D) g; int width = CardView.DEFAULT_WIDTH + (cardViews.size() - 1) * gap; BufferedImage image = null; if(DeskView.DEFAULT_WIDTH < width ) { gap -= (width - DeskView.DEFAULT_WIDTH - 20)/cardViews.size(); } width = CardView.DEFAULT_WIDTH + (cardViews.size() - 1) * gap; int imageX = (DeskView.DEFAULT_WIDTH - width) / 2; graphics2d.translate(imageX, paddingTop); for (int j = 0; j < cardViews.size(); j++) { image = cardViews.get(j).getImage(); graphics2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); graphics2d.translate(gap, 0); } } }
而後全部的牌型顯示子類繼承這個抽象類便可。 ip
該說的都差很少說完了,最後將效果圖傳上來讓你們瞧瞧,就是一種叫作炸彈帶雙對的牌型。get