Java 扑克牌发牌

2024-06-17 10:32
文章标签 java 扑克牌 发牌

本文主要是介绍Java 扑克牌发牌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java 扑克牌发牌

今天看到这个算法题,http://www.cnblogs.com/xishuai/p/3392981.html ,忍不住自己用Java做了一个。

初始化很重要,所有的52张牌按顺序放入到容器里边,标志位标记为false表示手里没这牌。

1 发牌

利用随机数,找到容器中的这张牌,将标志位标记为true,表示手里有了这张牌。

2 排序

因为放入的时候是按顺序的,于是每个花色各自,自然也是按照顺序,找出标志位为true的,输出即可。

3找出最大连续牌

思路是将连续的字符分隔出来,连续数目最大的,即为最大连续牌。每个花色的的最大牌找出来,再找出最大的。

做法:

每个花色里,生成一个字符串,其中,手里有的排,将索引加入字符串,再加分隔符。手里没有的,用分号加入字符串。

用分号分隔后,长度大于1的即为有连续牌的。从有连续牌的,找出最大的即可。

复制代码
/*** desc* 程序描述:一副纸牌有52张,4种花色,每种花色13张。我们能用一个整数m就表示出所有的52种情况,规则是:m / 13: =0: 红心,=1: 方块,=2: 梅花,=3: 黑桃m % 13:  =0:2,=1:3,=2:4 ....  =8:10,=9:J,=10:Q,=11: K,=12:A比如:m = 15 就表示:方块4  m=38表示:梅花A我们希望用程序模拟1副扑克牌随机抽取13张,发给某人的过程。发牌后需要排序:规则是:先按花色,再按点数。花色的大小顺序是:梅花、方块、红心、黑桃。点数的顺序是:2、3、4、…. 10、J、Q、K、A。然后,挑选出最大的连续牌型。规则是:连续张数多的大。张数相等的则花色大的大(此时与点数无关)。我加了一条规则 最小连续是3张*/
package algorithm;import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Vector;/*** @author new**/
public class Poker {private static final int CARDSNUM=13;private static final int MAX_NUM=52;private static final int MIN_CONSEC_NUM = 2;private Map<CardColor,Vector<Cards>> allCards=new HashMap<CardColor,Vector<Cards>>();public void start(){init();genarate();order();printMax();}private void init(){allCards.clear();for(CardColor color:CardColor.values()){Vector<Cards> v=new Vector<Cards>();for(CardDisplay cd:CardDisplay.values()){Cards  c = new Cards();c.setCardColor(color);c.setCardDisplay(cd);c.setExist(false);c.setRealNum(CARDSNUM*color.colorType+cd.num);v.add(c);}allCards.put(color, v);}}/*** 随机抽取13张牌*/private void genarate(){System.out.println("my cards is :");int i=0;do{Random r = new Random();int tmp = r.nextInt(MAX_NUM);int answer = tmp / CARDSNUM ;for(Cards obj:allCards.get(getColor(answer))){if(obj.getRealNum()==tmp&&obj.isExist()==false){i++;obj.setExist(true);System.out.println(obj.getCardColor().colorDesc+":"+obj.getCardDisplay().displayStr);break;}}}while(i<CARDSNUM);}private CardColor getColor(int answer){for(CardColor cc:CardColor.values()){if(cc.colorType == answer){return cc;}}return null;}/*** 开始排序 其实不用排序 枚举初始化的时候已经排好序*/private void order(){System.out.println();System.out.println("ofter order :");for(CardColor key:allCards.keySet()){System.out.print(key.colorDesc +" : ");for(Cards obj:allCards.get(key)){if(obj.isExist()){System.out.print(obj.getCardDisplay().displayStr+" ");}}System.out.println();}}/*** 取出最大的连续牌型*/private void printMax(){CardColor maxColor=null;int maxCardIdx = -1;int maxCardLength =0;for(CardColor key:allCards.keySet()){Vector<Cards> v = allCards.get(key);StringBuffer tmpcards=new StringBuffer();for(int idx=0;idx<v.size();idx++){Cards obj = v.get(idx);if(obj.isExist()){tmpcards.append(idx).append("-");}else{tmpcards.append(";");}}String cardstr=  tmpcards.toString().replaceAll("-;", ";");if(cardstr.endsWith("-"))cardstr=cardstr.substring(0,cardstr.length()-2);String[] tmpcardsarr=cardstr.split(";");int temp_maxCardIdx =-1;int tmp_maxCardLength =0;for(int i=0;i<tmpcardsarr.length;i++){String[] arr = tmpcardsarr[i].split("-");if(tmp_maxCardLength<=arr.length&&arr.length>=MIN_CONSEC_NUM){temp_maxCardIdx=Integer.parseInt(arr[0]);tmp_maxCardLength=arr.length;}}if(tmp_maxCardLength>=MIN_CONSEC_NUM){if(tmp_maxCardLength>maxCardLength||(maxColor!=null && tmp_maxCardLength==maxCardLength&&key.colorIndex>maxColor.colorIndex)){maxColor = key;maxCardIdx = temp_maxCardIdx;maxCardLength = tmp_maxCardLength;}}}System.out.println();System.out.println("max :");if(maxCardLength>=MIN_CONSEC_NUM){            System.out.print(maxColor.colorDesc+":");Vector<Cards> v = allCards.get(maxColor);for(int i=maxCardIdx;i<v.size();i++){Cards obj = v.get(i);if(obj.isExist()){System.out.print(obj.getCardDisplay().displayStr+" ");}else{return;}}}else{System.out.println("无连续牌");}}/*** @param args*/public static void main(String[] args) {Poker p = new Poker();p.start();}}
class CardMax
{CardColor maxColor;int maxCardIdx;
}
/*** * @author new**/
enum CardColor
{CLUB(2,"梅花",1),//梅花DIAMOND(1,"方块",2),//方块HEART(0,"红桃",3),//红桃SPADE(3,"黑桃",4);//黑桃protected final int colorType;protected final String colorDesc;protected final int colorIndex;//代表花色大小 值越大越大private CardColor(int type,String desc,int oidx){this.colorType = type;this.colorDesc = desc;this.colorIndex = oidx;}
}
enum CardDisplay
{CARD_2(0),CARD_3(1),CARD_4(2),CARD_5(3),CARD_6(4),CARD_7(5),CARD_8(6),CARD_9(7),CARD_10(8),CARD_J(9),CARD_Q(10),CARD_K(11),CARD_A(12);protected final String displayStr;protected final int num;private CardDisplay(int num){this.num = num;if(num<9){this.displayStr = String.valueOf(num+2);}else{String str="";switch(num){case 9:str = "J";break;case 10:str = "Q";break;case 11:str = "K";break;case 12:str="A";break;}    this.displayStr = str;}        }
}
/*** 每张牌对象* @author new**/
class Cards
{Cards(){}Cards(CardColor cardColor,CardDisplay cardDisplay,int realNum,boolean exist){this.cardColor = cardColor;this.cardDisplay = cardDisplay;this.realNum = realNum;this.exist = exist;}private CardColor cardColor;//花色private CardDisplay cardDisplay;private int    realNum;private boolean   exist;public CardColor getCardColor() {return cardColor;}public CardDisplay getCardDisplay() {return cardDisplay;}public int getRealNum() {return realNum;}public boolean isExist() {return exist;}public void setCardColor(CardColor cardColor) {this.cardColor = cardColor;}public void setCardDisplay(CardDisplay cardDisplay) {this.cardDisplay = cardDisplay;}public void setRealNum(int realNum) {this.realNum = realNum;}public void setExist(boolean exist) {this.exist = exist;}
}
复制代码


测试结果:

复制代码
my cards is :
方块:6
方块:8
方块:4
梅花:4
方块:A
红桃:9
黑桃:Q
梅花:9
梅花:5
黑桃:10
黑桃:5
方块:3
方块:9ofter order :
方块 : 3 4 6 8 9 A 
黑桃 : 5 10 Q 
红桃 : 9 
梅花 : 4 5 9 max :
方块:8 9 

这篇关于Java 扑克牌发牌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069193

相关文章

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.