每次鬥地主,總感覺被騰訊針對,給我發不到好牌!於是,自己動手實現了一個發牌功能,能針對某個人,給他發不好的牌,也可以鼓勵菜雞,發一手吊炸天的牌。
主要有四個類:
- 紙牌類: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);
}
}
測試結果: