求麻将牌,胡牌的算法(判断每副牌听几张牌),要个大概思路!(使用后有高分相送)(0分)

  • 主题发起人 主题发起人 tianrei
  • 开始时间 开始时间
T

tianrei

Unregistered / Unconfirmed
GUEST, unregistred user!
麻将牌,胡牌的算法(判断每副牌听几张牌),要个大概思路!(使用后有高分相送)
 
发错地方了
 
每种花色,用深度优先穷举,最后在判断将
 
我也想知道!
 
穷举是不现实的。
谢谢各位
继续!
 
你得说明要求啊,比如:算不算混子啊?数不数番啊?。。。。。。
 
请参考:
功 能:演示一个简洁明了的递归函数——判断[麻将]的和牌。
* 说 明:1. 此函数不判断七对和十三幺,读者不难自行判断; *
*     同时由于麻将的规则各不相同,也请读者自己添加和修改。*
*     2. 其他与麻将类似的游戏,如[字牌](又称跑胡子、 *
*     二七十)等牌类游戏,也可采用类似的判断函数。 *
* 环 境: VC 6.0, 但符合ANSI C标准,随便移植 ^_^ *
* 作 者:shyworm(怕怕虫) *
* E_Mail: shyworm@sina.com *
***************************************************************/
#include <stdio.h>
int Hu(int PAI[38]);
int Remain(int PAI[38]);
int main()
{
// 把一副牌放在下面的数组里,可以任意填入数字来测试函数正确与否。
// 为了方便,PAI[0],PAI[10],PAI[20],PAI[30]都弃之不用,并且必须
// 置为0,千万注意!
int PAI[38] = { 0,
1,1,1,0,1,1,1,0,0, // PAI[ 1- 9] 壹万~玖万的个数
0,
0,0,0,0,0,3,0,0,0, // PAI[11-19] 壹铜~玖铜的个数
0,
0,0,0,0,0,0,0,0,0, // PAI[21-29] 壹条~玖条的个数
0,
0,1,1,1,0,0,0 // PAI[31-37] 东南西北中发白的个数
};
// 请务必先排除“七对” 和“十三幺”,由于简单,所以不提供了
// if( QIDUI(PAI) )...
// if( SHISANYAO(PAI) )...
if( Hu(PAI) )
printf("哈!我和啦!/n");
else
printf("哎,和不成!/n");
return 1;
}
// 判断和牌的递归函数,不考虑“七对” 和“十三幺”。因为如果
// 把“七对” 和“十三幺”的判断放在递归函数里,将得不偿失。
int Hu(int PAI[38])
{
static int JIANG = 0; // 将牌标志,即牌型“三三三三二”中的“二”
if( !Remain(PAI) ) return 1; // 递归退出条件:如果没有剩牌,则和牌返回。
for(int i=1;!PAI&amp;&amp;i<38;i++); // 找到有牌的地方,i就是当前牌, PAI是个数
printf("i = %d/n",i); // 跟踪信息
// 4张组合(杠子)
if ( PAI == 4 ) // 如果当前牌数等于4张
{
PAI = 0; // 除开全部4张牌
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI = 4; // 否则,取消4张组合
}
// 3张组合(大对)
if ( PAI >= 3 ) // 如果当前牌不少于3张
{
PAI -= 3; // 减去3张牌
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI += 3; // 取消3张组合
}
// 2张组合(将牌)
if ( !JIANG &amp;&amp; PAI >= 2 ) // 如果之前没有将牌,且当前牌不少于2张
{
JIANG = 1; // 设置将牌标志
PAI -= 2; // 减去2张牌
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI += 2; // 取消2张组合
JIANG = 0; // 清除将牌标志
}

if ( i > 30 ) return 0; // “东南西北中发白”没有顺牌组合,不和
// 顺牌组合,注意是从前往后组合!
if( i%10 != 8 &amp;&amp; i%10 != 9 &amp;&amp; // 排除数值为8和9的牌
PAI[i+1] &amp;&amp; PAI[i+2] ) // 如果后面有连续两张牌
{
PAI--;
PAI[i+1]--;
PAI[i+2]--; // 各牌数减1
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI++;
PAI[i+1]++;
PAI[i+2]++; // 恢复各牌数
}
// 无法全部组合,不和!
return 0;
}
// 检查剩余牌数
int Remain(int PAI[38])
{
int sum = 0;
for(int i=1;i<38;i++)
sum += PAI;
return sum;
}
 
不要字牌,只要基本胡,举例如
三个1万,2至8万,三个9万
可以胡
1至9万
谢谢以上给位
huasoft的算法我正在看
继续!!!
 
收藏~~~~~~~~~~
 
呵呵,做不出来干脆把它包给我做,包你满意
 
似乎在
for(int i=1;!PAI&amp;&amp;i<38;i++); // 找到有牌的地方,i就是当前牌, PAI是个数
循环里少了对括号
 
把胡牌规则全算上,符合就胡牌了。比如要一对打头,还必须是二,五,八(据说长沙打法,害我起牌就天胡了一把,没二,没五没八)
 
整个明星三缺一,有台湾和广东麻将的台数算法
 
麻将偶不会玩的说
 
SmallGhost 包给你做多少钱?
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部