三人斗地主 集合完成
编写一个自动发牌程序,模拟三人斗地主的摸牌场景。首先要给出提示,谁首先开始摸牌,并且摸牌要和现实摸牌一样,三人循环摸牌,最后还要剩余三张底牌,同时给出地主牌,摸到地主牌的玩家拥有三张底牌。三张底牌三人都可以看到。当三张底牌派发给地主后提示玩家摸牌结束
实现思路:
(1)首先将一副牌的四种花色和对应的牌面值随机组合放进Set集合,因为Set集合是非重复集合,所以无需考虑重复的问题,另外,因为每个牌面值出现的次数只能是四次,所以,当该牌面值出现了四次以后,将该牌面删除。
(2)获取洗牌结束的牌组(用Set集合作为初始化数据集),随机额抽取三张牌,作为底牌,不对玩家展示,并从剩余的牌组中随机选取一个张牌,作为地主牌,对所有人展示但不移动其位置。
(3)顺序循环发牌,直到牌组没有牌为止,将底牌展示并发给地主。提示玩家发牌结束。
package org.judy.card;
import java.util.*;
public class CardDemo {
//定义基本属性
//1 随机牌的存储
List<String> cardList = new ArrayList<>();
private List<String> bottomCards = new ArrayList<>(); //底牌组
private String LandCrad = null; //地主牌
private Random rm = new Random(); //随机数类
// 定义玩家
private List<String> playA = new ArrayList<>(); //玩家A
private List<String> playB = new ArrayList<>(); //玩家B
private List<String> playC = new ArrayList<>(); //玩家C
//定义随机牌组的生成方法
public Set<String> getCardSet() {
Set<String> cardSet = new HashSet<>(); //随机的Set牌组
Map<String, Integer> timesCount = new HashMap<>(); //牌面出现的次数
List<String> cardColors = getColor(); //编写方法完成
List<String> cardValues = getCardValue();
while (!cardValues.isEmpty()) { //牌组开始初始化
//获取牌面的颜色 (随机) 红桃
String cardColor = cardColors.get(rm.nextInt(cardColors.size()));
//获取牌面的值(随机)
String cardValue = cardValues.get(rm.nextInt(cardValues.size()));
String card = cardColor + " " + cardValue; //随机获得一张牌
if (cardSet.add(card)) { //如果插入底牌组成功 说明这是第一次插入
//如果牌面的值不是第一次插入 将牌面的值计数累加
if (timesCount.containsKey(cardValue)) {
timesCount.put(cardValue, timesCount.get(cardValue) + 1);
if (4 == timesCount.get(cardValue)) { //牌面出现4次
cardValues.remove(cardValue); //从牌面值list中删除
}
} else {
timesCount.put(cardValue, 1);
}
}
}
//增加大王 小王
cardSet.add("大王");
cardSet.add("小王");
return cardSet;
}
//牌面值的方法
public List<String> getCardValue() {
List<String> cardValue = new ArrayList<>();
cardValue.add("A");
cardValue.add("2");
cardValue.add("3");
cardValue.add("4");
cardValue.add("5");
cardValue.add("6");
cardValue.add("7");
cardValue.add("8");
cardValue.add("9");
cardValue.add("10");
cardValue.add("J");
cardValue.add("Q");
cardValue.add("K");
return cardValue;
}
public List<String> getColor() {
List<String> cardColor = new ArrayList<>();
cardColor.add("黑桃");
cardColor.add("红桃");
cardColor.add("梅花");
cardColor.add("方片");
return cardColor;
}
//发牌程序
public void deCard() {
cardList = new ArrayList<>(getCardSet());
//获得三张底牌
while (bottomCards.size() < 3) {
//从随机牌组中 抽出(删除)一张牌 放到底牌组
bottomCards.add(cardList.remove(rm.nextInt(cardList.size())));
}
// 从剩余牌组中 抽出一张牌作为地主牌
LandCrad = cardList.get(rm.nextInt(cardList.size()));
System.err.println("地主牌是" + LandCrad);
//循环发牌给玩家
int cardNum = cardList.size();
System.out.println("发牌开始");
for (int i = 1; i <= cardNum; i++) {
if (i % 3 == 0) {
playC.add(cardList.get(i - 1));
} else if (i % 3 == 1) {
playB.add(cardList.get(i - 1));
} else {
playA.add(cardList.get(i - 1));
}
}
System.out.println("发牌结束");
System.out.println("底牌是" + bottomCards);
if (playA.contains(LandCrad)) {
System.out.println("地主是玩家A");
while (!bottomCards.isEmpty()) {
playA.add(bottomCards.remove(0));
}
} else if (playB.contains(LandCrad)) {
System.out.println("地主是玩家B");
while (!bottomCards.isEmpty()) {
playB.add(bottomCards.remove(0));
}
} else {
System.out.println("地主是玩家C");
while (!bottomCards.isEmpty()) {
playC.add(bottomCards.remove(0));
}
}
}
public static void show(List<String> list) {
System.out.println("【");
int count = 0;
while (!(list.size() == 1)) {
count++;
System.out.print(list.remove(0) + "、");
if (count % 6 == 0) {
System.out.println();
}
}
System.out.println(list.remove(0) + " 】");
}
public static void main(String[] args) {
CardDemo card = new CardDemo();
card.deCard(); //发牌
System.out.println("玩家A的手牌是");
show(card.playA);
System.out.println("玩家B的手牌是");
show(card.playB);
System.out.println("玩家C的手牌是");
show(card.playC);
}
}