大家好,我是垃圾佬,一个正在学Java的 “无业游民 ”,最近复习到了Map 集合,我觉得斗地主发牌这个案例来练习Map集合还是非常好的,话不多说先上图解
1、斗地主发牌 图解
![](https://img-blog.csdnimg.cn/795107d7fe954922bcb99ced3ec04add.png)
图解:
1、首先定义扑克牌映射表,按编号的顺序从小到大依次是牌面的从大到小(即数字越小,扑克牌越大,后续进行排序会用到)Map集合中的Key作为每张牌面的编号,Value作为牌面(如:♥A )
2、定义List集合,获取Map集合中所有的Key,因为每个Key就是对应的一张牌面,所以我们要对Key进行洗编号(洗编号就是洗牌)
3、定义三个玩家集合,一个底牌集合,给玩家进行发牌(发牌就是发编号)发完牌之后,对每个玩家收到的牌进行从小到大排序
4、根据玩家收到的编号进行转换,将编号转换为牌面进行展示(也就是看牌)
2、实现代码
package com.com.demo;
import java.util.*;
public class Game {
public static void main(String[] args) {
//1.定义牌面
String[] pokerColor = "♥-♠-♦-♣".split("-");
String[] pokerNum = "2-A-K-Q-J-10-9-8-7-6-5-4-3".split("-");
//2.定义牌面映射表
Map<Integer, String> pokerMap = new HashMap<>();
int index = 0;
pokerMap.put(index++, "大王");
pokerMap.put(index++, "小王");
for (String n : pokerNum) {
for (String c : pokerColor) {
pokerMap.put(index++, c + n);
}
}
// System.out.println(pokerMap);
//3.获取所有牌面编号
List<Integer> pokerNumList = new ArrayList<>(pokerMap.keySet());
//4.洗牌(洗编号)
Collections.shuffle(pokerNumList);
//5.发牌(发编号)
//定义三个玩家
List<Integer> userPokerNumList1 = new ArrayList<>();
List<Integer> userPokerNumList2 = new ArrayList<>();
List<Integer> userPokerNumList3 = new ArrayList<>();
List<Integer> dipaiNumList = new ArrayList<>();
for (int i = 0; i < pokerNumList.size(); i++) {
Integer pNum = pokerNumList.get(i);
if (i >= pokerNumList.size() - 3) {//底牌三张
dipaiNumList.add(pNum);
} else if (i % 3 == 0) {//如果 i 余 3 == 0 将牌发给第一个玩家
userPokerNumList1.add(pNum);
} else if (i % 3 == 1) {//如果 i 余 3 == 1 将牌发给第二个玩家
userPokerNumList2.add(pNum);
} else {//如果 i 余 3 == 2 将牌发给第三个玩家
userPokerNumList3.add(pNum);
}
}
//6.对玩家的牌面进行排序(底牌不用排序)
Collections.sort(userPokerNumList1);
Collections.sort(userPokerNumList2);
Collections.sort(userPokerNumList3);
//7.将编号转换为牌面展示
String user1 = convertNumToPoker(userPokerNumList1, pokerMap);
String user2 = convertNumToPoker(userPokerNumList2, pokerMap);
String user3 = convertNumToPoker(userPokerNumList3, pokerMap);
String dipai = convertNumToPoker(dipaiNumList, pokerMap);
System.out.println("用户1:" + user1);
System.out.println("用户2:" + user2);
System.out.println("用户3:" + user3);
System.out.println("底 牌:" + dipai);
}
//将编号转换为牌面
public static String convertNumToPoker(List<Integer> pokerNumList, Map<Integer, String> pokerMap) {
StringBuilder bld = new StringBuilder("[");
for (int i = 0; i < pokerNumList.size(); i++) {
bld.append(pokerMap.get(pokerNumList.get(i)));
if (i < pokerNumList.size() - 1) {
bld.append(",");
} else {
bld.append("]");
}
}
return bld.toString();
}
}
3、展示
![](https://img-blog.csdnimg.cn/06cbd39c52644d1187286de531a20849.png)