斗地主小游戏

面对一个问题,需要先摸清楚设计流程,流程清晰之后才可以着手开发

  1. 准备牌
  2. 洗牌
  3. 发牌

按照流程来写:

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
import java.util.ArrayList;
import java.util.Collections;

public class PokerHandle {

// 静态代码块中使用list也需要static
static ArrayList<String> list = new ArrayList<>();

// 准备牌
static{
String[] color = {"♠","♥","♣","♦"};
String[] number = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// 这里进行双重遍历,分配出牌组
for (int i = 0; i < color.length; i++) {
for (int n = 0; n < number.length; n++) {
list.add(color[i]+number[n]);
}
}

list.add("大王");
list.add("小王");
}
public PokerHandle(){
// 洗牌
Collections.shuffle(list);

// 发牌 需要四个数组
ArrayList<String> hand = new ArrayList<>();
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();

for (int i = 0; i < list.size(); i++) {
String poker = list.get(i);
if(i<3){
// 分配给底牌
hand.add(poker);
continue;
}
// 对i模三取余,这是常用的分配方式
if(i % 3 == 0){
player1.add(poker);
}
else if(i % 3 == 1){
player2.add(poker);
}
else{
player3.add(poker);
}
}
// 看牌
PokerList("底牌",hand);
PokerList("小王",player1);
PokerList("小吴",player2);
PokerList("小栗子",player3);
}
public void PokerList(String name,ArrayList list){

System.out.print(name + "的牌是:" + list);
System.out.println();

}
}

排序方式,给每张牌附上对应的值,使用键值对的方式,可以使用HashMap,这个的优势是比较快速,但如果需要排序的话,使用TreeMap即可

该方法时在上一个程序的基础上进行的改进,添加了排序,键值对数据对应

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
public class PokerHandle2 {

// 准备使用HashMap去匹配键值对
// 准备牌
static HashMap<Integer,String> map = new HashMap<>();
static ArrayList<Integer> list = new ArrayList<>();

static {
String[] color = {"♠", "♥", "♣", "♦"};
String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};

int i = 1;
// 进行赋值 注意顺序
for (String s : number) {
for (String n : color) {
map.put(i,s+n);
// 牌放进集合
list.add(i);
i++;
}
}
map.put(i,"小王");
list.add(i);
i++;
map.put(i,"大王");
list.add(i);
}

public PokerHandle2(){
// 洗牌
Collections.shuffle(list);
// 分发
TreeSet<Integer> hand = new TreeSet<>();
TreeSet<Integer> player1 = new TreeSet<>();
TreeSet<Integer> player2 = new TreeSet<>();
TreeSet<Integer> player3 = new TreeSet<>();

for (int i = 0; i < list.size(); i++) {
Integer poker = list.get(i);
if(i<3){
// 分配给底牌
hand.add(poker);
continue;
}
// 对i模三取余,这是常用的分配方式
if(i % 3 == 0){
player1.add(poker);
}
else if(i % 3 == 1){
player2.add(poker);
}
else{
player3.add(poker);
}
}
// 看牌
SeePoker("底牌",hand);
SeePoker("小王",player1);
SeePoker("小吴",player2);
SeePoker("小栗子",player3);
}
public void SeePoker(String name,TreeSet<Integer> list){
System.out.print(name + "的牌为:");
for (int i : list) {
String poker = map.get(i);
System.out.print(" " + poker);
}
System.out.println();
}
}

自此完成了控制台版本的斗地主模块,之后是进阶到页面的形式,但是frame框架实用度不高,这里暂时放下