1.案例介绍
按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
1. 组装54张扑克牌将
2. 54张牌顺序打乱
3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
4. 查看三人 各自手中的牌(按照牌的大小排序)、底牌 规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
2.案例分析
1. 准备牌: 完成编号与纸牌的映射关系: 使用双列Map(HashMap)集合,完成一个编号与字符串纸牌的对应关系(相当于一个字典)。
2. 洗牌: 通过编号完成洗牌发牌
3. 发牌: 将每个人以及底牌设计为ArrayList,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。 存放的过程中要求数字大小与斗地主规则的大小对应。 将代表不同纸牌的编号分配给不同的玩家与底牌。
4. 看牌: 通过查询纸牌与编号的对应关系,由编号转成纸牌字符串再进行展示。
3.代码编写
package day10;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
1. 组装54张扑克牌将
2. 54张牌顺序打乱
3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
4. 查看三人各自手中的牌(按照牌的大小排序)、底牌
规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3*/
public class PokerDemo {
public static void main(String[] args) {
// 1.使用双列Map(HashMap)集合,完成一个编号与字符串纸牌的对应关系(相当于一个字典)
Map<Integer, String> pokerMap = new HashMap<Integer, String>();
// 花色集合
ArrayList<String> colors = new ArrayList<String>();
// 数字集合
ArrayList<String> numbers = new ArrayList<String>();
// 2.将扑克牌中的花色和数字添加到各自的集合中
Collections.addAll(colors, "♥", "♦", "♣", "♠");
Collections.addAll(numbers, "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3");
int count = 1;
pokerMap.put(count++, "大王");
pokerMap.put(count++, "大王");
// 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。
for (String number : numbers) {
for (String color : colors) {
String card = color + number;
pokerMap.put(count++, card);
}
}
// System.out.println(pokerMap);
// 3.洗牌
Set<Integer> set = pokerMap.keySet();
ArrayList<Integer> list = new ArrayList();
list.addAll(set);
// 将list里扑克牌打乱
Collections.shuffle(list);
// 5.发牌
// 创建三个list集合(相当于三个玩家),发牌时 先将扑克牌对应的编号,放到三个list集合里
ArrayList<Integer> list1 = new ArrayList<>();
ArrayList<Integer> list2 = new ArrayList<>();
ArrayList<Integer> list3 = new ArrayList<>();
ArrayList<Integer> dipai = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
Integer num = list.get(i);
if (num >= 51) {
dipai.add(num);
} else if (num % 3 == 0) {
list1.add(num);
} else if (num % 3 == 1) {
list2.add(num);
} else {
list3.add(num);
}
}
// 6.对扑克牌编号进行排序
Collections.sort(list1);
Collections.sort(list2);
Collections.sort(list3);
//System.out.println(list1);
// 7.创建三个玩家,从map集合通过编号拿出对应的牌面,放到各自list集合里
ArrayList<String> player1 = new ArrayList<>();
ArrayList<String> player2 = new ArrayList<>();
ArrayList<String> player3 = new ArrayList<>();
ArrayList<String> dipai1 = new ArrayList<>();
for (Integer i : list1) {
player1.add(pokerMap.get(i));
}
for (Integer i : list2) {
player2.add(pokerMap.get(i));
}
for (Integer i : list3) {
player3.add(pokerMap.get(i));
}
System.out.println("玩家1" + player1);
System.out.println("玩家2" + player2);
System.out.println("玩家3" + player3);
}
}