1 import java.util.*; 2 3 /* 4 4人斗地主 5 分析: 6 1.斗地主首先要有一副牌,用什么定义一副牌,牌又有那些种类比如花色和符号 7 2.牌的顺序是乱的,怎么让他变乱序的 8 3.最后会留下三张归地主所有 9 4.个人会整理牌,如何使用Java实现 10 实现: 11 初始化牌即生成一副扑克牌 12 1.一副牌,相当于一个集合,集合的顺序是乱的,使用HashMap集合,键是编号,值是牌 13 2.一共52张牌,52个号,使用ArrayList集合 14 3.创建牌的花色和点数数组 15 4.从0开始向HashMap里存入编号,储存对应的牌,向Arraylist集合中存储编号 16 洗牌动作 17 5.以上步骤是初始化生成的牌,接下来要进行洗牌动作,洗牌就是打乱顺序,也就是打乱编号 18 可以使用Collections的shuffle方法来实现 19 发牌动作 20 6.发牌即为给每个人发编号,为保证编号是排序的,创建TreeSet集合用来接受变好 21 个人看牌 22 7.因为总人数是固定的,且程序需要的功能就是可以自己看到个人牌,不同人的牌是不一样的 23 可以定义一个方法来实现看牌的过程 24 8.直接调用方法显示个人获得牌 25 */ 26 public class CollectionTest01 { 27 public static void main(String[] args) { 28 //创建HashMap集合用来存放牌的编号和牌的花色点数 29 HashMap<Integer, String> hashMap = new HashMap<Integer, String>(); 30 //创建ArrayList集合用来存储编号 31 ArrayList<Integer> list = new ArrayList<Integer>(); 32 //生成花色和点数,花色即4种,点数13种 33 String[] colors = {"♦", "♣", "♥", "♠"}; 34 String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; 35 //从0开始向HashMap集合中添加编号 36 int index = 0; 37 //使用增强for循环来进行添加操作,因为我们是要对点数进行排列所以先进行点数的循环 38 for (String number : numbers) { //String color : colors 39 for (String color : colors) { //String number : numbers 40 //将编号即键和值即花色点数添加到HashMap集合中 41 hashMap.put(index, color + number); 42 //将编号添加到ArrayList集合中 43 list.add(index); 44 //编号加一 45 index++; 46 } 47 } 48 //两张特殊的牌大王小王 49 hashMap.put(index, "小王"); 50 //同理编号添加到ArrayList集合中 51 list.add(index); 52 //编号加一 53 index++; 54 hashMap.put(index, "大王"); 55 //同理编号添加到ArrayList集合中 56 list.add(index); 57 // 洗牌 使用Collections中shuffle方法,随机排列编号, 58 Collections.shuffle(list); 59 // 创建接受对象,使用treeset集合自动排序 60 TreeSet<Integer> aaaaa = new TreeSet<Integer>(); 61 TreeSet<Integer> bbbbb = new TreeSet<Integer>(); 62 TreeSet<Integer> ccccc = new TreeSet<Integer>(); 63 TreeSet<Integer> ddddd = new TreeSet<Integer>(); 64 // 创建底牌对象,即最后三张牌,需展示 65 TreeSet<Integer> dipai = new TreeSet<Integer>(); 66 // 进行发牌动作,循环遍历集合list 67 for (int i = 0; i < list.size(); i++) { 68 // 创建新对象获取索引值编号 69 int x = list.get(i); 70 //判断最后三张牌 71 if (i >= list.size() - 3) { 72 // 将对应的索引值添加到底牌集合中 73 dipai.add(x); 74 // 分发牌,有个规律 75 // 52/4 ==0 76 // 51/4 ==3 第一个人拿到一张牌 77 // 50/4 ==2 第二个人拿到一张牌 78 // 49/4 ==1 第三个人拿到一张牌 79 // 48/4 ==0 第四个人拿到一张牌 80 // 47/4 ==3 第一个人拿到二张牌 81 // 46/4 ==2 第二个人拿到二张牌 82 // 45/4 ==1 第三个人拿到二张牌 83 //依次可推,当余数是0是第四个拿到了牌,简而言之,余数就对应拿牌的人 84 } else if (i % 4 == 0) { 85 aaaaa.add(x); 86 } else if (i % 4 == 1) { 87 bbbbb.add(x); 88 } else if (i % 4 == 2) { 89 ccccc.add(x); 90 } else if (i % 4 == 3) { 91 ddddd.add(x); 92 } 93 } 94 // 调用方法,显示结果 95 lookPoker("农民1", aaaaa, hashMap); 96 lookPoker("农民2", bbbbb, hashMap); 97 lookPoker("农民3", ccccc, hashMap); 98 lookPoker("农民4", ddddd, hashMap); 99 lookPoker("低排有", dipai, hashMap); 100 } 101 102 // 创建看牌方法,将看派人的姓名,个人拿到的牌集合,牌的集合作为参数 103 private static void lookPoker(String name, TreeSet<Integer> qw, HashMap<Integer, String> hashMap) { 104 // 打印姓名不换行 105 System.out.print(name + " 的牌是 "); 106 // 增强for循环,遍历Treeset集合,获取个人的牌 107 for (Integer key : qw) { 108 // 通过get方法取出在根据键取出对应的值即花色和点数,给到字符串对象 109 String poker = hashMap.get(key); 110 // 不换行打印输出 111 System.out.print(poker + " "); 112 } 113 // 换行 114 System.out.println(); 115 } 116 }