今天看到这个算法题,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. android入门 — ListView的优化

    ListView的运行效率是比较低的,因为在getView()中每次都会将整个布局重新加载一遍,当ListView快速滚动的时候就会成为性能瓶颈. 调用View中的findViewById()方法获取 ...

  2. DOS工具

    winver  检查Windows版本wmimgmt.msc  打开windows管理体系结构wupdmgr  windows更新程序wscript  windows脚本宿主设置write  写字板w ...

  3. SQL SERVER技术内幕之6 集合查询

    1.定义 集合运算会对两个输入查询的结果集进行逐行比较,根据比较结果和所使用的集合运算来确定某一行是否应该包含在集合运算的结果中.因为集合运算是针对集合之间进行的计算,所以集合运算涉及的两个查询不能包 ...

  4. Maven 生命周期 和插件

    1.3 生命周期1.3.1 什么是生命周期? Maven生命周期就是为了对所有的构建过程进行抽象和统一.包括项目清理.初始化.编译.打包.测试.部署等几乎所有构建步骤. 生命周期可以理解为构建工程的步 ...

  5. 如何取得dbgrid中未保存(post)的值(50分)

    比如说处在编辑状态时,想取得当前记录值 Dataset.fields[0].Value 就是当前值:Dataset.fields[0].OldValue 就是原始值. 呵呵,我指得是在编辑时,就是按键 ...

  6. 2018 杭电多校1 - Distinct Values

    题目链接 Problem Description Chiaki has an array of n positive integers. You are told some facts about t ...

  7. windows 架设SVN服务器

    想完整走一遍svn布置及使用流程,试完整理了一下: step 1:下载安装 1.安装SVN服务器,到http://subversion.apache.org/packages.html 上下载wind ...

  8. 2017 ICPC beijing E - Cats and Fish

    #1631 : Cats and Fish 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are many homeless cats in PKU camp ...

  9. 【题解】Atcoder ARC#76 F-Exhausted?

    第一次用霍尔定理做题..简单的来说,就是判断一张二分图上是否存在完美匹配,只需要证明对于 \(a\) 集合中的任意 \(k\) 个点来说,都与 \(b\) 集合中的 \(k\) 个点有边相连.如果不满 ...

  10. [luogu5176] 公约数

    题目描述 求 \[ \sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^p\gcd(i\cdot j,i\cdot k,j\cdot k)\times \gcd(i,j,k)\tim ...