麻将 听牌胡牌算法怎么写

fwoi05 2007-03-26 10:57:16
最普通的就行

就是14张牌 由刻子(AAA)或顺子(ABC)组成4对 在加一对的牌

主要是听牌不太会写 胡牌的代码有的话就更好了
...全文
2153 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_style 2007-03-27
  • 打赏
  • 举报
回复
哈哈哈哈。。
自己只会普通的胡牌。。
fwoi05 2007-03-27
  • 打赏
  • 举报
回复
哇 你在呀 ^_^


听牌是在发给我一张牌的时候 判断是否能听
好象不只是去掉一张啊(去掉一张之后 好象还要在加一张进行判断)
14张判断听牌 去掉其中一张能不能听(要判断去掉每一张能不能听) 13张不能判断胡啊 还要在加一张(这个好象每张都要判断吧 ) 这么判断?循环的次数会不会太多啊

jixingzhong 2007-03-27
  • 打赏
  • 举报
回复
ms 听牌可以参考胡牌的算法,
就是 胡牌 去掉一张 .....
fwoi05 2007-03-27
  • 打赏
  • 举报
回复
大哥 谢谢拉 这个好象不单单是14张牌的 好象17张的也可以啊 ^^

不过还想问一下听牌 能帮帮忙么?
gxl123 2007-03-27
  • 打赏
  • 举报
回复
不会麻将
jixingzhong 2007-03-26
  • 打赏
  • 举报
回复
也可以参看这里的代码:

http://topic.csdn.net/t/20060303/10/4590114.html
jixingzhong 2007-03-26
  • 打赏
  • 举报
回复
/***************************************************************
* 文件名:hu.cpp *
* *
* 功 能:演示一个简洁明了的递归函数——判断[麻将]的和牌。 *
* *
* 说 明: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[i]&&i<38;i++); // 找到有牌的地方,i就是当前牌, PAI[i]是个数

printf("i = %d\n",i); // 跟踪信息

// 4张组合(杠子)
if ( PAI[i] == 4 ) // 如果当前牌数等于4张
{
PAI[i] = 0; // 除开全部4张牌
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI[i] = 4; // 否则,取消4张组合
}

// 3张组合(大对)
if ( PAI[i] >= 3 ) // 如果当前牌不少于3张
{
PAI[i] -= 3; // 减去3张牌
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI[i] += 3; // 取消3张组合
}

// 2张组合(将牌)
if ( !JIANG && PAI[i] >= 2 ) // 如果之前没有将牌,且当前牌不少于2张
{
JIANG = 1; // 设置将牌标志
PAI[i] -= 2; // 减去2张牌
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI[i] += 2; // 取消2张组合
JIANG = 0; // 清除将牌标志
}


if ( i > 30 ) return 0; // “东南西北中发白”没有顺牌组合,不和

// 顺牌组合,注意是从前往后组合!
if( i%10 != 8 && i%10 != 9 && // 排除数值为8和9的牌
PAI[i+1] && PAI[i+2] ) // 如果后面有连续两张牌
{
PAI[i]--;
PAI[i+1]--;
PAI[i+2]--; // 各牌数减1
if( Hu(PAI) ) return 1; // 如果剩余的牌组合成功,和牌
PAI[i]++;
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[i];
return sum;
}
Red_angelX 2007-03-26
  • 打赏
  • 举报
回复
各地麻将规则不同地 就最简单的办法递归吧
snprintf 2007-03-26
  • 打赏
  • 举报
回复
AI

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧