JAVA模拟斗地主洗牌,发牌,看牌
1.编译运行
2.需求:
使用一个集合对象存储一副扑克牌,
将所由扑克牌的顺序打乱,
然后分发给用集合表示的三个玩家和底牌,
打印玩家和底牌的集合内容
3.步骤:
- 1.造扑克牌:
将花色和数字分别进行组合,生成所有的普通牌,手动添加“大王”“小王”
- 2.洗牌:
使用Collections工具类的shuffle()方法打乱牌的顺序
- 3.发牌
遍历牌堆,将每一张牌分发到三个玩家手中,留三张牌为底牌
- 4.看牌
分别打印每个玩家集合的内容
4. 代码块:
4.1 造扑克牌
分析:
1.定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小
2.定义一个单列集合,用来存储所有牌的的编号
3.将花色和牌数进行组合
- 4.1.1 定义扑克牌集合
//定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小Map<Integer,String>pokers=newHashMap<>(); //定义一个单列集合,用来存储所有牌的的编号List<Integer>list=newArrayList<>();
- 4.1.2,将牌的花色和牌数进行组合存入集合
//普通牌52张String[] nums= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; //花色"♠","♣","♥","♦"String[] colors= {"♠","♣","♥","♦"}; //用增强for循环将花色和牌数进行组合intnum=0; for (Stringnumber : nums) { for (Stringcolor : colors) { Stringpoker=color+number; //将牌的编号和具体的牌放到双列集合中,pokers.put(num,poker); //将牌的编号放到单列集合中list.add(num); //每添加一张,编号自增1num++; } } //大小王//添加小王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=newArrayList<>(); //三个玩家List<Integer>zhaoyun=newArrayList<>(); List<Integer>caocao=newArrayList<>(); List<Integer>liubei=newArrayList<>();
- 4.3.2 具体的发牌动作,将索引和3取余,决定发给谁
for(inti=0;i<list.size();i++){ //获取编号IntegerpokerNum=list.get(i); if(i>=list.size()-3){ //底牌dipai.add(pokerNum); }elseif(i%3==0){ //给第一位玩家zhaoyun.add(pokerNum); }elseif(i%3==1){ //给第二位玩家caocao.add(pokerNum); }elseif(i%3==2){ //给第三位玩家liubei.add(pokerNum); } }
4.4 看牌
分析:
对牌的编号进行升序排列
根据编号去双列集合中查找该编号对应的具体牌
- 4.4.1写一个方法实现看牌
publicstaticStringprintPoker(List<Integer>nums,Map<Integer,String>pokers){ //1.对牌的编号进行升序排列Collections.sort(nums); //2.遍历牌的编号集合,获取每一个编号StringBuildersb=newStringBuilder(); for (Integernum : nums) { //num就是要查找具体牌的编号//3.根据编号去双列集合中查找该编号对应的具体牌Stringpoker=pokers.get(num); //4.将获取到的牌进行拼接sb.append(poker+" "); } //5.将最后的拼接的结果返回即可Stringstr=sb.toString(); //6.trim去除前后空格returnstr.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.源码
importjava.util.*; /*案例:模拟斗地主发牌需求:使用一个集合对象存储一副扑克牌,将所由扑克牌的顺序打乱,然后分发给用集合表示的三个玩家和底牌,应打印玩家和底牌的集合内容步骤:1.买一副扑克牌:将花色和数字分别进行组合,生成所有的普通牌手动添加“大王”“小王”2.洗牌使用Collections工具类的shuffle()方法打乱牌的顺序3.发牌遍历牌堆,将每一张牌分发到三个玩家手中留三张牌为底牌4.看牌分别打印每个玩家集合的内容*/publicclassTest { publicstaticvoidmain(String[] args) { //1.买牌//1.1定义一个双列集合,键:表示牌的编号,值:表示具体的牌,规则:编号越小牌越小Map<Integer,String>pokers=newHashMap<>(); //1.2定义一个单列集合,用来存储所有牌的的编号List<Integer>list=newArrayList<>(); //1.3具体的买牌动作//普通牌52张String[] nums= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"}; String[] colors= {"♠","♣","♥","♦"}; //通过循环嵌套获取普通牌intnum=0; for (Stringnumber : nums) { for (Stringcolor : colors) { Stringpoker=color+number; //将牌的编号和具体的牌放到双列集合中,pokers.put(num,poker); //将牌的编号放到单列集合中list.add(num); //每添加一张,编号自增1num++; } } //大小王//添加小王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=newArrayList<>(); List<Integer>zhaoyun=newArrayList<>(); List<Integer>caocao=newArrayList<>(); List<Integer>liubei=newArrayList<>(); //3.2具体的发牌动作,将索引和3取余,决定发给谁for(inti=0;i<list.size();i++){ //获取编号IntegerpokerNum=list.get(i); if(i>=list.size()-3){ //底牌idipai.add(pokerNum); }elseif(i%3==0){ zhaoyun.add(pokerNum); }elseif(i%3==1){ caocao.add(pokerNum); }elseif(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*/publicstaticStringprintPoker(List<Integer>nums,Map<Integer,String>pokers){ //1.对牌的编号进行升序排列Collections.sort(nums); //2.遍历牌的编号集合,获取每一个编号StringBuildersb=newStringBuilder(); for (Integernum : nums) { //num就是要查找具体牌的编号//3.根据编号去双列集合中查找该编号对应的具体牌Stringpoker=pokers.get(num); //4.将获取到的牌进行拼接sb.append(poker+" "); } //5.将最后的拼接的结果返回即可Stringstr=sb.toString(); returnstr.trim(); } }
6.底牌发牌思路
1.谁拿到中间的牌谁是地主
用i==27来看地主牌的走向,问题是地主会一直是第三位玩家,
2.指定一张牌,谁拿到这张牌谁就是地主
指定一张牌的编号,根据编号随机在集合中的位置,问题是有可能出现在底牌中