当前位置: 首页 > news >正文

JAVA斗地主逻辑-控制台版

未排序版:


准备牌->洗牌 -> 发牌 -> 看牌:

App程序入口:

package doudihzu01;public class App {public static void main(String[] args) {/*作为斗地主程序入口这里不写代码逻辑*///无参创建对象,作为程序启动new PokerGame();}
}

代码逻辑:

package doudihzu01;
import java.util.ArrayList;
import java.util.Collections;
public class PokerGame {//因为是用无参创建对象开始程序,所以代码逻辑要写在无参构造内//静态代码块内使用了集合,静态内只能使用静态,所以static修饰//放在成员位置是为了其他位置好调用static ArrayList<String> list = new ArrayList<>();//牌盒//静态代码块--随着类的加载而加载static {/*1.准备牌*///目的:我们要把花色和牌号拼接起来String[] color = {"♣", "♠", "♦", "♥"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//定义一个集合用来存放拼接好的牌//增强for遍历拼接for (String s : color) {for (String string : number) {list.add(s + string);}}list.add("大王");list.add("小王");}//无参构造public PokerGame() {/*2.洗牌*/Collections.shuffle(list);/*3.发牌*///用四个集合来存牌:底牌、玩家1、玩家2、玩家3ArrayList<String> lord = new ArrayList<>();ArrayList<String> player1 = new ArrayList<>();ArrayList<String> player2 = new ArrayList<>();ArrayList<String> player3 = new ArrayList<>();//遍历打乱好的牌,发牌规则:前三张为底牌,后面轮流发牌//因为需要挨个发牌,所以用带索引的遍历方式for (int i = 0; i < list.size(); i++) {//如果是前三张牌,就做为底牌,添加到集合中if (i <= 2) {lord.add(list.get(i));continue;//直接下一循环,不要再走下面判断了,提升效率}if (i % 3 == 0) {player1.add(list.get(i));} else if (i % 3 == 1) {player2.add(list.get(i));} else {player3.add(list.get(i));}}/*4.看牌*///抽取成一个方法lookPoker("底牌", lord);lookPoker("玩家一", player1);lookPoker("玩家二", player2);lookPoker("玩家三", player3);}public static void lookPoker(String name, ArrayList<String> player) {System.out.print(name+":");for (String s : player) {System.out.print(s + "  ");}System.out.println();}}

底牌:♠Q ♦8 ♣2
玩家一:♦5 ♠A ♦4 ♠5 ♣J 大王 ♠10 ♣10 ♦3 ♦K ♣Q ♠K ♥A ♥7 ♣4 ♠2 ♥K
玩家二:♥5 ♠7 ♦Q ♥2 ♣6 ♣A 小王 ♦7 ♣8 ♠4 ♣K ♥10 ♣9 ♣3 ♦6 ♠6 ♣5
玩家三:♣7 ♥3 ♥8 ♥4 ♠J ♦A ♥6 ♠9 ♠8 ♦9 ♦10 ♦J ♥Q ♠3 ♦2 ♥J ♥9

排序版


准备牌->洗牌 -> 发牌 (同时拍好了序)->->看牌
程序入口:

package doudizhu02;
public class App {public static void main(String[] args) {/*作为斗地主程序入口这里不写代码逻辑*///无参创建对象,作为程序启动new PokerGame();}
}

逻辑实现:

package doudizhu02;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;public class PokerGame {//Map用来放牌号和序号的对应关系,强调的是对应关系,而不是排序,后面用序号获取牌的时候有用static HashMap<Integer,String>hm=new HashMap<>();//ArrayList用来放序号,到时候发牌就拿单列集合发序号就可以了,看牌的时候拿Map获取对应的牌号即可static ArrayList<Integer>list=new ArrayList<>();static {//准备牌:花色,牌号,目的拼接  花色与牌String[] color = {"♦", "♣", "♥", "♠"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//序号从1开始放int serialNumber=1;for (String n : number) {//外循环是牌号,内循环是花色,可以保证小的在前,大的在后:效果是这样♦3 ♣3 ♥3 ♠3 ♦4 ♣4 ♥4 ♠4 ♦5 ♣5 ♥5 ♠5 ♦6 ♣6 ♥6 ♠6 ♦7 ♣7 ♥7 ♠7 ♦8 ♣8 ♥8 ♠8 ♦9 ♣9 ♥9 ♠9 ♦10 ♣10 ♥10 ♠10 ♦J ♣J ♥J ♠J ♦Q ♣Q ♥Q ♠Q ♦K ♣K ♥K ♠K ♦A ♣A ♥A ♠A ♦2 ♣2 ♥2 ♠2//如果外循环是花色,内循环是牌号,效果是这样:明显不符合要求♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K ♦A ♦2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K ♣A ♣2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K ♥A ♥2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♠A ♠2for (String c : color) {hm.put(serialNumber,c+n);//键是序号,值是准备好的牌list.add(serialNumber);//序号放入单列集合serialNumber++;//序号自增}}hm.put(serialNumber,"小王");//键是序号,值是准备好的牌list.add(serialNumber);//序号放入单列集合serialNumber++;//序号++hm.put(serialNumber,"大王");//键是序号,值是准备好的牌list.add(serialNumber);//序号放入单列集合}public PokerGame() {/*洗牌---洗单列集合内的序号即可,因为到时候发牌就是拿单列集合发序号*/Collections.shuffle(list);/*发牌:*///定义四个单列集合用来存放 发到的序号,又因为TreeSet对于Integer具有*默认排序*的特点TreeSet<Integer>lord=new TreeSet<>();//地主牌TreeSet<Integer>player1=new TreeSet<>();//玩家一TreeSet<Integer>player2=new TreeSet<>();//玩家二TreeSet<Integer>player3=new TreeSet<>();//玩家三//遍历list序号集合for (int i = 0; i < list.size(); i++) {//下面就是发牌规则// list.get(i):元素,即牌的序号if (i<=2){lord.add(list.get(i));continue;//当i<=2时只要发地主拍即可,下面不用再判断了,提升效率}if (i%3==0){player1.add(list.get(i));} else if (i%3==1) {player2.add(list.get(i));}else {player3.add(list.get(i));}}/*看牌*///就是拿着Map集合将单列集合内的序号获取对应的牌号即可----抽取成一个方法lookPoker("底牌", lord);lookPoker("玩家1", player1);lookPoker("玩家2", player2);lookPoker("玩家3", player3);}public static void lookPoker(String name,TreeSet<Integer>ts){System.out.print(name+": ");//遍历单列集合for (Integer i : ts) {//利用Map集合将单列集合内的序号获取到对应的牌号System.out.print(hm.get(i)+" ");}System.out.println();//每获取完一个集合的牌后换行}
}

底牌: ♥5 ♥6 ♥Q
玩家1: ♣3 ♥3 ♣4 ♣5 ♠6 ♥7 ♥8 ♥9 ♥10 ♦J ♥J ♠Q ♦K ♣A ♦2 小王 大王
玩家2: ♥4 ♠5 ♦6 ♣6 ♦7 ♣7 ♦8 ♠8 ♣9 ♠9 ♣10 ♣J ♠J ♦Q ♣Q ♥K ♣2
玩家3: ♦3 ♠3 ♦4 ♠4 ♦5 ♠7 ♣8 ♦9 ♦10 ♠10 ♣K ♠K ♦A ♥A ♠A ♥2 ♠2

相关文章:

JAVA斗地主逻辑-控制台版

未排序版&#xff1a; 准备牌->洗牌 -> 发牌 -> 看牌: App程序入口&#xff1a; package doudihzu01;public class App {public static void main(String[] args) {/*作为斗地主程序入口这里不写代码逻辑*///无参创建对象&#xff0c;作为程序启动new PokerGame();…...

Harmony的自定义组件和Page的数据同步

在开发过程中会经常使用自定义组件,就会遇到一个问题,在页面中引入组件后,如何把改变的值传递到自定义组件中呢,这就用到了装饰器,在这是单向传递的,用的装饰器是@State和@Prop @State在page页面中监听数据的变化 @Prop在自定义组件中监听page页面传递过来的变化值,并赋…...

【Vue3+Vite】路由机制router 快速学习 第四期

文章目录 路由简介路由是什么路由的作用 一、路由入门案例1. 创建项目 导入路由依赖2. 准备页面和组件3. 准备路由配置4. main.js引入router配置 二、路由重定向三、编程式路由(useRouter)四、路由传参(useRoute)五、路由守卫总结 路由简介 路由是什么 路由就是根据不同的 URL…...

python脚本实现浏览器驱动chromedriver的版本自动升级

chromedriver的版本号与chrome浏览器版本不匹配时在运行程序时就会报错 用下面的脚本可以自动安装chromedriver的最新版本到指定路径 from webdriver_manager.utils import get_browser_version_from_os from webdriver_manager.chrome import ChromeDriverManager import re…...

npm使用国内淘宝镜像

一、命令配置 1、设置淘宝镜像源 npm config set registry https://registry.npmmirror.com2、查看镜像使用状态 npm config get registry如果返回https://registry.npmmirror.com/,说明配置的是淘宝镜像。 如果返回https://registry.npmjs.org/,说明配置的是官网镜像。 二…...

# Redis 分布式锁如何自动续期

Redis 分布式锁如何自动续期 何为分布式 分布式&#xff0c;从狭义上理解&#xff0c;也与集群差不多&#xff0c;但是它的组织比较松散&#xff0c;不像集群&#xff0c;有一定组织性&#xff0c;一台服务器宕了&#xff0c;其他的服务器可以顶上来。分布式的每一个节点&…...

数据结构 归并排序详解

1.基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序…...

服务器C盘突然满了,是什么问题

随着时代的发展、互联网的普及&#xff0c;加上近几年云计算服务的诞生以及大规模普及&#xff0c;对于服务器的使用目前是非常普遍的&#xff0c;用户运维的主要对象一般也主要是服务器方面。在日常使用服务器的过程中&#xff0c;我们也会遇到各式各样的问题。最近就有遇到用…...

【深度学习】ND4J-科学计算库

目录 简介 基础用法 基础信息 数组创建 打印数组 变更维度&堆叠 加减乘除 累加/最大/最小 转换操作 矩陈乘法 索引/迭代 深拷贝/引用传递/视图 引用传递 视图 深拷贝 其它 简介 ND4J主要是JVM的科学计算库&#xff0c;内置了很多计算方法&#xff0c;目的…...

2024-01-29 ubuntu 用脚本设置安装交叉编译工具链路径方法,设置PATH环境变量

一、设置PATH环境变量的方法,建议用~/.bash_profile的方法&#xff0c;不然在ssh登录的时候可能没有设置PATH. 二、下面的完整的脚本&#xff0c;里面的echo "export PATH$build_toolchain_path:\$PATH" >> $HOME/.bashrc 就是把交叉编译路径写写到.bashrc设置…...

今年春节很多年轻人选择不买战袍,减少年货置办,「极简过年」,如何看待此现象?

​近年来&#xff0c;春节期间出现了一种新的现象&#xff0c;越来越多的年轻人选择不买战袍&#xff0c;减少年货置办&#xff0c;采用“极简过年”的方式度过春节。对于这一现象&#xff0c;不同人有不同的看法。 首先&#xff0c;这种极简过年的方式符合当前社会的一些价值观…...

C语言·贪吃蛇游戏(下)

上节我们将要完成贪吃蛇游戏所需的前置知识都学完了&#xff0c;那么这节我们就开始动手写代码了 1. 程序规划 首先我们应该规划好我们的代码文件&#xff0c;设置3个文件&#xff1a;snack.h 用来声明游戏中实现各种功能的函数&#xff0c;snack.c 用来实现函数&#xff0c;t…...

Flask 入门2:路由

1. 前言 在上一节中&#xff0c;我们使用到了静态路由&#xff0c;即一个路由规则对应一个 URL。而在实际应用中&#xff0c;更多使用的则是动态路由&#xff0c;它的 URL是可变的。 2. 定义一个很常见的路由地址 app.route(/user/<username>) def user(username):ret…...

【C++】 C++入门— 基于范围的 for 循环

C 基于范围的for循环1 使用样例2 使用条件3 完善措施 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 基于范围的for循环 1 使用样例 使用for循环遍历数组&#xff0c;我们通常这么写&#xff1a; …...

C++——析构函数

C——析构函数 什么是析构函数 析构函数是C中的一个特殊的成员函数&#xff0c;它在对象生命周期结束时被自动调用&#xff0c;用于执行对象销毁前的清理工作。析构函数特别重要&#xff0c;尤其是在涉及动态分配的资源&#xff08;如内存、文件句柄、网络连接等&#xff09;…...

Vue3学习记录(二)--- 组合式API之计算属性和侦听器

一、计算属性 1、简介 ​ 计算属性computed()&#xff0c;用于根据依赖的响应式变量的变化&#xff0c;进行自动的计算&#xff0c;并返回计算后的结果。当依赖的响应式变量发生变化时&#xff0c;computed()会自动进行重新计算&#xff0c;并返回最新的计算结果。如果依赖的…...

react-virtualized实现行元素不等高的虚拟列表滚动

前言&#xff1a; 当一个页面中需要接受接口返回的全部数据进行页面渲染时间&#xff0c;如果数据量比较庞大&#xff0c;前端在渲染dom的过程中需要花费时间&#xff0c;造成页面经常出现卡顿现象。 需求&#xff1a;通过虚拟加载&#xff0c;优化页面渲染速度 优点&#xff1…...

Linux系统各目录作用

/etc文件系统 /etc 目录包含各种系统配置文件&#xff0c;下面说明其中的一些。其他的你应该知道它们属于哪个程序&#xff0c;并阅读该程序的m a n页。许多网络配置文件也在/etc 中。 1. /etc/rc或/etc/rc.d或/etc/rc?.d 启动、或改变运行级时运行的脚本或脚本的目录。 2. /…...

嵌入式系统学习(一)

嵌入式现状&#xff08;UP经历&#xff09;&#xff1a; 大厂的招聘要求&#xff1a; 技术栈总结&#xff1a; 产品拆解网站&#xff1a; 52audio 方案查询网站iotku,我爱方案网&#xff0c; 主要元器件类型&#xff1a;...

重写Sylar基于协程的服务器(3、协程模块的设计)

重写Sylar基于协程的服务器&#xff08;3、协程模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、日志模…...

Linux之系统安全与应用续章

目录 一. PAM认证 1.2 初识PAM 1.2.1 PAM及其作用 1.2.2 PAM认证原理 1.2.3 PAM认证的构成 1.2.4 PAM 认证类型 1.2.5 PAM 控制类型 二. limit 三. GRUB加密 /etc/grub.d目录 四. 暴力破解密码 五. 网络扫描--NMAP 六. 总结 一. PAM认证 1.2 初识PAM PAM是Linux系…...

《HTML 简易速速上手小册》第7章:HTML 多媒体与嵌入内容(2024 最新版)

文章目录 7.1 在HTML中嵌入视频和音频7.1.1 基础知识7.1.2 案例 1&#xff1a;嵌入视频文件7.1.3 案例 2&#xff1a;嵌入音频文件7.1.4 案例 3&#xff1a;创建一个视频和音频混合的播放列表 7.2 使用 <iframe> 嵌入外部内容7.2.1 基础知识7.2.2 案例 1&#xff1a;嵌入…...

【CSS】移动端适配

移动端适配怎么做&#xff1f; 适配的目的是在屏幕大小不同的终端设备拥有统一的界面&#xff0c;让拥有更大屏幕的终端展示更多的内容。 meta viewport (视口) 移动端初始视口的大小默认是980px&#xff0c;因为世界上绝大多数PC网页的版心宽度为980px &#xff0c;如果网页…...

DFS剪枝算法经典题目-挑选

4954. 挑选 - AcWing题库 给定一个包含 n 个正整数 a1,a2,…,an的集合。 集合中可能存在数值相同的元素。 请你从集合中挑选一些元素&#xff0c;要求同时满足以下所有条件&#xff1a; 被选中元素不少于 2 个。所有被选中元素之和不小于 l 且不大于 r。所有被选中元素之中最大…...

考研经验总结——考试期间

文章目录 一、订房二、看考场三、休息四、考前带宾馆的书五、安全 一、订房 我刚刚看了看&#xff0c;是9.10号订的酒店。你们可以提前向学长学姐打听你的考场在哪个学校&#xff08;徐州的考生&#xff0c;考省外的学校是在矿大考试&#xff0c;考省内的学校是在江师大&#…...

vue3 源码解析(6)— lifecycle 生命周期的实现

前言 对于 vue3 的生命周期&#xff0c;我们经常性会去疑问&#xff0c;生命周期有哪些呢&#xff0c;它是怎么去实现的&#xff0c; 又是什么时候调用的。 vue3 生命周期有哪些 下面这个表格列出了所有选项式api生命周期钩子和组合式api生命周期钩子&#xff0c;以及他们的…...

three.js CSS2DRenderer、CSS2DObject渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"><…...

SECS/GEM300和半导体e84控制器

SECS&#xff08;SEMI EQUIPMENT COMMUNICATIONS STANDARD 2&#xff09;半导体设备通讯标准 GEM&#xff08;Generic Equipment Model&#xff09;定义了Fab中各个场景下设备行为及其所使用SECS消息。 GEM300也称为300mm标准&#xff0c;FAB是12寸设备的处理作业规范。主要包…...

k8s二进制及负载均衡集群部署详解

目录 常见部署方式 二进制部署流程 环境准备 操作系统初始化配置 关闭防火墙 配置SELinux 关闭SWAP 根据规划设置主机名 在master添加hosts&#xff0c;便于主机名解析 调整内核参数 配置时间同步 部署docker引擎 在所有node节点部署docker引擎 部署etcd集群 签发…...

【Django开发】0到1开发美多商城项目第3篇:用户注册业务实现(附代码,已分享)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目相关知识。项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现前后端…...