斗地主案例及一些实现规则

4. 斗地主发牌

4.1 案例介绍

按照斗地主的规则,完成洗牌发牌的动作。 具体规则:

使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。

4.2 案例分析

  • 准备牌:

    牌可以设计为一个ArrayList<String>,每个字符串为一张牌。 每张牌由花色数字两部分组成,我们可以使用花色集合与数字集合嵌套迭代完成每张牌的组装。 牌由Collections类的shuffle方法进行随机排序。

  • 发牌

    将每个人以及底牌设计为ArrayList<String>,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌。

  • 看牌

    直接打印每个集合。

4.3 代码实现

public class App {public static void main(String[] args) {/*完成控制台版的三步:准备牌洗牌发牌*///从程序的主入口开启斗地主游戏new PokerGame();}
}
​
public class PokerGame {//牌盒//♥3 ♣3static ArrayList<String> list = new ArrayList<>();
​//静态代码块//特点:随着类的加载而在加载的,而且只执行一次。static {//准备牌// "♦", "♣", "♥", "♠"// "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"String[] color = {"♦", "♣", "♥", "♠" };String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
​for (String c : color) {//c依次表示每一种花色for (String n : number) {//n 依次表示每一个数字list.add(c + n);}}list.add("小王");list.add("大王");}
​public PokerGame(){//洗牌Collections.shuffle(list);
​//发牌ArrayList<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++) {//i:索引String poker = list.get(i);if(i <= 2){lord.add(poker);continue;}
​//给三个玩家轮流发牌if(i % 3 == 0){player1.add(poker);}else if(i % 3 == 1){player2.add(poker);}else{player3.add(poker);}}//看牌lookPoker("底牌",lord);lookPoker("钢脑壳",player1);lookPoker("大帅比",player2);lookPoker("蛋筒",player3);
​}
​/** 参数一:玩家的名字* 参数二:每位玩家的牌* */public void lookPoker(String name, ArrayList<String> list){System.out.print(name + ": ");for (String poker : list) {System.out.print(poker + " ");}System.out.println();}
}

4.4 排序(第一种排序方式)

public class App {public static void main(String[] args) {/*完成控制台版的四步:准备牌洗牌发牌排序
​*/
​//从程序的主入口开启斗地主游戏new PokerGame();}
}
​
​
public class PokerGame {//牌盒 Map//此时我们只要把牌跟序号产生对应关系就可以了,不需要按照序号进行排序,所以只要HashMap就可以了static HashMap<Integer, String> hm = new HashMap<>();static ArrayList<Integer> list = new ArrayList<>();
​static {String[] color = {"♦", "♣", "♥", "♠"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
​//序号int serialNumber = 1;//细节for (String n : number) {//依次表示每一个数字for (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> lord = new TreeSet<>();TreeSet<Integer> player1 = new TreeSet<>();TreeSet<Integer> player2 = new TreeSet<>();TreeSet<Integer> player3 = new TreeSet<>();
​for (int i = 0; i < list.size(); i++) {//i :依次表示集合中的每一个索引//list.get(i)元素:牌的序号int serialNumber = list.get(i);
​if(i <= 2){lord.add(serialNumber);continue;}
​if(i % 3 == 0){player1.add(serialNumber);}else if(i % 3 == 1){player2.add(serialNumber);}else{player3.add(serialNumber);}}
​
​//看牌lookPoker("底牌",lord);lookPoker("钢脑壳",player1);lookPoker("大帅比",player2);lookPoker("蛋筒",player3);
​}
​/** 参数一:玩家的名字* 参数二:牌的序号* */public void lookPoker(String name, TreeSet<Integer> ts){System.out.print(name + ": ");//遍历TreeSet集合得到每一个序号,再拿着序号到Map集合中去找真正的牌for (int serialNumber : ts) {String poker = hm.get(serialNumber);System.out.print(poker + " ");}System.out.println();}
}

4.5 排序(第二种排序方式)

public class App {public static void main(String[] args) {new PokerGame();}
}
​
​
public class PokerGame {//牌盒static ArrayList<String> list = new ArrayList<>();
​//创建一个集合,用来添加牌的价值static HashMap<String, Integer> hm = new HashMap<>();
​static {//准备牌String[] color = {"♦", "♣", "♥", "♠"};String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
​for (String c : color) {for (String n : number) {list.add(c + n);}}list.add(" 小王");list.add(" 大王");
​
​//指定牌的价值//牌上的数字到Map集合中判断是否存在//存在,获取价值//不存在,本身的数字就是价值hm.put("J", 11);hm.put("Q", 12);hm.put("K", 13);hm.put("A", 14);hm.put("2", 15);hm.put("小王", 50);hm.put("大王", 100);
​
​}
​public PokerGame() {//洗牌Collections.shuffle(list);
​//发牌ArrayList<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++) {String poker = list.get(i);//发底牌if (i <= 2) {lord.add(poker);continue;}
​//给三个玩家轮流发牌if (i % 3 == 0) {player1.add(poker);} else if (i % 3 == 1) {player2.add(poker);} else {player3.add(poker);}}
​
​//排序order(lord);order(player1);order(player2);order(player3);
​
​//看牌lookPoker("底牌",lord);lookPoker("钢脑壳",player1);lookPoker("大帅比",player2);lookPoker("蛋筒",player3);}
​
​/** 参数一:玩家的名字* 参数二:每位玩家的牌* */public void lookPoker(String name, ArrayList<String> list){System.out.print(name + ": ");for (String poker : list) {System.out.print(poker + " ");}System.out.println();
​}
​
​//利用牌的价值进行排序//参数:集合//♥5 ♥3 ♥6 ♥7 ♥9public void order(ArrayList<String> list){Collections.sort(list, new Comparator<String>() {//Array.sort (插入排序 + 二分查找)@Overridepublic int compare(String o1, String o2) {//o1:表示当前要插入到有序序列中的牌//o2:表示已经在有序序列中存在的牌
​//负数:o1小 插入到前面//正数:o1大 插入到后面//0:o1的数字跟o2的数字是一样的,需要按照花色再次排序
​//1.计算o1的花色和价值   大王String color1 = o1.substring(0, 1);int value1 = getValue(o1);
​//2.计算o2的花色和价值String color2 = o2.substring(0, 1);int value2 = getValue(o2);
​//3.比较o1和o2的价值    ♥3  ♠3int i = value1 - value2;return i == 0 ? color1.compareTo(color2) : i;
​}});}
​//计算牌的价值//参数:牌//返回值:价值public int getValue(String poker){//♥3//获取牌上的数字String number = poker.substring(1);//把这里截取出来的结果,让这个结果再Map集合中存在 “ 大王”//拿着数字到map集合中判断是否存在if(hm.containsKey(number)){//存在,获取价值return hm.get(number);}else{//不存在,类型转换return Integer.parseInt(number);}}
}

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

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

相关文章

机器学习 day34(机器学习项目的完整周期、精确度和召回率、F1)

机器学习项目的完整周期 第一步&#xff0c;决定项目是什么。第二步&#xff0c;收集数据。第三步&#xff0c;训练模型&#xff0c;进行错误分析并改进模型&#xff0c;可能会回到第二步。第四步&#xff0c;当模型足够好后&#xff0c;部署在生产环境中&#xff0c;继续监控…

汽车OTA

汽车OTA&#xff08;Over-The-Air&#xff09;技术是指通过无线网络对汽车进行软件升级、数据传输和远程诊断等功能的技术。随着汽车行业的数字化和智能化发展&#xff0c;OTA技术在汽车领域的应用越来越广泛&#xff0c;对于提高汽车性能、降低维修成本和提升用户体验具有重要…

Leetcode 1004. Max Consecutive Ones III 滑动窗口经典题

Max Consecutive Ones III Medium Given a binary array nums and an integer k, return the maximum number of consecutive 1’s in the array if you can flip at most k 0’s. Example 1: Input: nums [1,1,1,0,0,0,1,1,1,1,0], k 2 Output: 6 Explanation: [1,1,1,0,0…

【Redis7】--3.Redis持久化

Redis持久化 Redis持久化(Redis persistence)是指将数据写入持久化存储&#xff0c;如固态硬盘(SSD) Redis提供了一系列持久化选项&#xff0c;这些包括&#xff1a; RDB(redis数据库)&#xff1a;RDB持久化方式能够在指定的时间间隔对数据进行快照存储AOF(追加文件)&#x…

axios在vue3.x中的基础入门使用

-2023.05.18更新&#xff0c;修复了之前demo中存在的3个问题。现在可以无bug跑起来。 1.axios在vue3.x中的基础入门使用 在不涉及使用axios进行请求拦截以及响应拦截的场景下&#xff0c;axios的使用可以简化为以下步骤。 step1. 使用npm安装axios npm install axios step…

Linux安装包 | Git使用 | NFC搭建

dpgt使用 当谈到基于 Debian 的操作系统中的软件包管理工具时&#xff0c;dpkg 是一个重要的工具。它是 Debian 系统中用于安装、升级、配置和卸载软件包的命令行工具。以下是对 dpkg 的详细介绍&#xff1a; 软件包管理&#xff1a;dpkg 可以管理系统中的软件包。它可以安装单…

Aztec.nr:Aztec的隐私智能合约框架——用Noir扩展智能合约功能

1. 引言 前序博客有&#xff1a; Aztec的隐私抽象&#xff1a;在尊重EVM合约开发习惯的情况下实现智能合约隐私 Aztec.nr&#xff0c;为&#xff1a; 面向Aztec应用的&#xff0c;新的&#xff0c;强大的智能合约框架使得开发者可直观管理私有状态基于Noir构建&#xff0c;…

汽车ECU软件升级方案介绍

软件OTA的背景 随着汽车网联化的发展,现在的汽车电子架构都支持软件空中升级,即大家常说的OTA(Software Update and Upgrade Over the Air),传统的软件升级常常是离线升级,需要车主将车开到维修保养中心进行软件更新。不过OTA升级方式带来方便之处需要考虑的问题也随之增…

LeetCode2.两数相加

一看完题&#xff0c;我的想法是先算出这两个链表表示的数&#xff0c;然后相加&#xff0c;然后把这个数一位一位的分配给第三个数组&#xff0c;这种方法应该很简单但是要遍历三次数组&#xff0c;于是我就想直接一遍遍历&#xff0c;两个链表同时往后面遍历&#xff0c;把这…

基础篇之SDK编译

文章目录 一、 Ubuntu系统固件下载1. 固件下载2 放入SDK根目录中 二、编译SDK三、说明 一、 Ubuntu系统固件下载 1. 固件下载 在资源下载页面下载Ubuntu Rootfs固件&#xff0c;文件夹有三个文件&#xff0c;其区别如下&#xff0c;根据情况进行选择下载 资源名称作用Ubuntu2…

MySQL里的查看操作

文章目录 查看当前mysql有谁连接查看数据库或者表 查看当前mysql有谁连接 show processlist;查看数据库或者表 列出所有数据库&#xff1a; show databases;查看正在使用的数据库&#xff08;必须大写&#xff09;&#xff1a; SELECT DATABASE();列出数据库中的表&#xf…

免费开箱即用的微鳄任务管理系统

编者按&#xff1a;基于天翎低代码平台实现的微鳄365任务管理系统&#xff0c;包括有发起任务、重点关注、日程、项目管理等功能&#xff0c;支持私有化部署&#xff0c;免费开箱即用。任务管理系统是组织工作中不可或缺的工具&#xff0c;可以提高工作效率、促进协作、增强任务…

强大的JTAG边界扫描(5):FPGA边界扫描应用

文章目录 1. 获取芯片的BSDL文件2. 硬件连接3. 边界扫描测试4. 总结 上一篇文章&#xff0c;介绍了基于STM32F103的JTAG边界扫描应用&#xff0c;演示了TopJTAG Probe软件的应用&#xff0c;以及边界扫描的基本功能。本文介绍基于Xilinx FPGA的边界扫描应用&#xff0c;两者几乎…

华为云云耀云服务器 L 实例评测|配置教程 + 用 Python 简单绘图

文章目录 Part.I IntroductionChap.I 云耀云服务器 L 实例简介Chap.II 参与活动步骤 Part.II 配置Chap.I 初步配置Chap.II 配置安全组 Part.III 简单使用Chap.I VScode 远程连接华为云Chap.II 简单绘图 Reference Part.I Introduction 本篇博文是为了参与华为“【有奖征文】华…

Java手写希尔排序和算法案例拓展

Java手写希尔排序和算法案例拓展 1. 希尔排序的思维导图和实现思路原理 #mermaid-svg-d8kw3WO2lcmScRAo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-d8kw3WO2lcmScRAo .error-icon{fill:#552222;}#mermaid-svg-…

力扣207、课程表 【图】

题目 课程与课程之间的先决条件组成有向图&#xff0c;课程是图中的顶点&#xff0c;课程之间的先决条件是图中的有向边。对于数组 prerequisites 中的元素 [a,b]&#xff0c;表示在学习课程 a 前必须先完成课程 b&#xff0c;对应从 b 指向 a 的有向边&#xff0c;b 是 a 的前…

Makefile基础

迷途小书童 读完需要 4分钟 速读仅需 2 分钟 1 引言 下面这个 C 语言的代码非常简单 #include <stdio.h>int main() {printf("Hello World!.\n");return 0; } 在 Linux 下面&#xff0c;我们使用下面的命令编译就可以 gcc hello.c -o hello 但是随着项目的变大…

【第200篇原创文章】解决低于1%概率出现的芯片VPSS模块跑飞的问题

在发布SDK内测的时候&#xff0c;我们发现在切换视频分辨率的时候有低概率出现VPSS模块跑飞的情况&#xff0c;概率低于1%&#xff0c;试个两三百次&#xff0c;能出1~2次。切换视频分辨率这个功能在安防产品上也确实存在需求&#xff0c;网络带宽不大好的地方分辨率可以适当下…

CKA真题分析-2023年度

补充信息 #补全 # apt install bash-completion source <(kubectl completion bash)# kubectl config get-contexts # cat ~/.kube/config |grep current# kubectl config current-context kubectl config use-context复制粘贴 ctrlshiftc ctrlshiftv # edit编辑时只能使…

dns电脑服务器发生故障怎么修复

DNS电脑服务器发生故障可能会导致网络连接问题、网页无法访问、或者电子邮件无法发送等情况。修复DNS电脑服务器故障可以采取多种方法&#xff0c;例如检查网络连接、更换DNS服务器等措施。当DNS电脑服务器发生故障时&#xff0c;可以采取以下修复措施&#xff1a; 尝试刷新DNS…