每次斗地主,总感觉被腾讯针对,给我发不到好牌!于是,自己动手实现了一个发牌功能,能针对某个人,给他发不好的牌,也可以鼓励菜鸡,发一手吊炸天的牌。
主要有四个类:
- 纸牌类: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);
}
}
测试结果: