【详解】斗地主随机发牌项目

目录

前言:

1.初始化牌

 2.洗牌

3.揭牌

总代码:

Card类:

CardGame类:

Main类:

结语:


前言:

斗地主是全国范围内的一种桌面游戏,本节我们来实现一下斗地主中的简单初始化牌、发牌和看牌功能。按照斗地主的规则,完成洗牌发牌的动作。具体规则为使用 52 张牌(不含大小王)打乱顺序,3 个玩家参与游戏,3 人交替摸牌,每人 5(可以自己修改) 张牌。

实现思路步骤:

1.初始化牌

2.洗牌

3.揭牌

4.剩余牌

效果展示:

实现如下:

1.初始化牌

牌有数字和花色,故我们要自己创建一个类来进行操作。toString方法要记得重写不然后面println不能直接输出。

public class Card{public String suit;//花色public int num;public Card(String suit,int num){this.suit = suit;this.num = num;}@Overridepublic String toString(){return suit+" "+num;}
}

用suits来存储花色。List<Card>可以看成是一个存储Card的一维数组。利用java自带的ArrayLIst的add函数实现尾插。 

public static final String[] suits = {"♥","♣","♦","♠"};//初始化牌public List<Card> buyCard(){List<Card> cardList = new ArrayList<>();for(int i = 0;i < 4;i++){for(int j = 1;j <= 13;j++){String suit = suits[i];Card card = new Card(suit,j);cardList.add(card);}}return cardList;}

 效果如下:

 2.洗牌

利用random来生成随机数,这里有个小细节i是从最后一个数来进行遍历的利用rand来生成i之前的随机数进行交换这样就能保证每个牌都有被洗到。

//洗牌public void shuffle(List<Card> cardList){Random random = new Random();for(int i = cardList.size()-1;i > 0;i--){swap(cardList,i,random.nextInt(i));}}public void swap(List<Card> cardList,int i,int j){Card temp = cardList.get(i);cardList.set(i,cardList.get(j));cardList.set(j,temp);}

效果如下:

3.揭牌

这里解释一下List<List<Card>>,可以看成一个二维数组如图,List<Card>是一个泛型,最外面的List里面存储了一个List<Card>。

//揭牌public List<List<Card>> getCard(List<Card> cardList){List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<Card> hand3 = new ArrayList<>();List<List<Card>> hand = new ArrayList<>();hand.add(hand1);hand.add(hand2);hand.add(hand3);for(int i = 0;i < 5;i++){for(int j = 0;j < 3;j++){Card card = cardList.remove(0);hand.get(j).add(card);}}return hand;}

总代码:

Card类:

public class Card{public String suit;//花色public int num;public Card(String suit,int num){this.suit = suit;this.num = num;}@Overridepublic String toString(){return suit+" "+num;}
}

CardGame类:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;
public class CardGame{public static final String[] suits = {"♥","♣","♦","♠"};//初始化牌public List<Card> buyCard(){List<Card> cardList = new ArrayList<>();for(int i = 0;i < 4;i++){for(int j = 1;j <= 13;j++){String suit = suits[i];Card card = new Card(suit,j);cardList.add(card);}}return cardList;}//洗牌public void shuffle(List<Card> cardList){Random random = new Random();for(int i = cardList.size()-1;i > 0;i--){swap(cardList,i,random.nextInt(i));}}public void swap(List<Card> cardList,int i,int j){Card temp = cardList.get(i);cardList.set(i,cardList.get(j));cardList.set(j,temp);}//揭牌public List<List<Card>> getCard(List<Card> cardList){List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<Card> hand3 = new ArrayList<>();List<List<Card>> hand = new ArrayList<>();hand.add(hand1);hand.add(hand2);hand.add(hand3);for(int i = 0;i < 5;i++){for(int j = 0;j < 3;j++){Card card = cardList.remove(0);hand.get(j).add(card);}}return hand;}
}

Main类:

import java.util.List;
public class Main {public static void main(String[] args){CardGame cardgame = new CardGame();List<Card> ret = cardgame.buyCard();System.out.println("初始化牌");System.out.println(ret.subList(0,13));System.out.println(ret.subList(13,26));System.out.println(ret.subList(26,39));System.out.println(ret.subList(39,52));System.out.println("洗牌");cardgame.shuffle(ret);System.out.println(ret.subList(0,13));System.out.println(ret.subList(13,26));System.out.println(ret.subList(26,39));System.out.println(ret.subList(39,52));System.out.println("揭牌");List<List<Card>> hand = cardgame.getCard(ret);for(int i = 0;i < 3;i++){System.out.println("第 "+(i+1)+"个人的牌:"+hand.get(i));}System.out.println("剩下的牌:");System.out.println(ret);}
}

结语:

其实写博客不仅仅是为了教大家,同时这也有利于我巩固自己的知识点,和一个学习的总结,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进,如果大家有所收获的话还请不要吝啬你们的点赞收藏和关注,这可以激励我写出更加优秀的文章。

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

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

相关文章

uniapp微信小程序开发踩坑日记:uni.request回调函数地狱问题

使用await和async无法解决uniapp中的回调函数地狱问题&#xff0c;因为uni.request并不返回一个 Promise。通常情况下&#xff0c;我们期望await能够等待一个 Promise 或者其它类似 Promise 的对象&#xff0c;然后继续执行下面的代码&#xff0c;但uni.request的 success 回调…

ComfyUI 安装和入门

目录 AnimateDiff for ComfyUI ComfyUI 入门教程 什么是ComfyUI&#xff1f; windows安装教程&#xff1a; 安装&#xff1a;stable-diffusion-webui 组件技巧学习 AnimateDiff for ComfyUI GitHub - ArtVentureX/comfyui-animatediff: AnimateDiff for ComfyUI 生成动画…

Spring Boot 笔记 006 创建接口_注册

1.1 由于返回数据都是以下这种格式&#xff0c;那么久再编写一个result实体类 报错了&#xff0c;原因是没有构造方法 可以使用lombok的注解自动生成&#xff0c;添加无参的构造器和全参的构造器 package com.geji.pojo;import lombok.AllArgsConstructor; import lombok.NoArg…

Transformer实战-系列教程16:DETR 源码解读3(DETR类)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 DETR 算法解读 DETR 源码解读1&#xff08;项目配置/CocoDetection类&#xff09; …

【MySQL】操作库 —— 库的操作 -- 详解

一、增删数据库 1、创建数据库 create database db_name; 本质就是在 /var/lib/mysql 创建一个目录。 说明&#xff1a; 大写的表示关键字。[ ] 是可选项。CHARACTER SET&#xff1a;指定数据库采用的字符集。COLLATE&#xff1a;指定数据库字符集的校验规则。 2、数据库删除…

Linux第51步_移植ST公司的linux内核第3步_添加修改设备树

1、设备树文件的路径 1)、创建linux中的设备树头文件 在“my_linux/linux-5.4.31/arch/arm/boot/dts/”目录中&#xff0c;以“stm32mp15xx-edx.dtsi”为蓝本&#xff0c;复制一份&#xff0c;并命名为 “stm32mp157d-atk.dtsi”&#xff0c;这就是我们开发板的设备树头文件。…

【stomp实战】Springboot+Stomp协议实现聊天功能

本示例实现一个功能&#xff0c;前端通过websocket发送消息给后端服务&#xff0c;后端服务接收到该消息时&#xff0c;原样将消息返回给前端。前端技术栈htmlstomp.js&#xff0c;后端SpringBoot 前端代码 关于stomp客户端的开发&#xff0c;如果不清楚的&#xff0c;可以看…

机器学习10-特征缩放

特征缩放的目的是确保不同特征的数值范围相近&#xff0c;使得模型在训练过程中更加稳定&#xff0c;加速模型收敛&#xff0c;提高模型性能。具体而言&#xff0c;零均值和单位方差的目标有以下几点好处&#xff1a; 1. 均值为零&#xff08;Zero Mean&#xff09;&#xff1a…

15 ABC基于状态机的按键消抖原理与状态转移图

1. 基于状态机的按键消抖 1.1 什么是按键&#xff1f; 从按键结构图10-1可知&#xff0c;按键按下时&#xff0c;接点&#xff08;端子&#xff09;与导线接通&#xff0c;松开时&#xff0c;由于弹簧的反作用力&#xff0c;接点&#xff08;端子&#xff09;与导线断开。 从…

【开源】SpringBoot框架开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

java 执行方式和类加载过程

java默认属于混合执行&#xff1a; 编译和解释并存 java先进行解释执行&#xff0c;遇到多次重复的代码会把它编程成可执行文件&#xff0c;方便下次直接执行。 可以通过VM参数来修改执行方式。 类加载过程

Nacos、Eureka、Zookeeper、Consul对比

开发中&#xff0c;经常需要对微服务进行管理&#xff0c;所以需要引入一些服务治理的中间件&#xff0c;用于注册、发现服务&#xff0c;常见的服务治理中间件为 服务治理中间件 【1】Nacos 【2】Eureka 【3】Zookeeper 【4】Consul&#xff08;Consul 所在的 HashiCorp 公司…

从完成[flutter竖向显示文字]到对实现方式[Rich Text和Text Span]的一些整理

前言 完成的需求是竖向显示文字&#xff0c;而已有的RotatedBox虽然可以让文字内部控件进行指定角度的旋转&#xff0c;但是不能保持文字仍正常显示&#xff08;它会因为旋转横着&#xff09;&#xff0c;遂尝试Rich Text和Text Span的方式&#xff0c;这两个我曾在android有略…

红队笔记Day2 -->上线不出网机器

今天就来讲一下在企业攻防中如何上线不出网的机器&#xff01;&#xff01; 1.基本网络拓扑 基本的网络拓扑就是这样 以下是对应得的P信息&#xff0c;其中的52网段充当一个内网的网段&#xff0c;而111充当公网网段 先ping一下&#xff0c;确保外网ping不通内网&#xff0c;内…

文档类图像的智能识别,百度、阿里、华为腾讯开放接口

文档类图像的智能识别是指利用人工智能技术对文档图像进行自动识别和信息提取。在我国&#xff0c;百度、阿里、华为和腾讯等科技巨头都提供了相应的开放接口&#xff0c;方便开发者集成和使用文档类图像识别功能。以下是这些公司提供的相关开放接口&#xff1a; 1. 百…

微信小程序(四十一)wechat-http的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.模块下载 2.模块的使用 在终端输入npm install wechat-http 没有安装成功vue的先看之前的一篇 微信小程序&#xff08;二十&#xff09;Vant组件库的配置- 如果按以上的成功配置出现如下报错先输入以下语句 …

leetcode 24

24. 两两链表交换链表中的节点 已经给出了链表节点结构类&#xff1a; public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) { this.val val; }ListNode(int val, ListNode next) { this.val val; this.next next; }} 简而言之&#xff0c;我们…

DS:单链表实现队列

创作不易&#xff0c;友友们来个三连支持吧&#xff01; 一、队列的概念 队列&#xff1a;是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out)的特点。 入队列&#xff1a;进行插入操作…

leetcode题目记录

文章目录 单调栈[127. 单词接龙](https://leetcode.cn/problems/word-ladder/)[139. 单词拆分](https://leetcode.cn/problems/word-break/)[15. 三数之和](https://leetcode.cn/problems/3sum/)[140. 单词拆分 II](https://leetcode.cn/problems/word-break-ii/)[113. 路径总和…