正则表达式 请问能够用正则表达式来匹配麻将中 胡牌和算翻的计算方法吗?谢谢各位咯 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在做麻将游戏,本来已经用代码实现了算法了,不过现在技术总监要求用正则表达式来判断胡牌和算翻的方法,理由是方便以后修改,刻子和杠都想出来了该如何描述了,现在的问题是如何描述字符之间的联系,比如万字我是用a开头来表示,a1表示一万,a2表示二万,但是我怎么知道a1a2a3表示的是一个顺子呢? >>现在技术总监要求用正则表达式来判断胡牌和算翻的方法,理由是方便以后修改有病,只有正则表达式才方便修改么。而且复杂的正则表达式极难维护,你们总监是技术出身吗。 在做麻将游戏,本来已经用代码实现了算法了,不过现在技术总监要求用正则表达式来判断胡牌和算翻的方法,理由是方便以后修改,刻子和杠都想出来了该如何描述了,现在的问题是如何描述字符之间的联系,比如万字我是用a开头来表示,a1表示一万,a2表示二万,但是我怎么知道a1a2a3表示的是一个顺子呢?楼主,你为什么不用数组呢?那样子只要判断它的索引就可以了,比如索引是0,1,2就可以了阿 KAO,不愧是技术总监,真有想像力 曾经从网上剽过一段,但不是正则的。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)); }} 刚刚学java,面对输入百思不得其解!!!求帮助 请教高手 下载的look and feel 放到什么文件夹下? 对象的引用问题 FileWriter写文件数据大小超过8192就会出错??? 如何对屏幕当前内容进行截图? switch 语句的一个问题 谁能提供一些Swing的源程序下载,学习啊,高分重谢。 编译成exe 各位大哥,能不能告诉我为什么jbuilder6.0会跑得这么快呀? 怎么输出百分比? 线程问题! 怎样用AWT画30×30个小格子?每个格子10个像素大小。
楼主,你为什么不用数组呢?那样子只要判断它的索引就可以了,比如索引是0,1,2就可以了阿
{
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));
}
}