发牌洗牌的简单逻辑

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;}@Overridepublic 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.hqwc.cn/news/229121.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时尚和美容网站的技术 SEO:提示和最佳实践

如果你对美容和时尚感兴趣&#xff0c;做了一个网站&#xff0c;但不知道如何在上面做技术SEO&#xff1f;此外&#xff0c;时尚和美容网站的技术 SEO 没有任何特别的指南&#xff01; 我们听到了你的声音&#xff01;但首先&#xff0c;请记住&#xff0c;技术性SEO不是在一两…

解密Long型数据传递:Spring Boot后台如何避免精度丢失问题

前端和后端之间的数据传递至关重要。然而&#xff0c;当涉及到Long类型数据时&#xff0c;可能会出现精度丢失问题&#xff0c;这会影响数据的准确性。本文将为你介绍两种解决方案&#xff0c;帮助你确保Long类型数据在前端和后端之间的精确传递。 精度丢失测试 访问:http://l…

函数声明与函数表达式

函数声明 一个标准的函数声明&#xff0c;由关键字function 、函数名、形参和代码块组成。 有名字的函数又叫具名函数。 举个例子&#xff1a; function quack(num) { for (var i 0; i < num; i) {console.log("Quack!")} } quack(3)函数表达式 函数没有名称…

实战中使用的策略模式,使用@ConditionalOnProperty实现根据环境注册不同的bean

场景复现 举个例子&#xff0c;针对不同的设备的内存的不同加载一些资源的时候需要采取不同的策略&#xff0c;比如&#xff0c;在内存比较大的设备&#xff0c;可以一次性加载&#xff0c;繁殖需要使用懒加载&#xff0c;这个时候我们就可以采用配置文件配置中心去控制了 Cond…

数据结构与算法编程题33

统计二叉树中双分支结点(度为2的结点)个数 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode*…

【Java】使用 IDEA 快速生成 SpringBoot 模块

项目目录下新建 module 模块 在 pom.xml 更改为 spring initializr 配置之后的 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

面试题:说一下你对 OAuth2 协议原理的理解?

文章目录 OAuth2简介角色流程客服端注册Client Type四种授权模式授权码模式隐藏式密码式凭证式RefreshToken OAuth2简介 OAuth 是一个开放授权协议标准&#xff0c;允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息&#xff0c;而不需要将用户名和密码提供给第三…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

vue找依赖包的网址

https://www.npmjs.com/ 浅收藏一下

内衣洗衣机和手洗哪个干净?小型洗衣机质量排名

这两年内衣洗衣机可以称得上较火的小电器&#xff0c;小小的身躯却有大大的能力&#xff0c;一键可以同时启动洗、漂、脱三种全自动为一体化功能&#xff0c;在多功能和性能的提升上&#xff0c;还可以解放我们双手的同时将衣物给清洗干净&#xff0c;让越来越多小伙伴选择一款…

Java零基础——docker篇

1.【熟悉】docker简介 1.1 什么是docker Docker是一个开源项目&#xff0c;诞生于2013年初&#xff0c;最初是dotCloud公司内部的一个业余项目。它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会&#xff0c;遵从了Apache2.0协议&#xff0c;项目代码在GitHub上进…

大数据——一文详解数据仓库概念(数据仓库的分层概念和维度建模详解)

1、ods是什么&#xff1f; ods层最好理解&#xff0c;基本上就是数据从源表拉过来&#xff0c;进行etl&#xff0c;比如MySQL映射到Hive&#xff0c;那么到了Hive里面就是ods层。ods全称是 Operational Data Store&#xff0c;操作数据存储——“面向主题的”&#xff0c;数据…