* 斗地主综合案例:有序版本
* 1.准备牌:
* 特殊牌:大王,小王
* 52张牌:循环嵌套遍历两个集合(或数组),组成成52张牌
* Listcolors=new ArrayList<>();
* Listnumbers=new ArrayList<>();
* Collections.addAll(colors,"♠","♥","♣","◆");
* Collections.addAll(numbers,"2","A","K"..."3");
* 本次54张牌用Map集合来接收,其中
* map集合中键表示牌的索引,值为组装好的牌
* 2.洗牌:
* 将Map集合中key(组装牌的索引)存储在list集合中,并由Collections集合工具类
* 中的shuffle(list)方法将List集合打乱顺序。
* 3.发牌:
* 一人一张轮流发牌,每人17张,通过索引%3分给三人,最后剩3张牌作为底牌。
* 因此要创建4个集合List,每个集合存放的map集合中的Key,即组装牌的索引。
* 4.排序:
* 使用Collections工具类中的sort(list)方法排序
* 5.看牌:
* 可以使用查表法
* 遍历一个集合list,获取到另外一个集合的key,通过key查找到value
* 遍历玩家和底牌的list,获取到Map集合的key,通过Key找到value.
public class Doudizhu {
public static void main(String[] args) {
/**
* 1.准备牌
*/
//创建map集合,存储牌的索引和组装好的牌
HashMap poker = new HashMap<>();
//创建一个list集合,存储牌的索引
ArrayList pokerIndex = new ArrayList<>();
//定义两个集合,存储花色和牌的序号
ArrayList colors = new ArrayList<>();
ArrayList numbers = new ArrayList<>();
Collections.addAll(colors,"♠","♥","♣","◆");
Collections.addAll(numbers,"2","A","K","Q","J","10","9","8","7","6","5","4","3");
//把大王和小王先存储到map集合,并把索引另外单独存储一份到pokerIndex集合中
//定义一个牌的索引
int index=0;
poker.put(index,"大王");
pokerIndex.add(index);
index++;
poker.put(index,"小王");
pokerIndex.add(index);
index++;
//循环两个集合,组装52张牌,存储到集合中
for (String number : numbers) { //for循环只能遍历单列集合
for (String color : colors) {
poker.put(index,color+number);
pokerIndex.add(index);
index++;
}
}
System.out.println(poker);
System.out.println(pokerIndex);
/*map集合(poker)中组装牌与索引映射关系:
* {0=大王, 1=小王, 2=♠2, 3=♥2, 4=♣2, 5=◆2, 6=♠A, 7=♥A, 8=♣A, 9=◆A, 10=♠K,
* 11=♥K, 12=♣K, 13=◆K, 14=♠Q, 15=♥Q, 16=♣Q, 17=◆Q, 18=♠J, 19=♥J, 20=♣J,
* 21=◆J, 22=♠10, 23=♥10, 24=♣10, 25=◆10, 26=♠9, 27=♥9, 28=♣9, 29=◆9,
* 30=♠8, 31=♥8, 32=♣8, 33=◆8, 34=♠7, 35=♥7, 36=♣7, 37=◆7, 38=♠6, 39=♥6,
* 40=♣6, 41=◆6, 42=♠5, 43=♥5, 44=♣5, 45=◆5, 46=♠4, 47=♥4, 48=♣4, 49=◆4,
* 50=♠3, 51=♥3, 52=♣3, 53=◆3}
*
*pokerIndex集合中记录了一份组装牌的索引,下面要将其打乱分发给3个玩家
* [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
* 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
* 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]
* */
/**
* 2.洗牌:洗的是牌的索引
*/
//使用Collections集合工具类中的shuffle(list)方法进行打乱顺序,洗牌:洗的是牌的索引
Collections.shuffle(pokerIndex);
//System.out.println(pokerIndex);
/**
* 3.发牌:定义4个集合,存储3个玩家牌的索引和底牌的索引
*/
ArrayList play01 = new ArrayList<>();
ArrayList play02 = new ArrayList<>();
ArrayList play03 = new ArrayList<>();
ArrayList diPai = new ArrayList<>();
//遍历存储组装牌索引的pokerIndex集合,获取每一个牌的索引
for (int i=0;i=51){
//给底牌发牌
diPai.add(in);
}else if(i%3==0){
//给玩家1发牌
play01.add(in);
}else if(i%3==1){
//给玩家2发牌
play02.add(in);
}else if(i%3==2) {
//给玩家3发牌
play03.add(in);
}
}
/**
* 4.排序
* 使用Collections集合工具类中的sort方法对玩家的集合排序
* 默认是升序排序。
*/
Collections.sort(play01);
Collections.sort(play02);
Collections.sort(play03);
Collections.sort(diPai);
System.out.println("..........................................");
/**
* 5.看牌
* 调用看牌的方法lookPoker
*/
lookPoker("萧炎",poker,play01);
lookPoker("彩鳞",poker,play02);
lookPoker("云芝",poker,play03);
lookPoker("底牌",poker,diPai);
}
/**
*
* 定义一个看牌的方法,提高代码复用性
* 参数:
* String name:玩家名称
* HashMappoker:存储牌的poker集合
* ArrayListlist:存储玩家和底牌的List集合
*/
public static void lookPoker(String name,HashMappoker,
ArrayListlist){
//输出玩家名称,不换行
System.out.print(name+" ");
//遍历玩家或者底牌的集合,获取牌的索引
for (Integer key : list) {
//使用牌的索引,去map集合中找到对应的牌
String value = poker.get(key);
System.out.print(value+" ");
}
System.out.println();//打印完每一个玩家的牌,换行。
}
}