斗地主发牌,洗牌过程

这里写图片描述
import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.HashMap;

import java.util.TreeMap;

import java.util.TreeSet;

// 测试斗地主发牌过程

public class Test02 {
public static void main(String[] args) {
String[]   num={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[]   color={"梅花","方块","红桃","黑桃"};                    

//定义两个字符串数组,用于遍历拼接模拟扑克牌

HashMap<Integer,String> hm=new HashMap<>();  

//1,创建一个双列集合用于存储扑克牌, 其中键值对为 索引 和 扑克牌值

ArrayList<Integer> list =new ArrayList<>();  

//2,创建一个单列集合,用来存储索引, 后续对索引进行操作
int index =0; //实现索引和值的有序装入
//3,遍历字符串,有序的装入到双列集合中

   for(String n: num) {       //增强for循环 ,外层遍历数字

    for(String c: color) {          

     hm.put(index,c.concat(n)); //可以实现从梅花3, 方块3, 红桃3,黑桃3,...依次递增 
     list.add(index);   
//顺便把索引也进去单列集合中,因为 索引和值 是一一对应关系, 所以后面把索引打乱 就相当于洗牌
         index++; //关键,不要忘了索引自增
    }

}
//再装入大小王,此时index 因为把52张牌全装完了 ,索引51+ 1 =52跳出循环
hm.put(index,"小王");
list.add(index);   
index++ ;
hm.put(index, "大王");
list.add(index);

// System.out.println(hm); //测试 是否都有序转入了双列集合中

//4,把装入索引的集合打乱,相对于洗牌
Collections.shuffle(list);  

//调用集合工具类用来随机置换集合中存储的索引值

//System.out.println(list); //测试用

//5 开始发牌了 ,就是分发打乱的索引
//创建4个集合,模拟3个人和底牌 
TreeSet<Integer> gaojin= new TreeSet<>();  

//这里创建的是TreeSet集合,因为他实现了排序, 在看牌的时候,所有的牌已经按照索引的升序排序了,而在扑克牌内容也是升序的

TreeSet<Integer> duxia= new TreeSet<>();      

//Integer类实现了Comparable接口, 重写了compareTo方法, 自然顺序排序

TreeSet<Integer> me= new TreeSet<>();
TreeSet<Integer> dipai= new TreeSet<>();

for(int i=0;i<list.size();i++) {
    if(i>=list.size()-3) {
        dipai.add(list.get(i));
/*获取集合中的索引, 最后三张的先留下来做底牌 此处应该注意一下, 该处获取的是集合中已经打乱存储的索引值,而不是集合自身所带的角标,虽然list集合中也有自己的索引,但是这个获取的是里面存储的值*/
    }else if(i%3==0) {              //第一张给高进
        gaojin.add(list.get(i));
    }else if(i%3==1) {             //第二张给赌侠
        duxia.add(list.get(i));
    }else {
        me.add(list.get(i));       //第三张给我,依次循环发牌 ,直到牌发完
    }
}

//6,发牌完成,现在看牌,分别看这四堆牌,此时定义一个方法

  lookPoker("高进", gaojin, hm);
  lookPoker("赌侠", duxia, hm);
  lookPoker("我的", me, hm);
  lookPoker("底牌", dipai, hm);

}

//看牌方法,传入三个参数

public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String> hm) {
System.out.print(name+"的牌如下:");
for(Integer i:ts) {
    System.out.print(hm.get(i)+" ");  //根据索引到双列集合中获取到对应的牌的内容 
}
System.out.println(); //输入一个换行,用于每个人的牌占一行, 能直观的看到

}

猜你喜欢

转载自blog.csdn.net/qq_39494996/article/details/80932980
今日推荐