麻将 胡牌 算法(任意癞子)

分享一个麻将胡牌算法,支持多癞子,自己对麻将胡牌的理解写的一套快速识别胡牌逻辑,核心逻辑500行代码,仅对同条万进行处理,字花牌不包含在内,易理解,1M次随机胡牌牌型大概3秒左右。原创分享,我的算法也许可以给你带来一种思路,也许你有更好的,仅供学习参考。如果有什么逻辑错误,欢迎指出。源码:https://download.csdn.net/download/jimheaven/12147500

基础类

public class MJCard {
	public static final int Tong = 0;
	public static final int Tiao = 1;
	public static final int Wan = 2;
	public static final int Feng = 3;
	public static final int Jian = 4;
	public static final int Hua = 5;
	public static final int Laizi = 6;
	
	@Getter
	private int type = 0;
	@Getter
	private int num = 0;
	
	public MJCard(int type,int num) {
		this.type = type;
		this.num = num;
	}
	
	public int getNumValue() {
		return type * 10 + num;
	}
	
	public String toString() {
		String info = "";
		if(type == Tiao) {
			info +="条"+num;
		}else if(type == Tong) {
			info += "同"+num;
		}else if(type == Wan) {
			info += "万"+num;
		}else if(type == Feng) {
			if(num == 1) {
				info = "东";
			}else if(num == 2) {
				info = "南";
			}else if(num == 3) {
				info = "西";
			}else if(num == 4) {
				info = "北";
			}
		}else if(type == Jian) {
			if(num == 1) {
				info = "红中";
			}else if(num == 2) {
				info = "发财";
			}else if(num == 3) {
				info = "白板";
			}
		}else if(type == Hua) {
			if(num == 1) {
				info = "春";
			}else if(num == 2) {
				info = "夏";
			}else if(num == 3) {
				info = "秋";
			}else if(num == 4) {
				info = "冬";
			}else if(num == 5) {
				info = "梅";
			}else if(num == 6) {
				info = "兰";
			}else if(num == 7) {
				info = "竹";
			}else if(num == 8) {
				info = "菊";
			}
		}else if(type == Laizi) {
			if(num == 1) {
				info = "系统癞子";
			}else if(num == 2) {
				info = "特殊癞子";
			}
		}
		return info;
	}
}
public class MJCards {
	private static final MJCard tong1 = new MJCard(MJCard.Tong, 1); 
	private static final MJCard tong2 = new MJCard(MJCard.Tong, 2); 
	private static final MJCard tong3 = new MJCard(MJCard.Tong, 3); 
	private static final MJCard tong4 = new MJCard(MJCard.Tong, 4); 
	private static final MJCard tong5 = new MJCard(MJCard.Tong, 5); 
	private static final MJCard tong6 = new MJCard(MJCard.Tong, 6); 
	private static final MJCard tong7 = new MJCard(MJCard.Tong, 7); 
	private static final MJCard tong8 = new MJCard(MJCard.Tong, 8); 
	private static final MJCard tong9 = new MJCard(MJCard.Tong, 9); 
	
	private static final MJCard tiao1 = new MJCard(MJCard.Tiao, 1); 
	private static final MJCard tiao2 = new MJCard(MJCard.Tiao, 2); 
	private static final MJCard tiao3 = new MJCard(MJCard.Tiao, 3); 
	private static final MJCard tiao4 = new MJCard(MJCard.Tiao, 4); 
	private static final MJCard tiao5 = new MJCard(MJCard.Tiao, 5); 
	private static final MJCard tiao6 = new MJCard(MJCard.Tiao, 6); 
	private static final MJCard tiao7 = new MJCard(MJCard.Tiao, 7); 
	private static final MJCard tiao8 = new MJCard(MJCard.Tiao, 8); 
	private static final MJCard tiao9 = new MJCard(MJCard.Tiao, 9); 
	
	private static final MJCard wan1 = new MJCard(MJCard.Wan, 1); 
	private static final MJCard wan2 = new MJCard(MJCard.Wan, 2); 
	private static final MJCard wan3 = new MJCard(MJCard.Wan, 3); 
	private static final MJCard wan4 = new MJCard(MJCard.Wan, 4); 
	private static final MJCard wan5 = new MJCard(MJCard.Wan, 5); 
	private static final MJCard wan6 = new MJCard(MJCard.Wan, 6); 
	private static final MJCard wan7 = new MJCard(MJCard.Wan, 7); 
	private static final MJCard wan8 = new MJCard(MJCard.Wan, 8); 
	private static final MJCard wan9 = new MJCard(MJCard.Wan, 9); 
	
	private static final MJCard fengdong = new MJCard(MJCard.Feng, 1); 
	private static final MJCard fengxi = new MJCard(MJCard.Feng, 2); 
	private static final MJCard fengnan = new MJCard(MJCard.Feng, 3); 
	private static final MJCard fengbei = new MJCard(MJCard.Feng, 4); 
	
	private static final MJCard zhong = new MJCard(MJCard.Jian, 1); 
	private static final MJCard fa = new MJCard(MJCard.Jian, 2); 
	private static final MJCard bai = new MJCard(MJCard.Jian, 3); 
	
	private static final MJCard chun = new MJCard(MJCard.Hua, 1); 
	private static final MJCard xia = new MJCard(MJCard.Hua, 2); 
	private static final MJCard qiu = new MJCard(MJCard.Hua, 3); 
	private static final MJCard dong = new MJCard(MJCard.Hua, 4); 
	private static final MJCard mei = new MJCard(MJCard.Hua, 5); 
	private static final MJCard lan = new MJCard(MJCard.Hua, 6); 
	private static final MJCard zu = new MJCard(MJCard.Hua, 7); 
	private static final MJCard ju = new MJCard(MJCard.Hua, 8); 
	
	private static final MJCard laiziSys = new MJCard(MJCard.Laizi, 1);
	private static final MJCard laizi = new MJCard(MJCard.Laizi, 2);
	

	/** 获取所有牌型数组 */
	public static MJCard[] getCardArr() {
		MJCard[] card = { tong1, tong2, tong3, tong4, tong5, tong6, tong7,
				tong8, tong9, tiao1, tiao2, tiao3, tiao4, tiao5, tiao6,
				tiao7, tiao8, tiao9,wan1, wan2, wan3, wan4, wan5,
				wan6, wan7, wan8, wan9, fengdong, fengnan, fengxi,
				fengbei, zhong, fa, bai, chun, xia,
				qiu, dong, mei, lan, zu, ju };
		return card;
	}

	/**
	 * 获取指定牌型
	 * 
	 * @param types
	 *            牌类集合, 0=筒,1=条子,2=万,3=风,4=将,5=花
	 * @return
	 */
	public static ArrayList<MJCard> getCardArr(Set<Integer> types) {
		ArrayList<MJCard> cardList = new ArrayList<MJCard>();
		// 放入筒子
		if (types.contains(MJCard.Tong)) {
			cardList.add(tong1);
			cardList.add(tong2);
			cardList.add(tong3);
			cardList.add(tong4);
			cardList.add(tong5);
			cardList.add(tong6);
			cardList.add(tong7);
			cardList.add(tong8);
			cardList.add(tong9);
		}
		// 放入条子
		if (types.contains(MJCard.Tiao)) {
			cardList.add(tiao1);
			cardList.add(tiao2);
			cardList.add(tiao3);
			cardList.add(tiao4);
			cardList.add(tiao5);
			cardList.add(tiao6);
			cardList.add(tiao7);
			cardList.add(tiao8);
			cardList.add(tiao9);
		}
		// 放入万
		if (types.contains(MJCard.Wan)) {
			cardList.add(wan1);
			cardList.add(wan2);
			cardList.add(wan3);
			cardList.add(wan4);
			cardList.add(wan5);
			cardList.add(wan6);
			cardList.add(wan7);
			cardList.add(wan8);
			cardList.add(wan9);
		}
		// 放入风
		if (types.contains(MJCard.Feng)) {
			cardList.add(fengdong);
			cardList.add(fengnan);
			cardList.add(fengxi);
			cardList.add(fengbei);
		}
		// 放入将
		if (types.contains(MJCard.Jian)) {
			cardList.add(zhong);
			cardList.add(fa);
			cardList.add(bai);
		}
		// 放入花
		if (types.contains(MJCard.Hua)) {
			cardList.add(chun);
			cardList.add(xia);
			cardList.add(qiu);
			cardList.add(dong);
			cardList.add(mei);
			cardList.add(lan);
			cardList.add(zu);
			cardList.add(ju);
		}
		return cardList;

	}
	
	public static MJCard getOneCard(int num,int type) {
		return getOneCard(type * 10 + num);
	}
	
	public static MJCard getOneCard(int number) {
		int num = number % 10;
		int type= number / 10;
		if(type == MJCard.Tong) {
			if(num == 1) {
				return tong1;
			}else if(num == 2) {
				return tong2;
			}else if(num == 3) {
				return tong3;
			}else if(num == 4) {
				return tong4;
			}else if(num == 5) {
				return tong5;
			}else if(num == 6) {
				return tong6;
			}else if(num == 7) {
				return tong7;
			}else if(num == 8) {
				return tong8;
			}else if(num == 9) {
				return tong9;
			}
		}else if(type == MJCard.Tiao) {
			if(num == 1) {
				return tiao1;
			}else if(num == 2) {
				return tiao2;
			}else if(num == 3) {
				return tiao3;
			}else if(num == 4) {
				return tiao4;
			}else if(num == 5) {
				return tiao5;
			}else if(num == 6) {
				return tiao6;
			}else if(num == 7) {
				return tiao7;
			}else if(num == 8) {
				return tiao8;
			}else if(num == 9) {
				return tiao9;
			}
		}else if(type == MJCard.Wan) {
			if(num == 1) {
				return wan1;
			}else if(num == 2) {
				return wan2;
			}else if(num == 3) {
				return wan3;
			}else if(num == 4) {
				return wan4;
			}else if(num == 5) {
				return wan5;
			}else if(num == 6) {
				return wan6;
			}else if(num == 7) {
				return wan7;
			}else if(num == 8) {
				return wan8;
			}else if(num == 9) {
				return wan9;
			}
		}else if(type == MJCard.Feng) {
			if(num == 1) {
				return fengdong;
			}else if(num == 2) {
				return fengnan;
			}else if(num == 3) {
				return fengxi;
			}else if(num == 4) {
				return fengbei;
			}
		}else if(type == MJCard.Jian) {
			if(num == 1) {
				return zhong;
			}else if(num == 2) {
				return fa;
			}else if(num == 3) {
				return bai;
			}
		}else if(type == MJCard.Hua) {
			if(num == 1) {
				return chun;
			}else if(num == 2) {
				return xia;
			}else if(num == 3) {
				return qiu;
			}else if(num == 4) {
				return dong;
			}else if(num == 5) {
				return mei;
			}else if(num == 6) {
				return lan;
			}else if(num == 7) {
				return zu;
			}else if(num == 8) {
				return ju;
			}
		}else if(type == MJCard.Laizi) {
			if(num == 1) {				
				return laiziSys;
			}else if(num == 2){
				return laizi;
			}
		}
		return null;
	}
}

核心算法

public class MJUtil {

	public static boolean checkHu(LinkedList<MJCard> cards, MJCard otherCard, List<MJCard> laizi,List<List<MJCard>> huCardGroup) {
		// 查将
		LinkedList<MJCard> temp = new LinkedList<MJCard>(cards);
		if (otherCard != null) {
			temp.add(otherCard);
		}
		soreCard(temp);
		List<MJCard> laiziList = new ArrayList<MJCard>();
		Iterator<MJCard> iterator = temp.iterator();
		while (iterator.hasNext()) {
			MJCard next = iterator.next();
			if (laizi.contains(next)) {
				iterator.remove();
				laiziList.add(next);
			}
		}
		if (temp.size() < 2) {
			return true;
		}
		if (temp.size() == 2) {
			MJCard c1 = temp.get(0);
			MJCard c2 = temp.get(1);
			if (c1 == c2) {
				return true;
			} else {
				if (laiziList.size() > 0) {
					if(laiziList.size() == 1 && c1.getType() == c2.getType()) {
						if (Math.abs(c1.getNum() - c2.getNum()) < 3) {
							return true;
						}
					}else if(laiziList.size() >= 3){
						return true;
					}else {
						return false;
					}
					
				}
			}
		}
		// 检查七对
		if(temp.size() + laiziList.size() == 14) {			
			boolean qidui = true;
			MJCard index = null;
			List<MJCard> laiziListTemp = new ArrayList<MJCard>(laiziList);
			int count = 0;
			for (int i = 0; i < temp.size(); i++) {
				MJCard mjCard = temp.get(i);
				if (index == null) {
					index = mjCard;
					count = 1;
				} else {
					if (index == mjCard) {
						count += 1;
					} else {
						if (count % 2 != 0) {
							if(laiziListTemp.size() > 0) {
								laiziListTemp.remove(0);
							}else {								
								qidui = false;
								break;
							}
						} else {
							index = mjCard;
							count = 1;
						}
					}
				}
			}
			if (qidui && count % 2 != 1) {
				return true;
			}
		}
		//全杠不可胡
		if(temp.size() == 14) {
			//11112222333344
			MJCard tmepFind = null;
			int tempCount = 0;
			List<MJCard> gangC = new ArrayList<MJCard>();
			for(MJCard c : temp) {
				if(tmepFind == null) {
					tmepFind = c;
					tempCount = 1;
				}else {
					if(tmepFind == c) {
						tempCount += 1;
						if(tempCount == 4) {
							gangC.add(c);
						}
					}else if(tempCount == 4) {
						tmepFind = c;
						tempCount = 1;
					}else {
						break;					
					}
				}
			}
			if(gangC.size() == 3) {
				if(gangC.get(0).getType() != gangC.get(1).getType() || gangC.get(0).getType() != gangC.get(2).getType()) {					
					return false;
				}
				if(gangC.get(0).getNum() + 1 != gangC.get(1).getNum() || gangC.get(1).getNum() + 1 != gangC.get(2).getNum()) {
					return false;
				}
			}
		}
		
		Set<MJCard> jiangList = new HashSet<MJCard>(temp);
		//幺九放最后面,牌型幺九有特殊需求
		LinkedList<MJCard> jiangListList = new LinkedList<MJCard>();
		for(MJCard c : jiangList) {
			if(c.getNum() % 10 == 1 || c.getNum() % 10 == 9) {
				jiangListList.addLast(c);
			}else {
				jiangListList.addFirst(c);
			}
		}
		for (MJCard c : jiangListList) {
			huCardGroup.clear();
			List<MJCard> tempLaizi = new ArrayList<MJCard>(laiziList);
			LinkedList<MJCard> tempCheck = new LinkedList<MJCard>(temp);
			tempCheck.remove(c);
			if (!tempCheck.contains(c)) {
				continue;
			}
			tempCheck.remove(c);
			List<MJCard> j = new ArrayList<MJCard>();
			j.add(c);
			j.add(c);
			huCardGroup.add(j);
			LinkedList<MJCard> tong = new LinkedList<MJCard>();
			LinkedList<MJCard> tiao = new LinkedList<MJCard>();
			LinkedList<MJCard> wan = new LinkedList<MJCard>();
			for (MJCard c1 : tempCheck) {
				if (c1.getType() == MJCard.Tong) {
					tong.add(c1);
				} else if (c1.getType() == MJCard.Tiao) {
					tiao.add(c1);
				} else if (c1.getType() == MJCard.Wan) {
					wan.add(c1);
				}
			}
			if (tong.size() != 0) {
				boolean checkCardList = checkCardListNew(tong, tempLaizi,huCardGroup);
				if (!checkCardList) {
					continue;
				}
			}
			if (tiao.size() != 0) {
				boolean checkCardList = checkCardListNew(tiao, tempLaizi,huCardGroup);
				if (!checkCardList) {
					continue;
				}
			}
			if (wan.size() != 0) {
				boolean checkCardList = checkCardListNew(wan, tempLaizi,huCardGroup);
				if (!checkCardList) {
					continue;
				}
			}
			if(tempLaizi.size() % 3 != 0) {
				continue;
			}
			return true;
		}
		//癞子去单
		if (laiziList.size() > 0) {
			for (MJCard mjCard : jiangListList) {
				huCardGroup.clear();
				int count = 0;
				for(MJCard c : temp) {
					if(c == mjCard) {
						count += 1;
					}
				}
				if(count > 1) {
					continue;
				}
				List<MJCard> tempLaizi = new ArrayList<MJCard>(laiziList);
				LinkedList<MJCard> tempCheck = new LinkedList<MJCard>(temp);
				tempCheck.remove(mjCard);
				MJCard remove = tempLaizi.remove(0);
				List<MJCard> j = new ArrayList<MJCard>();
				j.add(mjCard);
				j.add(remove);
				huCardGroup.add(j);
				LinkedList<MJCard> tong = new LinkedList<MJCard>();
				LinkedList<MJCard> tiao = new LinkedList<MJCard>();
				LinkedList<MJCard> wan = new LinkedList<MJCard>();
				for (MJCard c1 : tempCheck) {
					if (c1.getType() == MJCard.Tong) {
						tong.add(c1);
					} else if (c1.getType() == MJCard.Tiao) {
						tiao.add(c1);
					} else if (c1.getType() == MJCard.Wan) {
						wan.add(c1);
					}
				}
				if (tong.size() != 0) {
					int laiziCount = tempLaizi.size();
					int tongCount = tong.size();
					boolean checkCardList = checkCardListNew(tong, tempLaizi,huCardGroup);
					if (!checkCardList || (tongCount + laiziCount - tempLaizi.size()) % 3 != 0) {
						continue;
					}
				}
				if (tiao.size() != 0) {
					int laiziCount = tempLaizi.size();
					int tiaoCount = tiao.size();
					boolean checkCardList = checkCardListNew(tiao, tempLaizi,huCardGroup);
					if (!checkCardList || (tiaoCount + laiziCount - tempLaizi.size()) % 3 != 0) {
						continue;
					}
				}
				if (wan.size() != 0) {
					int laiziCount = tempLaizi.size();
					int wanCount = wan.size();
					boolean checkCardList = checkCardListNew(wan, tempLaizi,huCardGroup);
					if (!checkCardList || (wanCount + laiziCount - tempLaizi.size()) % 3 != 0) {
						continue;
					}
				}
				if(tempLaizi.size() % 3 != 0) {
					continue;
				}
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 公式AAA*z+ABC*y+AA<br>
	 * 单双不过,并且在外部已经去将牌<br>
	 * 思路<br>
	 * 1:AAAA是必拆组合,并且后两张必须存在
	 * 
	 * @param list
	 * @param laiziList
	 * @param mjCardCount
	 * @return
	 */
	private static boolean checkCardListNew(LinkedList<MJCard> list, List<MJCard> laiziList,List<List<MJCard>> huCardGroup) {
		LinkedList<MJCard> left = new LinkedList<MJCard>(list);
		LinkedList<MJCard> laiziListleft = new LinkedList<MJCard>(laiziList);
		int times = 20;
		do {
			MJCard indexTemp = null;
			int countTemp = 0;
			for (int i = 0; i < left.size(); i++) {
				if(indexTemp == null) {
					indexTemp = left.get(i);
					countTemp += 1;
				}else {
					if(indexTemp == left.get(i)) {
						countTemp += 1;
					}else {
						if(countTemp == 3) {
							indexTemp = left.get(i);
							countTemp = 1;
							continue;
						}
						break;
					}
				}
			}
			MJCard num1 = MJCards.getOneCard(indexTemp.getNum() + 1, indexTemp.getType());//隐藏牌编号10
			MJCard num2 = MJCards.getOneCard(indexTemp.getNum() + 2, indexTemp.getType());//隐藏牌编号10 11
			if(countTemp == 1) {
				//只能是第一张
				List<MJCard> temp = new ArrayList<MJCard>();
				temp.add(indexTemp);
				left.remove(indexTemp);
				if(left.contains(num1)) {
					left.remove(num1);
					temp.add(num1);
				}else {
					if(laiziListleft.size() > 0) {
						MJCard remove = laiziListleft.remove(0);
						temp.add(remove);
					}else {
						return false;
					}
				}
				if(left.contains(num2)) {
					left.remove(num2);
					temp.add(num2);
				}else {
					if(laiziListleft.size() > 0) {
						MJCard remove = laiziListleft.remove(0);
						temp.add(remove);
					}else {
						return false;
					}
				}
				huCardGroup.add(temp);
			}else if(countTemp == 2) {
				//只能是前两张
				List<MJCard> temp1 = new ArrayList<MJCard>();
				List<MJCard> temp2 = new ArrayList<MJCard>();
				temp1.add(indexTemp);
				temp2.add(indexTemp);
				left.remove(indexTemp);
				left.remove(indexTemp);
				if(left.contains(num1) || left.contains(num2)) {
					//考虑一下AA赖
					boolean isok = false;
					LinkedList<MJCard> leftTemp = new LinkedList<MJCard>(left);
					LinkedList<MJCard> laiziListleftTemp = new LinkedList<MJCard>(laiziListleft);
					if(laiziListleftTemp.size() > 0) {
						laiziListleftTemp.remove(0);
						List<List<MJCard>> huCardGroupTemp = new ArrayList<List<MJCard>>();
						isok = checkCardListNew(leftTemp, laiziListleftTemp,huCardGroupTemp);
						if(isok) {	
							MJCard remove = laiziListleft.remove(0);
							temp1.add(indexTemp);
							temp1.add(remove);
							temp2.clear();
						}
					}
					if(!isok) {						
						if(left.contains(num1)) {
							left.remove(num1);
							temp1.add(num1);
							if(left.contains(num1)) {
								left.remove(num1);
								temp2.add(num1);
							}else {
								if(laiziListleft.size() > 0) {
									MJCard remove = laiziListleft.remove(0);
									temp2.add(remove);
								}else {
									return false;
								}
							}
						}else {
							if(laiziListleft.size() > 1) {
								MJCard remove = laiziListleft.remove(0);
								laiziListleft.remove(0);
								temp1.add(remove);
								temp2.add(remove);
							}else {
								return false;
							}
						}
						if(left.contains(num2)) {
							left.remove(num2);
							temp1.add(num2);
							if(left.contains(num2)) {
								left.remove(num2);
								temp2.add(num2);
							}else {
								if(laiziListleft.size() > 0) {
									MJCard remove = laiziListleft.remove(0);
									temp1.add(remove);
								}else {
									return false;
								}
							}
						}else {
							if(laiziListleft.size() > 1) {
								MJCard remove = laiziListleft.remove(0);
								laiziListleft.remove(0);
								temp1.add(remove);
								temp2.add(remove);
							}else {
								return false;
							}
						}
					}
					huCardGroup.add(temp1);
					if(!temp2.isEmpty()) {						
						huCardGroup.add(temp2);
					}
				}else {
					if(laiziListleft.size() > 0) {
						MJCard remove = laiziListleft.remove(0);
						temp1.add(indexTemp);
						temp1.add(remove);
						temp2.clear();
						huCardGroup.add(temp1);
					}else {
						return false;
					}
				}
			}else if(countTemp == 4) {
				List<MJCard> temp = new ArrayList<MJCard>();
				temp.add(indexTemp);
				left.remove(indexTemp);
				if(left.contains(num1)) {
					left.remove(num1);
					temp.add(num1);
				}else {
					if(laiziListleft.size() > 0) {
						MJCard remove = laiziListleft.remove(0);
						temp.add(remove);
					}else {
						return false;
					}
				}
				if(left.contains(num2)) {
					left.remove(num2);
					temp.add(num2);
				}else {
					if(laiziListleft.size() > 0) {
						MJCard remove = laiziListleft.remove(0);
						temp.add(remove);
					}else {
						return false;
					}
				}
				huCardGroup.add(temp);
			}else {
				//将三张集合
				if(!left.isEmpty()) {
					for(int j=0;j<left.size() / 3 ;j++) {
						List<MJCard> temp = new ArrayList<MJCard>();
						temp.add(left.get(j));
						temp.add(left.get(j+1));
						temp.add(left.get(j+2));
						huCardGroup.add(temp);
					}
				}
				//结束
				laiziList.clear();
				laiziList.addAll(laiziListleft);
				return true;
			}
			times -= 1;
			if(left.isEmpty()) {
				laiziList.clear();
				laiziList.addAll(laiziListleft);
				return true;
			}
		}while(true && times > 0);
		if(times <= 0) {
			return false;
		}
		return true;
	}
	
	private static void soreCard(LinkedList<MJCard> cards) {
		Collections.sort(cards,new Comparator<MJCard>() {
			@Override
			public int compare(MJCard o1, MJCard o2) {
				return o1.getNumValue() - o2.getNumValue();
			}
		});
	}
}

测试函数

public static void whileCheckHu(int count,int laiziCount) {
		System.out.println("开始"+System.currentTimeMillis());
		File file = new File("d://nohu.txt");
		try (FileOutputStream fos = new FileOutputStream(file);
				OutputStreamWriter osw = new OutputStreamWriter(fos);BufferedWriter bw = new BufferedWriter(osw);){
			Random r = new Random();
			List<MJCard> laizi = new LinkedList<MJCard>();
			MJCard laizi1 = MJCards.getOneCard(1, MJCard.Laizi);
			laizi.add(laizi1);
			for(int i=0;i<count;i++) {
				Map<Integer, Integer> cardsCount = new HashMap<Integer, Integer>();
				List<Integer> allCards = new ArrayList<Integer>();
				int jiang = r.nextInt(9) + 1;
				allCards.add(jiang);
				allCards.add(jiang);
				cardsCount.put(jiang, 2);
				int zu1 = r.nextInt(5);
				int zu2 = 4 - zu1;
				while(zu1 > 0) {
					int get1 = r.nextInt(9) + 1;
					if(r.nextBoolean()) {
						//砍
						if(get1 == 8) {
							if(cardsCount.containsKey(get1)) {
								if(cardsCount.get(get1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1, 0);
							}
							if(cardsCount.containsKey(get1 - 1)) {
								if(cardsCount.get(get1 - 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 - 1, 0);
							}
							if(cardsCount.containsKey(get1 + 1)) {
								if(cardsCount.get(get1 + 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 + 1, 0);
							}
							allCards.add(get1 - 1);
							allCards.add(get1);
							allCards.add(get1 + 1);
							cardsCount.put(get1, cardsCount.get(get1) + 1);
							cardsCount.put(get1 - 1, cardsCount.get(get1 - 1) + 1);
							cardsCount.put(get1 + 1, cardsCount.get(get1 + 1) + 1);
							zu1 -= 1;
						}else if(get1 == 9) {
							if(cardsCount.containsKey(get1)) {
								if(cardsCount.get(get1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1, 0);
							}
							if(cardsCount.containsKey(get1 - 1)) {
								if(cardsCount.get(get1 - 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 - 1, 0);
							}
							if(cardsCount.containsKey(get1 - 2)) {
								if(cardsCount.get(get1 - 2) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 - 2, 0);
							}
							allCards.add(get1 - 1);
							allCards.add(get1);
							allCards.add(get1 - 2);
							cardsCount.put(get1, cardsCount.get(get1) + 1);
							cardsCount.put(get1 - 1, cardsCount.get(get1 - 1) + 1);
							cardsCount.put(get1 - 2, cardsCount.get(get1 - 2) + 1);
							zu1 -= 1;
						}else {
							if(cardsCount.containsKey(get1)) {
								if(cardsCount.get(get1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1, 0);
							}
							if(cardsCount.containsKey(get1 + 1)) {
								if(cardsCount.get(get1 + 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 + 1, 0);
							}
							if(cardsCount.containsKey(get1 + 2)) {
								if(cardsCount.get(get1 + 2) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 + 2, 0);
							}
							allCards.add(get1);
							allCards.add(get1 + 1);
							allCards.add(get1 + 2);
							cardsCount.put(get1, cardsCount.get(get1) + 1);
							cardsCount.put(get1 + 1, cardsCount.get(get1 + 1) + 1);
							cardsCount.put(get1 + 2, cardsCount.get(get1 + 2) + 1);
							zu1 -= 1;
						}
					}else {
						//碰
						if(cardsCount.containsKey(get1)) {
							if(cardsCount.get(get1) + 3 > 4) {
								continue;
							}
						}else {
							cardsCount.put(get1, 0);
						}
						allCards.add(get1);
						allCards.add(get1);
						allCards.add(get1);
						cardsCount.put(get1, cardsCount.get(get1) + 3);
						zu1 -= 1;
					}
				}
				while(zu2 > 0) {
					int get1 = r.nextInt(9) + 11;
					if(r.nextBoolean()) {
						if(get1 == 18) {
							if(cardsCount.containsKey(get1)) {
								if(cardsCount.get(get1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1, 0);
							}
							if(cardsCount.containsKey(get1 - 1)) {
								if(cardsCount.get(get1 - 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 - 1, 0);
							}
							if(cardsCount.containsKey(get1 + 1)) {
								if(cardsCount.get(get1 + 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 + 1, 0);
							}
							allCards.add(get1 - 1);
							allCards.add(get1);
							allCards.add(get1 + 1);
							cardsCount.put(get1, cardsCount.get(get1) + 1);
							cardsCount.put(get1 - 1, cardsCount.get(get1 - 1) + 1);
							cardsCount.put(get1 + 1, cardsCount.get(get1 + 1) + 1);
							zu2 -= 1;
						}else if(get1 == 19) {
							if(cardsCount.containsKey(get1)) {
								if(cardsCount.get(get1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1, 0);
							}
							if(cardsCount.containsKey(get1 - 1)) {
								if(cardsCount.get(get1 - 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 - 1, 0);
							}
							if(cardsCount.containsKey(get1 - 2)) {
								if(cardsCount.get(get1 - 2) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 - 2, 0);
							}
							allCards.add(get1 - 1);
							allCards.add(get1);
							allCards.add(get1 - 2);
							cardsCount.put(get1, cardsCount.get(get1) + 1);
							cardsCount.put(get1 - 1, cardsCount.get(get1 - 1) + 1);
							cardsCount.put(get1 - 2, cardsCount.get(get1 - 2) + 1);
							zu2 -= 1;
						}else {
							if(cardsCount.containsKey(get1)) {
								if(cardsCount.get(get1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1, 0);
							}
							if(cardsCount.containsKey(get1 + 1)) {
								if(cardsCount.get(get1 + 1) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 + 1, 0);
							}
							if(cardsCount.containsKey(get1 + 2)) {
								if(cardsCount.get(get1 + 2) + 1 > 4) {
									continue;
								}
							}else {
								cardsCount.put(get1 + 2, 0);
							}
							allCards.add(get1);
							allCards.add(get1 + 1);
							allCards.add(get1 + 2);
							cardsCount.put(get1, cardsCount.get(get1) + 1);
							cardsCount.put(get1 + 1, cardsCount.get(get1 + 1) + 1);
							cardsCount.put(get1 + 2, cardsCount.get(get1 + 2) + 1);
							zu2 -= 1;
						}
					}else {
						if(cardsCount.containsKey(get1)) {
							if(cardsCount.get(get1) + 3 > 4) {
								continue;
							}
						}else {
							cardsCount.put(get1, 0);
						}
						allCards.add(get1);
						allCards.add(get1);
						allCards.add(get1);
						cardsCount.put(get1, cardsCount.get(get1) + 3);
						zu2 -= 1;
					}
				}
				Collections.sort(allCards);
				LinkedList<MJCard> cards = new LinkedList<MJCard>();
				for(int c : allCards) {
					cards.add(MJCards.getOneCard(c % 10, c/ 10));
				}
				for(int j=0;j<laiziCount;j++) {
					cards.remove(r.nextInt(cards.size()));
					cards.add(laizi1);
				}
				soreCard(cards);
				List<List<MJCard>> huCardGroup = new ArrayList<>();
				boolean checkHu = MJUtil.checkHu(cards, null, laizi,huCardGroup);
				if(checkHu) {			
//					System.out.println(allCards+" "+checkAnGang.getType());
				}else {
					bw.write(cards.toString()+"\n");
//					System.out.println("no"+"  "+allCards);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("结束"+System.currentTimeMillis());
	}
	
	private static void soreCard(LinkedList<MJCard> cards) {
		Collections.sort(cards,new Comparator<MJCard>() {
			@Override
			public int compare(MJCard o1, MJCard o2) {
				return o1.getNumValue() - o2.getNumValue();
			}
		});
	}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值