发牌洗牌的简单逻辑

1. 需求分析

1.1 要求实现:

        我们能使用一副牌,基本的实现多人炸金花小游戏。

1.2 实现分析:

        1、有一副牌:

        首先自定义card类,来定义每一张牌;(牌上由花色和数字(1~13))

        其次生成一副牌(实例化52张牌,然后将这些牌都放在一个盒子中(盒子的数据存储结构是顺序表))

        2、洗牌:

        对于上一个步骤产生的52张牌应该是有序的,我们应该打乱顺序:

        采用交换方法来洗牌,即:

        令i=51,随机生成一个1~50的序号,让其和i进行交换;

        然后令i=50,随机生成一个1~49的序号,让其和i进行交换;

        ……

        直到i=1,停止交换,此刻就可以得到一个无序的牌堆;

        3、抓牌

        1)怎么抓牌和抓的牌存放问题?

        创建多个顺序表,每个顺序表来表示存放个人的牌,将多人的逻辑关系做成二维数组,每个人轮流抓第一张,其次第二轮各自抓第二张;

                                ​​​​​​​        

        注意:当第一个人抓到索引为1的牌后,此刻的牌堆其余的51张牌的索引都会往前移一个单位,对于第一轮第二个人抓牌时,此时每个索引对应的每张牌和之前不一样------>所以使用arraylist的删除操作模型来解决这一问题。

2、代码展现及分析

        面向对象思想解决问题主要分为这3步:

  • 找出其中的所有的对象(card类)
  • 实现所有的对象
  • 完成对象之间的交互(洗牌,展示牌,抓牌)

         如图所示为项目架构:

2.1 card类

        自定义扑克类,描述扑克牌的属性为花色(type)和数字(number),再重写 toString方法(使牌的输出简单明了)

public class Card {
    private String type;
    private int number;

    public Card(String type, int number) {
        this.type = type;
        this.number = number;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    @Override
    public String toString() {
        return
                "["+type + ":"+number+"]" ;
    }
}

2.2 CardOperation类

        1、首先生成一副牌

public class CardOperation {
    private final String[] types = {"♥","♠","♦","♣"};
        //首先生成一副牌
        //之前是每一张牌构造,现在是创建一盒牌,存放在cardList里面
        //且通过这个方法之后,返回一盒牌
    public List<Card> makeCards(){
        List<Card> cardList = new ArrayList<>();
        for (int i = 1; i <= 13; i++) {
            for (int j = 0; j <4 ; j++) {
                Card card = new Card(types[j],i);//详细的实例化每一张牌
                cardList.add(card);//将生成的牌放入到牌盒子里面
            }
        }
        return cardList;//刚放到盒子里的牌是有序的
    }
}

运行测试代码及结果:

public class Test {
    public static void main(String[] args) {
        CardOperation cardOperation = new CardOperation();
        List<Card> cardList = cardOperation.makeCards();
        System.out.println("我说:要有一副牌");
        System.out.println(cardList);
    }

}

        2、对生成的有序牌进行洗牌----打乱顺序

 public void showerCards(List<Card> cardList){
        Random random = new Random();
        for (int i = cardList.size()-1; i > 0; i--) {
            int index = random.nextInt(i);
            //index  i 交换
            swap(cardList,i,index);
        }
    }

    private void swap(List<Card> cardList,int a,int b){
        Card tmp = cardList.get(a);
        cardList.set(a,cardList.get(b));
        cardList.set(b,tmp);//把b下标的牌放到a下标
    }

        运行测试代码及结果: 

 3、抓牌

public void getCard(List<Card> cardList) {
        //从牌盒子里抓牌
        //将三个人关系做成二维数组
       List<Card> people1 = new ArrayList<>();
       List<Card> people2 = new ArrayList<>();
       List<Card> people3 = new ArrayList<>();
       List<Card> people4 = new ArrayList<>();

       List<List<Card>> peoples = new ArrayList<>();
       peoples.add(people1);
       peoples.add(people2);
       peoples.add(people3);
       peoples.add(people4);

        for (int i = 0; i <= 5; i++) {
           // i代表第几次抓牌
            for (int j = 0; j < 4; j++) {
                //j代表人
                Card card = cardList.remove(0);
                peoples.get(j).add(card);
            }
        }

        System.out.println("第1个揭牌如下:");
        System.out.println(people1);
        System.out.println("第2个揭牌如下:");
        System.out.println(people2);
        System.out.println("第3个揭牌如下:");
        System.out.println(people3);
        System.out.println("第4个揭牌如下:");
        System.out.println(people4);

        System.out.println("剩下的牌:");
        System.out.println(cardList);

        总运行代码及结果: 

 public static void main(String[] args) {
        CardOperation cardOperation = new CardOperation();
        List<Card> cardList = cardOperation.makeCards();
        System.out.println("我说:要有一副牌");
        System.out.println(cardList);

        System.out.println("我说,要洗牌");
        cardOperation.showerCards(cardList);
        System.out.println(cardList);
        System.out.println("我说,亮牌");
        cardOperation.getCard(cardList);
        System.out.println(cardList);
    }

 

ps:本次内容就到这里了,喜欢的话,还请大家一键三连!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/199332.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue框架学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…

物理层之码分复用(内含相关例题)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

LeetCode [中等]3. 无重复字符的最长子串

3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 1. 滑动窗口&#xff08;Sliding Window&#xff09;&#xff1a; 滑动窗口是一种用于处理数组或列表的子数组或子序列的问题…

properties转yml

目前搜索到的大部分代码都存在以下问题&#xff1a; 复杂结构解析丢失解析后顺序错乱 所以自己写了一个&#xff0c;经过不充分测试&#xff0c;基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外&#xff0c;还可以生成代码、sql转json等&#xff0c;可…

sqli-labs(6)

27. 过滤了union和select 使用双写绕过 有报错信息使用报错注入 1and(extractvalue(1,concat(0x5c,database())))and11 1and(updatexml(1,concat(0x7e,database(),0x7e),1))and11 1and(extractvalue(1,concat(0x5c,(selseselectlectect(group_concat(table_name))from(inform…

JVM 类加载

① 类加载过程 从上面的图片我们可以看出整个 JVM 执行的流程中&#xff0c;和程序员关系最密切的就是类加载的过程了&#xff0c;所以 接下来我们来看下类加载的执行流程。 对于一个类来说&#xff0c;它的生命周期是这样的&#xff1a; 其中前 5 步是固定的顺序并且也是类加载…

三十、elasticsearch集群

目录 一、集群的概念 1、节点 2、索引 3、分片和副本 二、集群的架构 三、集群的部署方式 1、单主节点 2、多主节点 3、安全集群 四、搭建ES集群 1、elasticsearch中集群节点有不同的职责划分 2、elasticsearch中的每个节点角色都有自己不同的职责&#xff0c;因此…

DockerCompose修改某个服务的配置(添加或编辑端口号映射)后如何重启单个服务使其生效

场景 docker-compose入门以及部署SpringBootVueRedisMysql(前后端分离项目)以若依前后端分离版为例&#xff1a; docker-compose入门以及部署SpringBootVueRedisMysql(前后端分离项目)以若依前后端分离版为例_docker-compose部署java mysql redis-CSDN博客 上面讲了docker c…

水库大坝安全在线监测系统守护水利工程的坚实屏障

随着科技的发展&#xff0c;水库大坝的安全监测已经进入了一个全新的时代。过去&#xff0c;我们无法实时监测大坝的安全状况&#xff0c;只能在灾难发生后进行补救&#xff0c;现在&#xff0c;通过WX-DB1水库大坝安全在线监测系统&#xff0c;我们能够在第一时间掌握大坝的运…

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…

事件代理?

1.什么是事件代理&#xff1f; 事件代理也叫事件委托&#xff0c;只指定一个事件处理程序&#xff0c;就可以管理某一类型得事件。 可以简单理解为&#xff0c;事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是&#xff1a;减少事件得执行&#xff0c;减少浏…

【技术干货】宇视IPC音频问题解决步骤

近期技术人员从宇视官网下载sdk进行二次开发时&#xff0c;在启动实时直播&#xff0c;并通过回调函数拿到流数据&#xff0c;发现没有音频流数据。 通过下面的数据发现&#xff0c;codeType此字段一直是28&#xff0c;代表的是H.264数据&#xff0c;但未没发现有音频的数据包…

2. 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

常见气体爆炸下限

国标中关于常见气体爆炸下限说明&#xff0c;特此记录 特此记录 anlog 2023年11月29日

LeetCode Hot100 739.每日温度

题目&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 方法&…

AWS连甩3项Serverless创新,高效创建和操作缓存,用AI优化资源配置性价比

云创科技11月28日拉斯维加斯报道&#xff0c;在一年一度的AWS re:Invent首日&#xff0c;AWS实用计算高级副总裁Peter DeSantis延续Monday Night Live的传统&#xff0c;发表主题演讲并分享了AWS数据库和分析产品组合中的3项Serverless创新&#xff0c;以帮助客户在任何规模下分…

Java——》线性数据结构

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Linux系统编程 day06 进程间通信

进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下&#xff0c;进程地址空间是相互独立的&#xff0c;每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容&#xff0c;要进行数据交换必…

elFinder ZIP 参数注入导致命令注入 (CVE-2021-32682)

漏洞描述 elFinder 是一个用于 Web 的开源文件管理器&#xff0c;使用 jQuery UI 用 JavaScript 编写。 在 elFinder 2.1.48 及更早版本中发现一个参数注入漏洞。此漏洞可能允许攻击者在托管 elFinder PHP 连接器的服务器上执行任意命令&#xff0c;即使配置最少也是如此。这…

SpringBoot : ch11 整合RabbitMQ

前言 在当今的互联网时代&#xff0c;消息队列成为了构建高可靠、高性能系统的重要组件之一。RabbitMQ作为一个可靠、灵活的消息中间件&#xff0c;被广泛应用于各种分布式系统中。 本篇博客将介绍如何使用Spring Boot整合RabbitMQ&#xff0c;实现消息的发送和接收。通过这种…
最新文章