java集合学完了适合做这个
import java.util.*;
/*
需求: 模拟斗地主发牌
步骤:
1. 买牌.
2. 洗牌.
3. 发牌.
4. 看牌.
*/
public class TestPoker {
public static void main(String[] args) {
//1. 买牌.
//1.1 定义一个双列集合, 键: 表示牌的编号, 值: 表示具体的牌. 规则: 编号越小, 牌越小.
Map<Integer, String> pokers = new HashMap<>();
//1.2 定义一个单列集合, 用来存储所有牌的编号.
List<Integer> list = new ArrayList<>();
//1.3 具体的买牌动作.
//普通牌, 52.加大小王
// 蠢笨办法
/* pokers.put(1,"3♦");
pokers.put(2,"3♣");
pokers.put(3,"3♥");
pokers.put(4,"3♠");
System.out.println(pokers);
*/
//通过循环嵌套, 造 普通牌
String[] colors = {"♦", "♣", "♥", "♠"};
String[] numbers = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
int num = 0;
for (String number : numbers) {
for (String color : colors) {
String poker = number + color;
//将牌的编号, 具体的牌放到双列集合中.根据编号找牌
pokers.put(num, poker);
//将牌的编号放到单列集合中.
list.add(num);
num++;
}
}
//大小王.
//添加小王
pokers.put(num, "小王");
// 让编号加一存下个数据
list.add(num++);
//添加大王
pokers.put(num, "大王");
// 重复添加, 会用新值覆盖旧值, 并返回旧值.
list.add(num);
//打印牌就可以了.
System.out.println("所有的牌: " + pokers);
System.out.println("牌的编号:" + list);
//2. 洗牌 shuffle(list)打乱编号
Collections.shuffle(list);
System.out.println("洗好牌后, 编号为: " + list);
System.out.println("========================================");
//3. 发牌.
//3.1 定义4个集合, 分别表示3个玩家, 底牌.
List<Integer> zhangSan = new ArrayList<>();
List<Integer> LiSI = new ArrayList<>();
List<Integer> WangMaZi = new ArrayList<>();
List<Integer> diPai = new ArrayList<>();
//3.2 具体的发牌动作, 将索引和3取模, 决定发给谁.
//处理编号第一张牌发给一,第二张给二,依次类推需要用到下标了
// for (int i = 0; i < list.size(); i++) {
// //获取编号
// Integer pokerNumber = list.get(i);
// if (i % 3 == 0) {
// zhangSan.add(pokerNumber);
// } else if (i % 3 == 1) {
// LiSI.add(pokerNumber);
// }
// else if (i%3==2) {
// WangMaZi.add(pokerNumber);
// }
// else {//牌发完了才想起底牌
// diPai.add(pokerNumber);
// }
// }
for (int i = 0; i < list.size(); i++) {
//获取编号
Integer pokerNumber = list.get(i);
if (i >= list.size() - 3) {
diPai.add(pokerNumber);
} else if (i % 3 == 0) {
zhangSan.add(pokerNumber);
} else if (i % 3 == 1) {
LiSI.add(pokerNumber);
} else if (i % 3 == 2) {
WangMaZi.add(pokerNumber);
}
}
// 3.3 查看玩家, 底牌的编号.
System.out.println("张三" + zhangSan);
System.out.println("李四" + LiSI);
System.out.println("王麻子" + WangMaZi);
System.out.println("底牌" + diPai);
//4. 查看具体的牌
System.out.println("----------------------------------");
System.out.println("张三"+checkPoker(zhangSan,pokers));
System.out.println("李四"+checkPoker(LiSI,pokers));
System.out.println("王麻子"+checkPoker(WangMaZi,pokers));
System.out.println("底牌"+checkPoker(diPai,pokers));
}
//
/*
4. 定义一个方法, 用来看牌
方法名: printPoker
参数列表: List<Integer>, Map<Integer, String>
返回值: String
*/
public static String checkPoker(List<Integer> player, Map<Integer, String> pokers) {
//1. 对玩家牌的编号进行升序排列.
Collections.sort(player);
//2. 遍历牌的编号集合, 获取到每一个编号.
StringBuilder str = new StringBuilder();
for (Integer Serialnumber : player) {
String poker = pokers.get(Serialnumber);
//4. 将获取到的牌进行拼接.
str.append(poker + " ");
}
String playerPoker = str.toString();
return playerPoker;
}
}