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
方块:9

ofter order :
方块 : 3 4 6 8 9 A 
黑桃 : 5 10 Q 
红桃 : 9 
梅花 : 4 5 9 

max :
方块:8 9 

 

posted @ 2013-10-31 19:33  彼岸Elan  阅读(7132)  评论(0编辑  收藏  举报