六、终极:用集合模拟斗地主
6.1、模拟斗地主发牌之买牌
6.1.1、案例:模拟斗地主发牌
- 需求:使用一个集合对象存储一副扑克牌,将所有扑克牌的顺序打乱然后分发给用集合表示的三个玩家和底牌,并打印玩家和底牌的集合内容
- 步骤:
1.买一副扑克牌将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”、“小王”
2.洗牌使用Collections工具类的shuffle()方法打乱牌的顺序
3.发牌遍历牌堆,将每一张牌分发到三个玩家集合中留三张作为底牌
4.看牌分别打印每个玩家集合的内容
步骤一:买一副扑克牌
- 分析:
1.创建数字数组:String[] nums =("3","4","5","6","7","8","9","10","J","Q","K","A","2");
2.创建花色数组:String[] colors = ["方片","梅花","红桃","黑桃");
3.将每一个花色分别和数字进行拼接colors[i].concat(nums[j]);
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Text {
public static void main(String[] args) {
//1、买牌
//1.1、定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小,牌越小
Map<Integer,String> pokers = new HashMap<>();
//1.2、定义一个单例集合,用来存储所有的的牌号
List<Integer> list = new ArrayList<>();
//1.3、具体买牌动作
//普通牌,52
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);
步骤二、三:洗牌和发牌
- 分析:
1.使用Collections工具类的shuffle()方法打乱牌堆集合的顺序
2.分别创建三个玩家集合对象和底牌集合对象
3.遍历牌堆的每一张牌,分别将索引对3取模的值为0,1,2的牌存放到三个玩家集合中,将最后三张存放到底牌集合中
//2.洗牌
Collections.shuffle(list);
System.out.println("洗好牌后,编号为:"+list);
//3、发牌
//3.1、定义四个集合,分别表示3个玩家,底牌.
List<Integer> zhangsan = new ArrayList<>();
List<Integer> lisi = new ArrayList<>();
List<Integer> wangwu = new ArrayList<>();
List<Integer> dipai = new ArrayList<>();
//3.2、具体的发牌动作,将索引和3取模,决定发给谁
for (int i = 0; i < list.size(); i++) {
//获取编号
Integer pokerNum = list.get(i);
if(i >= list.size() - 3){
//底牌
dipai.add(pokerNum);
}else if(i % 3 == 0){
zhangsan.add(pokerNum);
}else if(i % 3 == 1){
lisi.add(pokerNum);
}else if(i % 3 == 2){
wangwu.add(pokerNum);
}
}
//3.3、查看具体的牌
System.out.println("张三:"+printPoker(zhangsan, pokers));
System.out.println("李四:"+printPoker(lisi, pokers));
System.out.println("王五:"+printPoker(wangwu, pokers));
System.out.println("底牌:"+printPoker(dipai, pokers));
}
步骤四、看牌
- 分析:
1.将玩家集合中的牌按自然顺序进行排序Collections.sort(List);
2.打印玩家集合中的牌
3.重复上面的操作打印所有玩家的牌和底牌
/* 4.定义一个方法,用来看牌
方法名:printPoker
参数列表:List<Integer>,Map<Integer,String>
返回值:String
*/
public static String printPoker(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();
}
}