Crosstar嵌入式学院嵌入式学堂“麻将清一色胡牌算法流程图”

maggie2528 2009-07-25 11:07:36
Crosstar嵌入式学院的项目开发包含了一个在移动设备上进行联网麻将的网络游戏,为了让学员能够顺利开发,麻将胡牌算法这一部分功能作为作业提前进行了布置。
暂时不考虑复杂的复杂的国际标准和地方标准,只考虑推倒胡的情况,并且在开始的时候我们只考虑牌色为清一色的情况(如果能够判断清一色胡牌情况,其他情况相对就容易解决了),清一色胡牌的算法流程图如下所示:



其中,比较复杂的是判断是否常规胡牌,常规胡牌的基本规则是牌必须符合“23333”的牌型,因此,可以先循环拿出一对将牌(如果连将牌都拿不出来则明显不可能胡牌),然后再在剩下的12张已经排列好的牌中(例如输入12345666677789这14张牌,排列好的Num[1-9]的值应分别是111114311),循环看能否拿出顺子(三张连牌,如123),如果拿不出顺子,则拿刻子(三张一样的牌,如666),每拿出三张牌需要递归判断剩下的牌能否顺利组合;需要注意的是,拿出顺子后进行递归,如果不成立,则还需要尝试拿刻子后进行递归。也就是说,不管能不能拿出顺子,都需要进行拿刻子的尝试。
就拿以上的牌型12345666677789来说,算法首先拿出一对将66,拿出123、456之后,接着拿出678,剩下779,或者拿出789,剩下677都不能组合成立,因此66做将失败,下一次循环的时候将拿77做将。
77做将时,算法首先拿出拿出123、456之后,注意,剩下666789,这时候虽然能拿678出来,剩下的669明显不能胡牌,因此还需要尝试拿刻子666出来,拿出666后,剩下789能够组合成顺子,则可以胡牌。

总之,在判断能否拿三张牌出来时,首先要尝试拿顺子看能否胡牌,如果不能胡牌,还需要判断当前牌是否为三张刻子,如果是,则需要拿出来,继续递归判断;只有既不是顺子,当前牌也不是三张的时候,才能够直接判断不能胡牌。只拿顺子,在顺子递归不成立的时候就直接判断不能胡牌是不符合逻辑的。
检查是否常规胡牌的函数算法流程图如下:
(函数返回0表示不能胡牌,返回1表示能胡牌,返回2表示杠牌)



需要注意的是,编写C语言递归调用程序时,如果递归进去的参数数据已经改变,例如拿顺子判断不能胡牌,需要拿刻子来判断,需要恢复数组到原来的状态;另外,拿将不成立重新循环前也需要把数组恢复到原来的状态。
当然在程序中,也可以定义静态数组,来保存胡牌数据。
需要代码的请发邮件至:wangyuzhu@crosstar.com.cn。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/maggie2528/archive/2009/07/25/4378964.aspx
...全文
1440 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_qing 2011-10-24
  • 打赏
  • 举报
回复
2个循环
1.取对,取不出队则看当前最大番数选择胡或者继续打。取出一队后进入2
2.取顺,无顺取刻,无牌取则宣布此组合失败。 如果取完牌说明可以胡,计算本组合番数,同时要特殊判断3连刻


wojiushi3344 2011-09-29
  • 打赏
  • 举报
回复
我觉得你写得有点复杂。。。清一色其实是做好判断是否胡牌的。首先胡牌等满足几个条件,第一牌的张数必须是 x%3=2 第二 胡牌不管你胡什么最后拆开完了都必须剩下2张牌,并且这2张牌是相等的。这2个条件就可以做递归的出口条件。 然后判断是否有刻子牌,有则递归。 然后再判断是否有顺子牌,有则递归。后面就和你说的一样了。。。
lanlanwangzi 2011-04-01
  • 打赏
  • 举报
回复
看不到图。
fenglingxiaowu 2009-12-15
  • 打赏
  • 举报
回复
学习了~~~
a452325305 2009-11-29
  • 打赏
  • 举报
回复
学习下 不过LZ的结贴率有点低
lidake 2009-11-28
  • 打赏
  • 举报
回复
学习了!
bindian 2009-08-06
  • 打赏
  • 举报
回复
学习了

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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