1.编译运行
2.需求:
使用一个集合对象存储一副扑克牌, 将所由扑克牌的顺序打乱, 然后分发给用集合表示的三个玩家和底牌, 打印玩家和底牌的集合内容
3.步骤:
- 1.造扑克牌:
将花色和数字分别进行组合,生成所有的普通牌,手动添加“大王”“小王”
- 2.洗牌:
使用Collections工具类的shuffle()方法打乱牌的顺序
- 3.发牌
遍历牌堆,将每一张牌分发到三个玩家手中,留三张牌为底牌
- 4.看牌
分别打印每个玩家集合的内容
4. 代码块:
4.1 造扑克牌
分析:
1.定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小 2.定义一个单列集合,用来存储所有牌的的编号 3.将花色和牌数进行组合
- 4.1.1 定义扑克牌集合
//定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小
Map<Integer,String> pokers = new HashMap<>();
//定义一个单列集合,用来存储所有牌的的编号
List<Integer> list =new ArrayList<>();
- 4.1.2,将牌的花色和牌数进行组合存入集合
//普通牌52张
String[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//花色"♠","♣","♥","♦"
String[] colors = {"♠","♣","♥","♦"};
//用增强for循环将花色和牌数进行组合
int num = 0;
for (String number : nums) {
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++);
4.2 洗扑克牌
分析:
使用Collections工具类的shuffle()方法打乱牌堆集合的顺序
- 4.2.1 将存入扑克牌的key集合list随机打乱顺序
Collections.shuffle(list);
4.3 发扑克牌
分析:
定义4个集合,分别表示3个玩家,底牌 具体的发牌动作,将索引和3取余,决定发给谁
- 4.3.1 定义4个集合,分别表示3个玩家,底牌
//底牌
List<Integer> dipai = new ArrayList<>();
//三个玩家
List<Integer> zhaoyun = new ArrayList<>();
List<Integer> caocao = new ArrayList<>();
List<Integer> liubei = new ArrayList<>();
- 4.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){
//给第一位玩家
zhaoyun.add(pokerNum);
}else if(i%3 ==1){
//给第二位玩家
caocao.add(pokerNum);
}else if(i%3 ==2){
//给第三位玩家
liubei.add(pokerNum);
}
}
4.4 看牌
分析:
对牌的编号进行升序排列 根据编号去双列集合中查找该编号对应的具体牌
- 4.4.1写一个方法实现看牌
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();
//6.trim去除前后空格
return str.trim();
}
- 4.4.2 将每个玩家的牌输出
System.out.println("斗地主在线洗牌发牌:");
System.out.println("赵云:"+printPoker(zhaoyun,pokers));
System.out.println("曹操:"+printPoker(caocao,pokers));
System.out.println("刘备:"+printPoker(liubei,pokers));
System.out.println("底牌:"+printPoker(dipai,pokers));
5.源码
import java.util.*;
/*
案例:模拟斗地主发牌
需求:使用一个集合对象存储一副扑克牌,将所由扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,应打印玩家和底牌的集合内容
步骤:1.买一副扑克牌:将花色和数字分别进行组合,生成所有的普通牌
手动添加“大王”“小王”
2.洗牌
使用Collections工具类的shuffle()方法打乱牌的顺序
3.发牌
遍历牌堆,将每一张牌分发到三个玩家手中
留三张牌为底牌
4.看牌
分别打印每个玩家集合的内容
*/
public class Test {
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[] nums = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
String[] colors = {"♠","♣","♥","♦"};
//通过循环嵌套获取普通牌
int num = 0;
for (String number : nums) {
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,3:洗牌和发牌
// 分析:
// 1.使用Collections工具类的shuffle()方法打乱牌堆集合的顺序
// 2.分别创建三个玩家集合对象和底牌集合对象
// 3.遍历牌堆的每一张牌,分别将索引对3取模的值为0.1.2的牌放到三个玩家集合中,将最后三张 存放到底牌集合中
//洗牌
Collections.shuffle(list);
//System.out.println("洗好牌后的编号:"+list);
//发牌
//3.1定义4个集合,分别表示3个玩家,底牌
List<Integer> dipai = new ArrayList<>();
List<Integer> zhaoyun = new ArrayList<>();
List<Integer> caocao = new ArrayList<>();
List<Integer> liubei = new ArrayList<>();
//3.2具体的发牌动作,将索引和3取余,决定发给谁
for(int i= 0;i<list.size();i++){
//获取编号
Integer pokerNum = list.get(i);
if(i>=list.size()-3){
//底牌i
dipai.add(pokerNum);
}else if(i%3 ==0){
zhaoyun.add(pokerNum);
}else if(i%3 ==1){
caocao.add(pokerNum);
}else if(i%3 ==2){
liubei.add(pokerNum);
}
}
//查看具体的牌
System.out.println("-------------------------------");
System.out.println("斗地主在线洗牌发牌:");
System.out.println("赵云:"+printPoker(zhaoyun,pokers));
System.out.println("曹操:"+printPoker(caocao,pokers));
System.out.println("刘备:"+printPoker(liubei,pokers));
System.out.println("底牌:"+printPoker(dipai,pokers));
}
/*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();
}
}
6.底牌发牌思路
1.谁拿到中间的牌谁是地主 用i==27来看地主牌的走向,问题是地主会一直是第三位玩家,
2.指定一张牌,谁拿到这张牌谁就是地主 指定一张牌的编号,根据编号随机在集合中的位置,问题是有可能出现在底牌中