今天看到这个算法题,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
方块:9 ofter order :
方块 : 3 4 6 8 9 A
黑桃 : 5 10 Q
红桃 : 9
梅花 : 4 5 9 max :
方块:8 9

Java 扑克牌发牌的更多相关文章

  1. Java练习——扑克牌发牌器

    Java练习——扑克牌发牌器声明:学习自其他博主,感谢分享,这里自己也写了一下.实现思路 - 构建一张扑克牌 - 构建一套扑克牌 - 测试  构建一张扑克牌 /** * @author 冬冬 * 定义 ...

  2. C算法编程题(一)扑克牌发牌

    前言 上周写<我的编程开始(C)>这篇文章的时候,说过有时间的话会写些算法编程的题目,可能是这两天周末过的太舒适了,忘记写了.下班了,还没回去,闲来无事就写下吧. 因为写C++的编程题和其 ...

  3. [原]用C#模拟实现扑克牌发牌、排序程序…

    (1)52张扑克牌,四种花色(红桃.黑桃.方块和梅花),随机发牌给四个人. (2)最后将四个人的扑克牌包括花色打印在控制台上. 其中:     花色和点数用枚举类型实现     每张扑克牌用结构实 ...

  4. [原]用C#模拟实现扑克牌发牌、排序程序。

    (1)52张扑克牌,四种花色(红桃.黑桃.方块和梅花),随机发牌给四个人. (2)最后将四个人的扑克牌包括花色打印在控制台上. 其中:     花色和点数用枚举类型实现     每张扑克牌用结构实 ...

  5. C# -- 模拟扑克牌发牌

    C# -- 模拟扑克牌发牌 1.  User 类: 玩家 public class User { private List<PaperCard> listCard = new List&l ...

  6. Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不 ...

  7. JAVA 实现发牌的 改进

    java是一门面向对象的语言,我们在解决这个问题的时候先找对象.我认为面想对象 “就是把复杂的问题变简单,简单的问题程序化” .如果我们  创建一盒牌--->洗牌--->选地主牌---&g ...

  8. HashTable的使用,扑克牌发牌游戏

    l  场景 主要实现以下功能: 1.      首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下:   红桃按照从小到大依次为:1-13   方块按照从小到大依次为:14-26   黑桃按 ...

  9. Java程序设计之扑克牌

    这段代码的主要实现功能扑克牌的洗牌和发牌功能,一副牌,红桃,黑桃,梅花,方片,A~K,不含大小王. 构造一个class. 首先是声明花色: private String[] sign={"方 ...

随机推荐

  1. 菜鸟的飞翔日记-os篇

    一轮王道os复习感想 1概述 虽然去年有上操作系统这门必修课,考的成绩也算理想,本来还有点沾沾自喜,嗯,觉得自己学的还不错,知道有一天我拿起了王道,(没给王道打广告)看王道的原因完全在于为考研做准备, ...

  2. 【Docker 命令】- create命令

    docker create :创建一个新的容器但不启动它 语法 docker create [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS同run命令 实例 使用 ...

  3. new关键字 、this关键字、base关键字

    使用new,所做的三件事: 1. (类是引用对象,引用对象是在堆中开辟空间)在堆中开辟空间 2. 在开辟的堆空间中创建对象 3. 调用对象的构建函数 4. 隐藏父类成员:子类的成员可以与隐藏从父类继承 ...

  4. C# 中常用的索引器

    使用 C# 中的索引器和 JavaScript 中访问对象的属性是很相似. 之前了解过索引器,当时还把索引器和属性给记混了, 以为索引器就是属性,下面写下索引器和属性的区别,以及怎么使用索引器 先说明 ...

  5. 【Maven】Snapshot和Release版本的区别

    Snapshot版本代表不稳定.尚处于开发中的版本,快照版本. Release版本则代表稳定的版本,发行版本. 什么时候用Snapshot版本? 依赖库中的jar正处于开发的阶段,会被经常被更新,这种 ...

  6. shit antd & Merry Christmas bug

    shit antd & Merry Christmas bug https://github.com/ant-design/ant-design/issues/13098 antd 玩大了? ...

  7. BZOJ 1263 整数划分(数学+高精度)

    我们不妨考虑可以划分为实数的情况,设划分为x份实数,使得总乘积最大. 易得当每一份都相等时乘积最大.即 ans=(n/x)^x. 现在只需要求出这个函数取得最大值的时候x的取值了. 两边取对数,则有l ...

  8. Git无法删除文件问题:fatal: pathspec 'readme.txt' did not match any files

    在使用Git时,不小心创建了一个不需要的文件,想要删除一个文件时,出现了错误: fatal: pathspec 'readme.txt' did not match any files 原因是新建的这 ...

  9. 【题解】CF#833 B-The Bakery

    一个非常明显的 \(nk\) dp 状态 \(f[i][k]\) 表示以 \(i\) 为第 \(k\) 段的最后一个元素时所能获得的最大代价.转移的时候枚举上一段的最后一个元素 \(j\)更新状态即可 ...

  10. 简单谈谈Docker镜像的使用方法_docker

    在上篇文章(在Docker中搭建Nginx服务器)中,我们已经介绍了如何快速地搭建一个实用的Nginx服务器.这次我们将围绕Docker镜像(Docker Image),介绍其使用方法.包括三部分: ...