loading...
模拟斗地主洗牌与发牌功能
Published in:2022-01-31 | category: JavaSE项目集合
Words: 1.1k | Reading time: 5min | reading:

模拟斗地主洗牌和发牌,并保证每个玩家手中的牌有序

问题分析

  • 牌:54张牌
  • 三位玩家
  • 三张底牌
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
/*
分析:
1)创建牌盒
HashMap<Integer,String>
键存储的是牌的编号
值存储的是就是每一个牌(花色和点数的拼接)
ArrayList< Integer>:
单独存储编号
2)装牌
定义一个编号:int index = 0 ;
定义花色字符串数组:♥ ♠ ♣ ♦
点数字符串数组 3 4 5 6 7 8 9 10 J Q k A 2
2.1)遍历点数数组和花色数组,拼接起来
2.2)给HashMap<Integer,String> 存储编号和牌
给ArrayList存储编号
index ++

2.3)给HashMap<Integer,String>单独存储小王,和大王
给ArrayList<Integer>添加小王对应的编号 并index++

3)洗牌

* 洗 的是编号:
* Collections
* public static void shuffle(List<?> list):随机置换
*
* 4)发牌
* 发的也是编号,为了保证每个人手上的有序,所以三个玩家都需要TreeSet<Integer>
* for(int x = 0 ; x < array.size(); x ++){
* //3个玩
* //规律
* 取底牌
* 如果
* x>=array.size()-3
* 获取底牌get(int index)
* 如果x % 3 == 0
* 获取第一个玩家存储的编号
* x% 3 == 1
* 获取第二个玩家存储的编号
* x% 3 == 2
* 获取第三个玩家的编号

* }
*
*
* 5)看牌
* 封装成一个功能
* lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer,String> hm)
*
* 遍历TreeSet集合:获取每一个手上的编号
* 在使用编号在hm集合寻找对应的值: get(K key)--->V value
输出牌即可!
*/

具体代码实现

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class PokerDemo2 {
public static void main(String[] args) {
/*
* 1)创建一个牌盒
* HashMap<IntegString>
* 键存储的是牌的编号
* 值存储的就是每一个牌,(花色和点数的拼接)
* ArrayList<Integer>
* 单独存储编号
*/
HashMap<Integer , String> hashMap =new HashMap<Integer , String>();
ArrayList<Integer> array = new ArrayList<Integer>();

//2)装牌

//定义一个数组,存储牌的点数
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//定义一个数组,存储牌的花色
String[] color = {"♥","♠","♣","♦"};

//将点数和花色结合,并加入到HashMap和ArrayList集合中
//定义一个编号:int index = 0 ; 编号从0开始
int index = 0;
//2.1)遍历点数数组和花色数组,拼接起来
for (String number : numbers) {
for(String huase : color){
//拼接
String value = huase.concat(number);
//将编号以及牌添加到HashMap中
hashMap.put(index, value);
//将编号存储在ArrayList集合中
array.add(index);
index++;
}
}

//2.2)添加小王
hashMap.put(index, "小王");
array.add(index);
index++;

//添加大王
hashMap.put(index, "大王");
array.add(index);
index++;

// System.out.println(hashMap);

//3)洗牌:打乱牌顺序
Collections.shuffle(array);

//4)发牌:发的编号,为保证每个人手中的牌有序,所以我们使用TreeSet集合进行自然排序
/**
* for(int x = 0 ; x < array.size(); x ++){
* //3个玩家
* //规律
* 取底牌
* 如果
* x>=array.size()-3
* 获取底牌get(int index)
* 如果x % 3 == 0
* 获取第一个玩家存储的编号
* x % 3 == 1
* 获取第二个玩家存储的编号
* x % 3 == 2
* 获取第三个玩家的编号
*/
//创建底牌和三个玩家的集合
TreeSet<Integer> player1 = new TreeSet<Integer>();
TreeSet<Integer> player2 = new TreeSet<Integer>();
TreeSet<Integer> player3 = new TreeSet<Integer>();
TreeSet<Integer> dipai = new TreeSet<Integer>();

//给底牌和三位玩家发牌
for(int i = 0 ; i < array.size() ; i++){
if(i >= (array.size()-3)){ //底牌
dipai.add(array.get(i));
}else if( i % 3 == 0){//给第一位玩家发牌
player1.add(array.get(i));
}else if( i % 3 == 1){//给第二位玩家发牌
player2.add(array.get(i));
}else if( i % 3 == 2){//给第三位玩家发牌
player3.add(array.get(i));
}
}

//5)看牌,将看牌功能封装成一个特有的方法,单独调用
lookPoker("张三", hashMap, player1);
lookPoker("李四", hashMap, player2);
lookPoker("王五", hashMap, player3);
lookPoker("底牌", hashMap, dipai);
}

public static void lookPoker(String name , HashMap<Integer , String> hashMap, TreeSet<Integer> array){
System.out.print(name + "的牌是:");
//需要遍历TreeSet集合获取每一个人手上的编号
for (Integer key : array) {
//获取每一个编号
//在HashMap集合中:通过键获取值(获取牌)
String value = hashMap.get(key);
System.out.print(value + " ");
}
System.out.println();
}
}
Prev:
JDBC
Next:
汉诺塔(递归写法)
catalog
catalog