案例:模拟斗地主发牌
需求:使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容。
步骤:
1.准备扑克牌
将花色和数字分别进行组合,生成所有的普通扑克牌,手动添加“大王”,“小王”
1.1创建数字数组
String[] nums = {“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,“2”};
1.2创建花色数组
String colors = {“黑桃”,“红桃”,“梅花”,“方片”};
1.3将每一个花色分别和数字进行拼接
color[i],concat(nums[i]);
2.洗牌
2.1使用Collections工具类的**shuffle()**方法打乱牌推集合的顺序
2.2分别创建三个玩家集合对象和底牌对象
2.3遍历牌推的每一张牌,分别将索引对3取模的值为0,1,2的牌存放到三个玩家集合中,将最后三张存放到底牌集合中
3.发牌
遍历牌群,将每一张牌分发给三个玩家集合中,留三张作为底牌
4.看牌
分别打印每个玩家集合的内容
4.1将玩家集合中的牌按自然顺序进行排列:Collections.sort(list);
4.2打印玩家集合中的牌
package Example;
import java.util.*;
/*
模拟斗地主
1.买牌
2.洗牌
3.发牌
4.看牌
*/
public class SendPokerTest {
public static void main(String[] args) {
// 1.买牌
// 1.1定义一个双列集合,键表示牌的编号,值表示具体的牌,规则:编号越小,牌越小
Map<Integer, String> pokers = new HashMap<>();
// 1.2定义一个单列集合,用来存储所有牌的编号
List<Integer> list = new ArrayList<>();
// 1.3具体的买牌动作
// 普通牌
String[] colors = {"♠","♥","♣","♦"}; //输入法输入即可,黑桃,红桃,梅花,方片
String[] numbers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
// 通过循环嵌套,来造普通牌
int num = 0; //表示牌的编号
for (String number : numbers) { //外循环,获取所有的点数
for (String color : colors) { //内循环,获取花色
String poker = color + number;
// 将牌的编号和具体的牌数放到上列集合中
pokers.put(num,poker);
// 将牌的编号放到单列集合中
list.add(num);
// 每添加一张牌,编号都要自增1
num++;
}
}
// 大小王
// 添加小王
pokers.put(num,"小王");
list.add(num++);
// 添加大王
pokers.put(num,"大王");
list.add(num);
// 打印牌
System.out.println("所有的牌:"+ pokers);
System.out.println("牌的编号:"+list);
// 2.洗牌
Collections.shuffle(list);
System.out.println("洗牌结果:"+list);
// 3.发牌
// 3.1定义四个集合,分别表示三个玩家(aa,bb,cc)和底牌(dd)
List<Integer> aa = new ArrayList<>();
List<Integer> bb = new ArrayList<>();
List<Integer> cc = new ArrayList<>();
List<Integer> dd = new ArrayList<>();
// 3.2具体的发牌动作,将索引和3取模,决定发给谁
for (int i = 0; i < list.size(); i++) {
// 获取编号
Integer pokerNum = list.get(i);
System.out.println(pokerNum);
// 如果i
if (i >= list.size() - 3) {
dd.add(pokerNum);
} else if (i % 3 == 0) {
aa.add(pokerNum);
} else if (i % 3 == 1 ) {
bb.add(pokerNum);
} else {
cc.add(pokerNum);
}
}
// 4.看牌
System.out.println("aa的牌:"+ showPoker(aa,pokers));
System.out.println("bb的牌:"+ showPoker(bb,pokers));
System.out.println("cc的牌:"+ showPoker(cc,pokers));
System.out.println("dd的牌:"+ showPoker(dd,pokers));
}
// 定义一个方法用看牌
// 方法名:showPoker
// 参数列表List(Integer),Map(Integer,String)
// 返回值就是一个String
public static String showPoker(List<Integer> nums,Map<Integer,String> pokers) {
// 1.对牌的编号进行升序排列
Collections.sort(nums);
// 2.遍历牌的编号集合,获取到每一个编号
StringBuilder sb = new StringBuilder();
for (Integer num : nums) {
// num就是要查找的具体牌的编号
// 3.根据编号去双列集合中查找编号对应的具体牌
String poker = pokers.get(num);
// 4.将获取到的牌进行拼接
sb.append(poker + " ");
}
// 5.返回最后的拼接结果
String str = sb.toString();
return str.trim();
}
}