zoukankan      html  css  js  c++  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
    方块:9
    
    ofter order :
    方块 : 3 4 6 8 9 A 
    黑桃 : 5 10 Q 
    红桃 : 9 
    梅花 : 4 5 9 
    
    max :
    方块:8 9 
  • 相关阅读:
    Centos7.6安装教程 && history设置显示执行命令的时间
    C# 调用第三方webapi 接口的示例(使用httpclient)
    asp.net core 上传文件
    Sql中CHARINDEX用法---判断数据库某个字段是否包含某个字符
    ASP.NET上传文件出现“404-找不到文件或目录”的解决办法
    C# 中转换的几种方式
    C# 向文件写入和读取文件内容
    C# 中正则表达式
    C# 写的通用得到富文本框中的图片路径
    C# 正则表达式输入验证必须为汉字
  • 原文地址:https://www.cnblogs.com/lan0725/p/3399961.html
Copyright © 2011-2022 走看看