JAVA模拟斗地主洗牌,发牌,看牌

编程入门 行业动态 更新时间:2024-10-10 23:23:30

JAVA模拟<a href=https://www.elefans.com/category/jswz/34/1766151.html style=斗地主洗牌,发牌,看牌"/>

JAVA模拟斗地主洗牌,发牌,看牌

JAVA模拟斗地主洗牌,发牌,看牌

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);//每添加一张,编号自增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 = 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);//每添加一张,编号自增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 = 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){//底牌idipai.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.指定一张牌,谁拿到这张牌谁就是地主
指定一张牌的编号,根据编号随机在集合中的位置,问题是有可能出现在底牌中

更多推荐

JAVA模拟斗地主洗牌,发牌,看牌

本文发布于:2024-02-27 20:15:49,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1766157.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:斗地主   JAVA   看牌

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!