ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 提苏米拉啦

[求助] Excel四川麻将题

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-13 22:55 | 显示全部楼层
不考虑7对胡牌的情形,任意4组3个牌+1对=14张牌胡的情形,

用VBA模拟产生随机两付胡牌,且没有冲突(超出4张牌)的代码及附件。

麻将胡牌.rar

14.71 KB, 下载次数: 38

点评

代码先收藏,认真看懂  发表于 2012-10-13 23:02
不过忘了四川麻将缺一门的规则了  发表于 2012-10-13 22:59

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-10-13 23:06 | 显示全部楼层
直接随机做牌+不超4张检查→超4张时重新来过。
  1. Sub kagawa()
  2.     pm = Array("条", "筒", "万")
  3.     pd = Array("一", "二", "三", "四", "五", "六", "七", "八", "九")
  4. Redo:
  5.     ReDim jg(13, 1) '存放2副胡牌结果的数组jg
  6.     ReDim jc(8, 2) '用来统计每种花色、牌点的牌的数量,检查不超过4张的数组jc
  7.     Randomize
  8.     For n = 0 To 1 '生成2副牌
  9.         k = 0
  10.         For i = 1 To 4 '生成4组3张的,共4*3=12张牌
  11.             m = Int(Rnd() * 3) '随机决定该组牌的牌型(条、筒、万)
  12.             
  13.             t1 = Int(Rnd() * 9) '随机抽取9张牌点中的一张
  14.             r = Int(Rnd() * 3) '随机3种做牌法,牌点比当前牌: 0→小、1→同、2→大
  15.             '下面做牌结果解释略。
  16.             If r = 0 Then
  17.                 If t1 = 0 Then
  18.                     If Rnd() < 0.5 Then
  19.                        t = Array(0, 0, 0)
  20.                     Else
  21.                        t = Array(0, 1, 2)
  22.                     End If
  23.                 Else
  24.                     If Rnd() < 0.5 Then
  25.                         If t1 = 1 Then
  26.                             t = Array(0, 1, 2)
  27.                         Else
  28.                             t = Array(t1 - 2, t1 - 1, t1)
  29.                         End If
  30.                     Else
  31.                         If t1 = 8 Then
  32.                             t = Array(6, 7, 8)
  33.                         Else
  34.                             t = Array(t1 - 1, t1, t1 + 1)
  35.                         End If
  36.                     End If
  37.                 End If
  38.             ElseIf r = 1 Then
  39.                 t = Array(t1, t1, t1)
  40.             Else
  41.                 If t1 = 8 Then
  42.                     If Rnd() > 0.5 Then
  43.                        t = Array(8, 8, 8)
  44.                     Else
  45.                        t = Array(6, 7, 8)
  46.                     End If
  47.                 Else
  48.                     If Rnd() > 0.5 Then
  49.                         If t1 = 7 Then
  50.                             t = Array(6, 7, 8)
  51.                         Else
  52.                             t = Array(t1, t1 + 1, t1 + 2)
  53.                         End If
  54.                     Else
  55.                         If t1 = 0 Then
  56.                             t = Array(0, 1, 2)
  57.                         Else
  58.                             t = Array(t1 - 1, t1, t1 + 1)
  59.                         End If
  60.                     End If
  61.                 End If
  62.             End If

  63.             '本组3张牌做牌结束后,转换为实际牌的名称并储存到jg数组中
  64.             For j = 0 To 2
  65.                 If jc(t(j), m) = 4 Then
  66. '                    [d1] = [d1] & "," & t(j) & m
  67.                     GoTo Redo '检查该色牌点张数,已超过4张时则回到代码起点重新来一次。
  68.                 Else
  69.                     jc(t(j), m) = jc(t(j), m) + 1 '该色牌点张数+1统计
  70.                 End If
  71.                 t2 = pd(t(j)) & pm(m)
  72.                 If t2 = "一条" Then t2 = "幺鸡"
  73.                 jg(k, n) = t2 '储存本组做牌结果
  74.                 k = k + 1
  75.             Next '继续下一组做牌直到完成4组
  76.         Next
  77.        '接下来做最后的1对牌。
  78.         t2 = pd(Int(Rnd() * 9)) & pm(Int(Rnd() * 3))
  79.         If t2 = "一条" Then t2 = "幺鸡"
  80.         jg(12, n) = t2: jg(13, n) = t2
  81.     Next
  82.    
  83. '    [b1].Resize(14, 2) = jg
  84.     [q2:s10] = jc
  85.     [b16:o17] = Application.Transpose(jg)
  86. End Sub
复制代码

点评

实在是佩服老师的功力。  发表于 2012-10-13 23:59

TA的精华主题

TA的得分主题

发表于 2012-10-13 23:19 | 显示全部楼层
呵呵,楼上代码有个小bug(虽然运行多次也还没有发现错误)

即没有对每一副牌的麻将头(2张相同牌)做数量统计和检查 → 理论上测试次数多了一定会有超4张错误发生。


……代码略作修改,并增加到同时产生4副胡牌,而不是仅仅2副胡牌。

呵呵。

麻将胡牌2.rar

14.79 KB, 下载次数: 19

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-10-13 23:21 | 显示全部楼层

如果

本帖最后由 香川群子 于 2012-10-13 23:33 编辑

虽然没有测试,但估计直接做牌法,要比一张一张地随机取牌生成两副不重复胡牌要容易的多。

如果模拟一张一张随机取牌,然后做牌、判断,再取牌做牌的话,
肯定有概率会生成7对,或者对对胡之类的……但估计7对的出现次数不会太多。



TA的精华主题

TA的得分主题

发表于 2012-10-13 23:31 | 显示全部楼层
经过多次测试,直接生成不重复的4副牌问题还不是太大 → (指的是代码Redo次数)

然而,如果想要一次性同时生成5副牌(理论上108张牌最多可以做成7副牌 108/14=7.71)
则做牌法无法成功 → Redo次数已经达到死循环的标准了。

…………
因此,如果需要一次性做成7副牌,肯定需要使用我的【字典+数组过滤 随机抽取法】了。


呵呵。

TA的精华主题

TA的得分主题

发表于 2012-10-13 23:34 | 显示全部楼层
delete_007 发表于 2012-10-12 08:41
就我的水平来说,函数做不出来。默默关注。。。

函数应该是难以胜任的……近似无解。

TA的精华主题

TA的得分主题

发表于 2012-10-13 23:35 | 显示全部楼层
hjj0451 发表于 2012-10-12 12:01
有好题并且自己有答案的话可以弄到竞赛题目征集区,让大伙拿拿技术分。

这个【题数米拉拉】楼主,就是个妄想狂……


出的都是些啥子题目哦。

点评

目前来看,我还不是出题的料,还是先静下来认真学习,不出什么题了,再次膜拜下老师的作品  发表于 2012-10-14 14:52

TA的精华主题

TA的得分主题

发表于 2012-10-14 06:02 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-10-14 14:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2012-10-13 23:19
呵呵,楼上代码有个小bug(虽然运行多次也还没有发现错误)

即没有对每一副牌的麻将头(2张相同牌)做数 ...

老师你做的是诈胡,要赔四翻的,四川麻将必须断门!

TA的精华主题

TA的得分主题

发表于 2012-10-14 14:44 | 显示全部楼层
云朵中的民族 发表于 2012-10-14 14:01
老师你做的是诈胡,要赔四翻的,四川麻将必须断门!

呵呵,四川麻将规则不是很懂。

满足缺一门应该不难,需要修改一下代码。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-13 19:42 , Processed in 0.048715 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表