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

简介: JAVA模拟斗地主洗牌,发牌,看牌

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

1.编译运行

20201113201659892.gif

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.指定一张牌,谁拿到这张牌谁就是地主

指定一张牌的编号,根据编号随机在集合中的位置,问题是有可能出现在底牌中

目录
相关文章
|
Java
Java 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。
208 0
|
5月前
|
Java 索引
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
107 3
|
7月前
|
存储 Java
Java实现模拟斗地主
Java实现模拟斗地主
57 2
|
7月前
|
Java
Java_模拟斗地主
Java_模拟斗地主
56 0
|
7月前
|
存储 Java
【Java基础】Collections集合概述和使用、ArrayList集合存储学生并排序及斗地主案例
【Java基础】Collections集合概述和使用、ArrayList集合存储学生并排序及斗地主案例
66 0
|
Java
【Java】三人扑克牌随机发牌
【Java】三人扑克牌随机发牌
152 0
【java筑基】斗地主小游戏——Collections工具类排序功能应用
【java筑基】斗地主小游戏——Collections工具类排序功能应用
用Java实现简易的洗牌和发牌功能
在日常生活中,想必大家都玩过或者听过斗地主吧,斗地主大致分为三个过程:洗牌,发牌,玩家按照规则将手中的牌给打完,谁最先打完,谁就获胜。这听起来挺简单的,但是影响你胜利的因素有很多:洗牌,玩家的水平。在赌场中很多人就是在洗牌跟发牌的过程中作弊的,那么我们可不可以用代码来实现洗牌跟发牌的功能来实现相对公平呢?
|
21天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
12天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####