003コード開発


コードはすでにオープンしました。ソースコードはgithubから入手できます。アドレスは https://github.com/Juneve/DouDiZhu.git 。
主に二つのところのデザインの考え方を言います。彼らは戦略モデルを採用しています。
一つはCard Groupに内蔵されている並べ替え規則で、現在は大きいから小さいまで、子供に優先的に大きいから小さいまでの三つの並べ替えアルゴリズムを実現しています。彼らはインターフェースICardGroup Sortを実現しました。コードは以下の通りです。
/**
 * <p>Title: ICardGroupSort.java</p>
 * <p>Description:       </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * @author Tunie 
 * @date 2014 9 15 
 * @version 1.0
 */
public interface ICardGroupSort {
	void sort(List<Card> list);
}
大きいものから小さいものまで、小さいものから大きいものまで簡単に並べられています。全部簡単な並べ替えの中の挿入順序を採用しています。以下にDecrease Sort類コードを並べます。
/**
 * <p>Title: DecreaseSort.java</p>
 * <p>Description:     </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * @author Tunie 
 * @date 2014 9 15 
 * @version 1.0
 */
public class DecreaseSort implements ICardGroupSort {

	public void sort(List<Card> list) {
		int inner;
		for(int i=1; i<list.size(); i ++ ) {
			inner = i;
			Card temp = list.get(inner);
			while(inner > 0 && list.get(inner - 1).compareTo(temp) < 0 ){
				list.set(inner, list.get(inner - 1));
				--inner;
			}
			list.set(inner, temp);
		}
	}

}
サブ優先アルゴリズムはやや複雑で、コードを先に貼り付けます。
/**
 * <p>Title: PairPrecedenceSort.java</p>
 * <p>Description:       </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * @author Tunie 
 * @date 2014 9 15 
 * @version 1.0
 */
public class PairPrecedenceSort implements ICardGroupSort {

	public void sort(List<Card> list) {
		//      
		CardGroup cardGroup = new CardGroup();
		cardGroup.addAll(list);
		cardGroup.doSort(CardGroupSortType.DECREASE);
		//    
		if(cardGroup.size() < 3 ) return;
		//         ,       
		List<CardGroup> cardGroups = new ArrayList<CardGroup>();
		int index = 0;
		if (cardGroup.getCardList().get(index).isBigKing() && cardGroup.getCardList().get(index + 1).isSmallKing()) {
			cardGroups.add(cardGroup.removeRange(0, 2));
		}
		while(index < cardGroup.size() - 1) {
			if(cardGroup.subCardGroup(index, index + 2).isSame()) {
				if((index + 3 <= cardGroup.size()) && cardGroup.subCardGroup(index, index + 3).isSame()) {
					if((index + 4 <= cardGroup.size()) && cardGroup.subCardGroup(index, index + 4).isSame()) {
						cardGroups.add(cardGroup.removeRange(index, index + 4));
						continue;
					}
					cardGroups.add(cardGroup.removeRange(index, index + 3));
					continue;
				}
				cardGroups.add(cardGroup.removeRange(index, index + 2));
				continue;
			} 
			++index;
		}
		//     
		List<Card> tempList = new ArrayList<Card>();
		for(int i = 0 ; i < cardGroups.size() ; i++) {
			tempList.addAll(cardGroups.get(i).getCardList());
		}
		if(!tempList.isEmpty()) {
			cardGroup.getCardList().addAll(0, tempList);
			list.clear();
			list.addAll(cardGroup.getCardList());
		}
	}

}
主に3歩に分けて歩きます。まずリストを減量して並べ替えます。そしてリストの中のペア、三つ、爆弾牌型を選んでください。最後にリストをマージします。
もう一つは牌型の実現であり、すべての牌型はHandCardの抽象類を継承しています。この種類のコードは以下の通りです。
package org.tunie.game.doudizhu.card;



/**
 * <p>Title: HandCard.java</p>
 * <p>Description:    </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * @author Tunie 
 * @date 2014 9 13 
 * @version 1.0
 */
public abstract class HandCard {
	private int type;
	private int score;
	private CardGroup cardGroup;
	
	public HandCard() {
	}

	public int getType() {
		return type;
	}

	protected void setType(int type) {
		this.type = type;
	}
	
	public int getScore() {
		return score;
	}

	protected void setScore(int score) {
		this.score = score;
	}

	public CardGroup getCardGroup() {
		return cardGroup;
	}

	protected void setCardGroup(CardGroup cardGroup) {
		this.cardGroup = cardGroup;
		setScore(cardGroup.getCard(0).getType());
	}

	/**
	 *     
	 */
	public abstract boolean judge(CardGroup cardGroup);
	
	/**
	 *     size   cardGroup    
	 * @param cardGroup
	 * @param size
	 * @return
	 */
	protected boolean judge(CardGroup cardGroup , int size) {
		boolean result = false;
		if(cardGroup.size() == size) {
			result =  cardGroup.isSame();
			if(result) {
				setCardGroup(cardGroup);
			}
		}
		return result;
	}
}
この類は昔から話していましたが、断続的にいくつかの方法を追加しました。一つはjudge方法の一つの重荷重実装であり、この方法は複数の牌型サブクラスによって使用されます。例えば、Bombコードは以下の通りです。
/**
 * <p>Title: Bomb.java</p>
 * <p>Description:   </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * @author Tunie 
 * @date 2014 9 15 
 * @version 1.0
 */
public class Bomb extends HandCard {

	public Bomb() {
		setType(HandCardType.BOMB);
	}

	@Override
	public boolean judge(CardGroup cardGroup) {
		return judge(cardGroup , 4);
	}

}
また、対子、三つなどの牌型は、爆弾の実現と大同小異で、ボンバーの4をそれぞれ2、3に変えます。
もうちょっとくどいですが、ThreeA類の実現に留意してください。リストコード:
/**
 * <p>Title: ThreeA.java</p>
 * <p>Description:      </p>
 * <p>Copyright: Copyright (c) 2007</p>
 * @author Tunie 
 * @date 2014 9 15 
 * @version 1.0
 */
public class ThreeA extends HandCard{
	public ThreeA() {
		setType(HandCardType.THREE);
	}
	@Override
	public boolean judge(CardGroup cardGroup) {
		boolean result = false;
		if(cardGroup.size() == 4) {
			cardGroup.doSort(CardGroupSortType.PAIR_PRECEDENCE);
			result = cardGroup.subCardGroup(0, 3).isSame() && !cardGroup.isSame();
			if(result) {
				setCardGroup(cardGroup);
			}
		}
		return result;
	}
}
ここではサブ優先順位アルゴリズムを使っています。このタイプはまだテストされていませんが、真相までは遠くないはずです。
本人の能力が有限なため、コードと文の中でどうしてもこのようなbugが現れて、官を見て直言して指摘して下さい、ありがとうございます。