VC++长沙麻将毕业设计论文 第4页
2.3算法的分析
数据结构:麻将的数字表示
用数字0~35表示麻将牌,其中0~8代表一万到九万,9~17代表一条到九条,18~26代表一筒到九筒,27代表东风,28代表南风,29代表西风,30代表北风,31代表中,32代表发,33代表白,34代表春夏秋冬,35代表梅竹兰菊
见下表
============================================
0 1 2 3 4 5 6 7 8
============================================
一万 二万 三万 四万 五万 辣万 七万 八万 九万
============================================
9 10 11 12 13 14 15 16 17
============================================
一条 二条 三条 四条 五条 辣条 七条 八条 九条
============================================
18 19 20 21 22 23 24 25 26
============================================
一筒 二筒 三筒 四筒 五筒 辣筒 七筒 八筒 九筒
============================================
27 28 29 30 31 32 33 34 35
============================================
东风 南风 西风 北风 红中 发财 白板 花1 花2
============================================
每个数字出现四次,代表四张牌,洗牌时采用随机算法提供牌墙
牌墙数据结构:
char SEAT[4][3] =
{"东",
"南",
"西",
"北"};
const char FENG[7][3] =
{"东",
"南",
"西",
"北",
"中",
"发",
"白"};
const char PAI[3][3] =
{"条",
"筒",
"万"};
const POINT ZhuangPos[4]=
{ {5,500},
{30, 5},
{760,20},
{760,470}
};
const POINT SeatPos[4]=
{ {35,500},
{30, 35},
{730,20},
{760,440}
};
const POINT OtherPaiPos[3] =
{ {760,410},
{700, 20},
{30 , 60},
};
const POINT ChuPaiPos[4] =
{ { 360,350},
{ 50,300},
{ 360,40},
{ 650,300}};
玩家数据结构:
玩家wanjia:{
门风:
menfeng:(27,28,29,30)
杠:
gangpai{
pai:0~33
mingAn:0|1
}
gangarr[0..3]:gangpai(最多四个杠,数字表示杠的牌,结构体第二位的0表示明杠,1表示暗杠)
碰:pengpai[0..3]:0~33最多四个碰牌
吃:
chipai{
chimin:(0~6,9~15,18~24)
chimax:(2~8,11~17,20~26)
}吃牌中只用记录顺子的收尾即可
chiarr[0..3]:chipai(最多有三个吃牌)
花牌:0~8(初始化为0,每摸到一个花牌加一)
手牌:paiInHand{
pai[0..13],
num:1,4,7,10,13
}
要牌pai[13]:除庄家外,初始化为-1,待摸牌上手(吃牌,碰牌,杠牌摸牌,任何一家打牌)后,将对应的牌值赋值给要牌,要牌为玩家需要处理牌的标志(当非负时),当玩家处理完牌后,将牌整理后,将要牌置-1
}
当要牌置位(非负)时,要对手牌进行胡牌判断:
由于手牌已经除掉了大量的碰杠吃等情况,简化的胡牌算法:
先对pai数组加上要牌一起排序;
然后用递归算法判断是否胡牌;
最后判断是否为7对,十三么,全不靠牌型:(注,这些牌型一般不容易胡,故番数也不小哦,^_^)
if(num==13)
{
if(pai[0]==pai[1]&pai[2]==pai[3]&pai[4]==pai[5]&pai[6]==pai[7]&pai[8]==pai[9]&pai[10]==pai[11]&pai[12]==pai[13])
return 1;//七对
dblpos=-1; //记录数组中对牌的位置;-1为没有对牌
dblnum=0;//对的个数(如果超过两个对(可能是一个刻子)则不能胡十三么,全不靠牌型)
for(i=0;i<14;i++}
{
if(pai[i]==pai[i+1])
{
dblpos=i;
dblnum++;
}
if(dblnum>1) break;
}
if(dblnum==1) //可能为十三么
{
tirteen=1;
for(i=0;i<14;i++)
{
if(pai[i]>0&[pai]<8)
{
tirteen=0;
break;
}
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页