/**
- 利用集合模拟斗地主发牌的过程
- @author Administrator
*/
public class PorkGame_Demo02 {
public static void main(String[] args) {
// 1.首先用两个字符串数组把数字和花色有序存储起来,由于大小王不能匹配花色,故最后将其加入
String[] porkNum = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[] porkColor = {"♥","♠","♦","♣"};
//2.创建两个集合,一个用来存放每一张具体的牌(HashMap),一个用来存放每张牌对应的索引(ArrayList)。
//第一个用HashMap因为该集合具备键值对,能够通过键来确定具体的牌,而索引是有序的所以存到List集合中。
HashMap<Integer,String> pork = new HashMap<Integer,String>();
List<Integer> list = new ArrayList<Integer>(); //父类引用指向子类对象
//3.遍历1.中的两个数组,将每个牌元素存入到创建的集合中,并且需要初始化索引下标
int index = 0;
for (String pNum : porkNum) {
//外层循环控制数字
for (String pCor : porkColor) {
//内层循环控制每个数字对应的花色,然后开始将每个牌及其索引存入到集合中
pork.put(index, pCor.concat(pNum));
list.add(index);
index++;
}
}
//现在除了大小王,都存入集合了,就差大小王,因为index++是放在语句最后一行,所以现在index值已经自增了,开始添加
pork.put(index, "subJoker");
list.add(index);
index++;
pork.put(index, "superJoker");
list.add(index);
//4.添加元素完毕,将扑克牌打乱顺序
Collections.shuffle(list);
//5.开始发牌,为了将牌可以按照自然顺序排列展现在玩家手中,故将索引元素存放在TreeSet中
TreeSet<Integer> player01 = new TreeSet<Integer>();
TreeSet<Integer> player02 = new TreeSet<Integer>();
TreeSet<Integer> player03 = new TreeSet<Integer>();
TreeSet<Integer> finalCard = new TreeSet<Integer>();
//开始发牌
for(int i=0 ; i<pork.size() ; i++) {
if(i>pork.size()-4) {//三张底牌
finalCard.add(list.get(i));
}else if(i%3==0) {//三个人中的一个人的牌,因为发三次牌为一轮
player01.add(list.get(i));
}else if(i%3==1) {
player02.add(list.get(i));
}else {
player03.add(list.get(i));
}
}
//创建一个方法将每个人获得的牌打印出来,调用该方法打印每个玩家的牌
showPork(pork,player01,"玩家01");
showPork(pork,player02,"玩家02");
showPork(pork,player03,"玩家03");
showPork(pork,finalCard,"底牌");
}
public static void showPork(HashMap<Integer,String> poker,TreeSet<Integer> index,String name) {
System.out.println(name+"的牌为:");
for (Integer key : index) {
String info = poker.get(key);
System.out.print(info+"、");
}
System.out.print("\n\n");
}
}