请问能够用正则表达式来匹配麻将中 胡牌和算翻的计算方法吗?
谢谢各位咯

解决方案 »

  1.   

    在做麻将游戏,本来已经用代码实现了算法了,不过现在技术总监要求用正则表达式来判断胡牌和算翻的方法,理由是方便以后修改,刻子和杠都想出来了该如何描述了,现在的问题是如何描述字符之间的联系,比如万字我是用a开头来表示,a1表示一万,a2表示二万,但是我怎么知道a1a2a3表示的是一个顺子呢?
      

  2.   

    >>现在技术总监要求用正则表达式来判断胡牌和算翻的方法,理由是方便以后修改有病,只有正则表达式才方便修改么。而且复杂的正则表达式极难维护,你们总监是技术出身吗。
      

  3.   

    在做麻将游戏,本来已经用代码实现了算法了,不过现在技术总监要求用正则表达式来判断胡牌和算翻的方法,理由是方便以后修改,刻子和杠都想出来了该如何描述了,现在的问题是如何描述字符之间的联系,比如万字我是用a开头来表示,a1表示一万,a2表示二万,但是我怎么知道a1a2a3表示的是一个顺子呢?
    楼主,你为什么不用数组呢?那样子只要判断它的索引就可以了,比如索引是0,1,2就可以了阿
      

  4.   

    KAO,不愧是技术总监,真有想像力
      

  5.   

    曾经从网上剽过一段,但不是正则的。public class MaJiang
    {
        private boolean jiang=false;//是否找到将    public MaJiang(){}    //花色,判断这个花色是否被减完了(如果没有减完自然没有和)    private int huase(int[] hua)
         {
            if (hua.length==7)
             {
                //判断字,自比较特殊,没有顺
                for (int i=0;i<hua.length ;i++ )
                 {
                    if (hua[i]==3||hua[i]==4)
                     {
                        hua[i]=0;
                        huase(hua);
                    }
                    //如果字有两个,肯定是将
                    if (hua[i]==2&&!jiang)
                     {
                        hua[i]=0;
                        jiang=true;
                        huase(hua);
                    }
                }
            }
            else
             {
                for (int i=0;i<hua.length ;i++ )
                 {
                    //如果没有将,先把将减出去
                    if (!jiang&&hua[i]>=2)
                     {
                        hua[i]=hua[i]-2;
                        jiang=true;
                        int fanhui=huase(hua);
                        //如果递归回来依旧没有减完,则把将加回去
                        if (fanhui!=0)
                         {
                            hua[i]=hua[i]+2;
                            jiang=false;
                        }
                    }
                    if (hua[i]!=0&&i<7&&hua[i+1]!=0&&hua[i+2]!=0)
                     {
                        hua[i]--;
                        hua[i+1]--;
                        hua[i+2]--;
                        huase(hua);
                        int fanhui=huase(hua);
                        //如果递归回来依旧没有减完,减去的加回去
                        if (fanhui!=0)
                         {
                            hua[i]++;
                            hua[i+1]++;
                            hua[i+2]++;
                        }
                    }
                    if (hua[i]==3||hua[i]==4)
                     {
                        int temp=hua[i];
                        hua[i]=0;
                        huase(hua);
                        int fanhui=huase(hua);
                        //如果递归回来依旧没有减完,减去的加回去
                        if (fanhui!=0)
                         {
                            hua[i]++;
                            hua[i]=temp;
                        }
                    }
                }
            }
            int re=0;
            //最后判断减没减完
            for (int i=0;i<hua.length ;i++ )
             {
                re=re+hua[i];
            }
            return re;
        }
        public boolean Hu(int[] aWan,int[] aTong,int[] aTiao,int[] aZi)
         {        if(huase(aZi) == 0 && huase(aWan) == 0
                && huase(aTong) == 0 && huase(aTiao) == 0 && jiang)
             {
                return true;//和牌
            }
            else
             {
                return false;//不和
            }
        }
        public static void main(String[] args)
        {
            MaJiang mj=new MaJiang();
            int[] w={0,0,0,0,0,0,1,1,1};//万
            int[] to={0,0,0,0,1,1,1,0,0};//筒
            int[] ti={0,0,0,2,0,0,0,0,0};//条
            int[] z={0,0,0,0,0,0,3};//东南西北中发白
            long beginTime = System.currentTimeMillis();
            System.out.println(mj.Hu(w,to,ti,z));
            long endTime = System.currentTimeMillis();
            System.out.println("耗时:" + (endTime - beginTime));
        }
    }