近来正在做麻将游戏,写了个判断听牌的算法(暂且称其为算法),和大家分享一下,
算法还没通过全面的验证,可能会遗漏某些情况。(我不太会打麻将阿)
其中判断和牌算法的程序代码是网上找的,是听牌算法的基石。在这感谢这位仁兄了。
1、在介绍算法之前,先说说我的牌值顺序:
0-8 : 1-9万
9-17 : 1-9筒
18-26: 1-9条
27-30: 东南西北风
31-33: 中发白
无花
2、MaJiang3.java 是判断可否听牌的程序
(1)、判断点:当玩家抓进一张牌后(14张),系统判断出这时候打出某些牌后就听牌了
(2)、思想:检查将某个牌替换成另一个牌后能不能和(不考虑番种),能和就表示能听
3、MaJiang2.java 是判断某一手牌是否能和的程序
还是看代码吧,我在程序里加了些注释:
import
java.util.
*
;
public
class
MaJiang3

...
{

/**//*
先拿掉一个,然后再检测缺少什么,补上,这里不行,就补别的地方
*/
public ArrayList entryList = new ArrayList(); //替换对子
private int fmaj = -1; //可以打掉的牌
private int tmaj = -1; //可以补上的牌

int[] w=...{
3,1,1,1,2,1,1,1,3}; //1-9万各个牌的个数

int[] to=...{
0,0,0,0,0,0,0,0,0};

int[] ti=...{
0,0,0,0,0,0,0,0,0};

int[] z=...{
0,0,0,0,0,0,0};
public MaJiang3(int[] w, int[] to, int[] ti, int[] z)

...{
this.w = w;
this.to = to;
this.ti = ti;
this.z = z;
}
private void ting()

...{
for(int i = 0; i < 34; i++)

...{
boolean exeIT = false;
if((i < 9 && w[i] >0) )

...{
w[i]--;
fmaj = i;
if(!check())

...{ w[i]++;continue;}
w[i]++;
}
else if(i >=9 && i < 18 && to[i-9] >0)

...{
to[i-9]--;
fmaj = i;
if(!check())

...{ to[i-9]++;continue;}
to[i-9]++;
}
else if(i >=18 && i <27 && ti[i-18] >0)

...{
ti[i-18]--;
fmaj = i;
if(!check())

...{ ti[i-18]++;continue;}
ti[i-18]++;
}
else if((i >= 27 && z[i-27] >0))

...{
z[i-27] = z[i-27] -1;