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 }