Java實現鬥地主發牌功能,關照發牌,針對發牌,正常發牌

每次鬥地主,總感覺被騰訊針對,給我發不到好牌!於是,自己動手實現了一個發牌功能,能針對某個人,給他發不好的牌,也可以鼓勵菜雞,發一手吊炸天的牌。

主要有四個類:

  • 紙牌類:Card
  • 玩家類:Palyer
  • 遊戲桌類:Machine
  • 荷官類:Croupier
package com.bonc.xcloud.procedure.doudi;

/**
 * 撲克牌類
 * 
 * @author 191013
 *
 */
public class Card implements Comparable<Card> {
	private int id;
	private String cardName;
	private static int count;

	public Card(String cardName) {
		super();
		count++;
		this.cardName = cardName;
		this.id = count;// 這個順序就是創建牌的順序
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCardName() {
		return cardName;
	}

	public void setCardName(String cardName) {
		this.cardName = cardName;
	}

	public static int getCount() {
		return count;
	}

	public static void setCount(int count) {
		Card.count = count;
	}

	@Override
	public int compareTo(Card card) {
		return this.id - card.id;
	}

	@Override
	public String toString() {
		return getCardName();
	}
}

package com.bonc.xcloud.procedure.doudi;

import java.util.ArrayList;
import java.util.List;

/**
 * 玩家實體類
 * 
 * @author 191013
 *
 */
public class Palyer {
	private String palyerName;
	List<Card> cardList = null;

	public Palyer(String palyString) {
		this.palyerName = palyString;
		this.cardList = new ArrayList<Card>();
	}

	public List<Card> getCardList() {
		return cardList;
	}

	public void setCardList(List<Card> cardList) {
		this.cardList = cardList;
	}

	public String getPalyerName() {
		return palyerName;
	}

	public void setPalyerName(String palyerName) {
		this.palyerName = palyerName;
	}

	public void addCard(Card card) {
		cardList.add(card);
	}

}

package com.bonc.xcloud.procedure.doudi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * 發牌機器
 * 
 * @author 191013
 *
 */
public class Machine {

	public Machine() {
		super();
	}

	/**
	 * 創建一副牌
	 * 
	 * @return allCard
	 */
	public List<Card> createCardList() {
		String[] collor = { "♥", "♠", "♦", "♣" };
		String[] number = { "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };
		List<Card> allCard = new ArrayList<Card>();

		// 這裏要注意添加順序
		allCard.add(new Card("大王"));
		allCard.add(new Card("小王"));
		for (String n : number) {
			for (String c : collor) {
				Card card = new Card(n + c);
				allCard.add(card);
			}
		}
		return allCard;
	}

	/**
	 * 洗牌
	 * 
	 * @param allCards
	 */
	public void shuffle(List<Card> allCards) {
		if (allCards != null) {
			Collections.shuffle(allCards);
		}
	}

	/**
	 * 常規發牌
	 * 
	 * @param allPalyers 所有玩家
	 */
	public void generalDealCard(List<Card> allCard, List<Palyer> allPalyers, List<Card> end) {
		if (allPalyers.size() != 3) {
			System.out.println("玩家數量不是三人!");
			return;
		}

		// 洗牌
		shuffle(allCard);

		int count = 1;
		for (Card c : allCard) {
			if (count % 3 == 1 && count < 52)
				allPalyers.get(0).addCard(c);
			else if (count % 3 == 2 && count < 52)
				allPalyers.get(1).addCard(c);
			else if (count % 3 == 0 && count < 52)
				allPalyers.get(2).addCard(c);
			else
				end.add(c);
			count++;
		}
	}

	/**
	 * 針對某個玩家發牌
	 * 
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void specialDealCard(List<Card> allCard, List<Palyer> allPalyers, List<Card> end, String specialName) {
		if (allPalyers.size() != 3) {
			System.out.println("玩家數量不是三人!");
			return;
		}

		Palyer specialPalyer = null;
		Palyer palyer2 = null;
		Palyer palyer3 = null;

		for (Palyer p : allPalyers) {
			if (p.getPalyerName().equals(specialName)) {
				specialPalyer = p;
			} else {
				if (palyer2 == null) {
					palyer2 = p;
				} else if (palyer3 == null) {
					palyer3 = p;
				}
			}
		}

		if (specialPalyer == null) {// 給的名字不在當前參與的玩家中
			generalDealCard(allCard, allPalyers, end);
			return;
		}

		// 洗牌
		shuffle(allCard);

		for (int i = 0; i < 54; i++) {
			if (i % 3 == 0 && i < 51) {
				specialPalyer.addCard(specialDealCardToPalyer(allCard, i));
			} else if (i % 3 == 1 && i < 51) {
				palyer2.addCard(allCard.get(i));
			} else if (i % 3 == 2 && i < 51) {
				palyer3.addCard(allCard.get(i));
			} else {
				end.add(allCard.get(i));
			}
		}

	}

	/**
	 * 對牌做手腳,讓他得到不好的牌
	 * 
	 * @param allCard
	 * @param index
	 * @return
	 */
	public Card specialDealCardToPalyer(List<Card> allCard, int index) {
		HashMap<String, String> specialCard = new HashMap<String, String>();
		specialCard.put("大王", "");
		specialCard.put("小王", "");
		specialCard.put("2♠", "");
		specialCard.put("2♥", "");
		specialCard.put("2♦", "");
		specialCard.put("2♣", "");
		specialCard.put("A♠", "");
		specialCard.put("K♦", "");
		specialCard.put("Q♠", "");
		specialCard.put("J♠", "");

		int next = index + 1;
		while (next < allCard.size() && specialCard.containsKey(allCard.get(index).getCardName())) {
			Collections.swap(allCard, index, next);
			next++;
		}
		return allCard.get(index);
	}

	/**
	 * 照顧菜雞發牌
	 * 
	 * @param allCard
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void careDealCard(List<Card> allCard, List<Palyer> allPalyers, List<Card> end, String specialName) {
		if (allPalyers.size() != 3) {
			System.out.println("玩家數量不是三人!");
			return;
		}
		Palyer specialPalyer = null;
		Palyer palyer2 = null;
		Palyer palyer3 = null;

		for (Palyer p : allPalyers) {
			if (p.getPalyerName().equals(specialName)) {
				specialPalyer = p;
			} else {
				if (palyer2 == null) {
					palyer2 = p;
				} else if (palyer3 == null) {
					palyer3 = p;
				}
			}
		}

		if (specialPalyer == null) {// 給的名字不在當前參與的玩家中
			generalDealCard(allCard, allPalyers, end);
			return;
		}

		// 洗牌
		shuffle(allCard);

		for (int i = 0; i < 54; i++) {
			if (i % 3 == 0 && i < 51) {
				specialPalyer.addCard(careDealCardToPalyer(allCard, i));
			} else if (i % 3 == 1 && i < 51) {
				palyer2.addCard(allCard.get(i));
			} else if (i % 3 == 2 && i < 51) {
				palyer3.addCard(allCard.get(i));
			} else {
				end.add(allCard.get(i));
			}
		}

	}

	/**
	 * 對牌做手腳,讓他得到好牌
	 * 
	 * @param allCard
	 * @param index
	 * @return
	 */
	public Card careDealCardToPalyer(List<Card> allCard, int index) {
		HashMap<String, String> specialCard = new HashMap<String, String>();
		specialCard.put("大王", "");
		specialCard.put("小王", "");
		specialCard.put("2♠", "");
		specialCard.put("2♥", "");
		specialCard.put("2♦", "");
		specialCard.put("2♣", "");
		specialCard.put("10♠", "");
		specialCard.put("10♣", "");

		int next = index + 1;
		while (next < allCard.size() && (!specialCard.containsKey(allCard.get(index).getCardName()))) {
			Collections.swap(allCard, index, next);
			next++;
		}
		return allCard.get(index);
	}
}

package com.bonc.xcloud.procedure.doudi;

import java.util.Collections;
import java.util.List;

/**
 * 荷官,負責發牌,洗牌
 * 
 * @author 191013
 *
 */
public class Croupier {
	private Machine machine;
	private List<Card> allCard;

	public Croupier() {
		this.machine = new Machine();
		allCard = machine.createCardList();
	}

	/**
	 * 正常發牌
	 * 
	 * @param allPalyers
	 */
	public void generalDealCard(List<Palyer> allPalyers, List<Card> end) {
		// 發牌之前要保證每個玩家手裏沒有牌
		for (Palyer p : allPalyers) {
			if (p.getCardList() != null && p.getCardList().size() != 0) {
				p.getCardList().clear();
			}
		}
		// 底盒中也不能有底牌
		if (end != null && end.size() != 0) {
			end.clear();
		}
		machine.generalDealCard(allCard, allPalyers, end);
	}

	/**
	 * 給croupier一個名字,她會還你一個天台
	 * 
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void specialDealCard(List<Palyer> allPalyers, List<Card> end, String specialName) {
		// 發牌之前要保證每個玩家手裏沒有牌
		for (Palyer p : allPalyers) {
			if (p.getCardList() != null && p.getCardList().size() != 0) {
				p.getCardList().clear();
			}
		}
		// 底盒中也不能有底牌
		if (end != null && end.size() != 0) {
			end.clear();
		}
		machine.specialDealCard(allCard, allPalyers, end, specialName);
	}

	/**
	 * 給croupier一個名字,她會還你一個世界
	 * 
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void careDealCard(List<Palyer> allPalyers, List<Card> end, String specialName) {
		// 發牌之前要保證每個玩家手裏沒有牌
		for (Palyer p : allPalyers) {
			if (p.getCardList() != null && p.getCardList().size() != 0) {
				p.getCardList().clear();
			}
		}
		// 底盒中也不能有底牌
		if (end != null && end.size() != 0) {
			end.clear();
		}
		machine.careDealCard(allCard, allPalyers, end, specialName);
	}

	/**
	 * 看牌
	 * 
	 * @param allPalyers
	 * @param end
	 */
	public void printCard(List<Palyer> allPalyers, List<Card> end) {
		for (Palyer palyer : allPalyers) {
			Collections.sort(palyer.getCardList());
			System.out.println(palyer.getPalyerName() + " : " + palyer.getCardList().toString());
		}
		Collections.sort(end);
		System.out.println(end);
	}

}

Main中測試一下:

package com.bonc.xcloud.procedure.doudi;

import java.util.ArrayList;
import java.util.List;

public class Main {
	public static void main(String[] args) {
		List<Palyer> allPalyers = new ArrayList<Palyer>();
		List<Card> end = new ArrayList<Card>();

		System.out.println("黃氏賭場,講究的就是公平、公正、公開,關心每一位賭徒的生命使我們義不容辭的責任:");
		Palyer p1 = new Palyer("菜原原");
		Palyer p2 = new Palyer("蔡徐坤");
		Palyer p3 = new Palyer("醬油甲");
		allPalyers.add(p1);
		allPalyers.add(p2);
		allPalyers.add(p3);

		// 澳門皇家賭場,性感荷官在線發牌
		Croupier croupier = new Croupier();

		// 發牌
		croupier.generalDealCard(allPalyers, end);
		// 看牌
		croupier.printCard(allPalyers, end);

		System.out.println("\n菜原原有點狂,將要被針對:");
		// 發牌
		croupier.specialDealCard(allPalyers, end, p1.getPalyerName());
		// 看牌
		croupier.printCard(allPalyers, end);

		System.out.println("\n菜原原哭了,覺得自己不應該狂,趕快照顧一下:");
		// 發牌
		croupier.careDealCard(allPalyers, end, p1.getPalyerName());
		// 看牌
		croupier.printCard(allPalyers, end);
	}
}

測試結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章