ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 16190|回复: 45

[原创] 纸牌游戏十点半之Excel版

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-30 23:51 | 显示全部楼层 |阅读模式
本帖最后由 aoe1981 于 2014-9-3 21:57 编辑

  前一段与同事聚会,席间玩起了十点半的游戏,输者喝酒,颇为有趣。
  后来思量,所以有趣者,与同事聚而乐为其一,游戏规则之妙为二,独不为酒乎……晕乎乎胀肚!
  一日,突发奇想,想用Excel实现该游戏规则及过程,起初感觉应当可行,而且似乎很有思路,很是激动了许久,哪怕是没做一丁点,空有想法时。
  由于工作的繁忙,断断续续,忙里偷闲,至今日,算是实现了想像中的80%吧。由于太过复杂,比起初想像中的复杂了多倍,也有点撑不到发布想像中的完美版的时候了,便先发一个可以完整运行的初始版1.0,图谋歇一段后再奋斗!
  图如下:
   1.jpg
  附件如下:
   十点半(1.0).rar (68.83 KB, 下载次数: 128) (此版本为早期过渡,请下载41楼附件)



  成熟版2.0见25楼:
  http://club.excelhome.net/forum. ... 1149032&pid=7833851
  25楼2.0版附件可算是完成了想像中的95%,只剩下规则16的小问题没有解决,已经完全可模拟十点半的游戏过程了……

  终结版3.0见41楼:
  http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1149032&pid=7835711
  该附件实现了我想像中的100%,也即符合所有3楼列出的规则!!!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-30 23:52 | 显示全部楼层
附件为2003版,但是用2010编写的……没有在2003中试运行过,在2010中是完全正常的……

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-30 23:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 aoe1981 于 2014-8-31 00:15 编辑

关于纸牌游戏十点半的游戏规则:
1.一人随机洗牌,按序发牌,若干人参与竞赛;
                                                                                                                                                               
2.每人1张底牌,根据现有牌面点数情况决定是否继续要牌;
                                                                                                                                                               
3.A的点数为1,2到10的点数分别为2到10,花牌、大王、二王均为半点;
                                                                                                                                                               
4.点数和为10.5时胜出,点数和小于等于10.5且牌数达到最多牌数5张时,亦胜出,此时本地称为“五龙”;                                                                                                                                                               
5.点数和小于等于7点时,玩家必须要牌;
                                                                                                                                                               
6.点数和为7.5、8、8.5、9、9.5、10时玩家视情况做出是否继续要牌的选择;  
                                                                                                                                                              
7.本附件的十点半游戏中,除庄家可自主判断外,其余玩家统一遇到7.5、8、8.5时要牌,9、9.5、10时不要牌;                                                                                                                                                               
8.要牌后分为四种情况:继续要牌、不要牌、憋破、胜出;
                                                                                                                                                               
9.憋破(即超出10.5)后翻牌并且立即喝酒2个,继续拿底牌、要牌,重复8;胜出后不再参与接下来的比赛;                                                                                                                                                               
10.所有玩家都不要牌时(胜出的除外),进入摊牌比拼;
                                                                                                                                                               
11.胜出一个玩家,摊牌酒加2,所有胜出玩家的酒叠加后再加2(初始酒数),由最后的输家一个人喝完;                                                                                                                                                               
12.摊牌后的大小比较原则为:比点数、比张数、比花色;
                                                                                                                                                               
13.点数最少的只有一家时,点数少的输;点数最少且相同的有多家时,牌的张数最少的输;
                                                                                                                                                               
14.点数最少且相同、牌的张数最少且相同的有多家时,视牌的花色决定大小输赢;
                                                                                                                                                               
15.花色大小为:大王>二王>桃>红>梅>方,同色点数最大的为大,比如桃10除双王外最大,有此可在摊牌时决胜;                                                                                                                                                               
16.摊牌后若剩余牌数还至少够发牌一轮的,应当继续发牌,直至牌发完或不够新一轮底牌时结束。                                                                                                                                                        



TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-30 23:57 | 显示全部楼层
1楼初始版1.0的缺陷是没有实现上楼规则7的前半部分“庄家自主判断”与规则16,这也是后续努力方向!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 00:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
摊牌后大小比较:
1.比点数;
2.比牌数;
3.比花色。
上述三种比较应该涵盖了各种复杂的牌面组合情况,从而使最终结果唯一,且始终保证最终的输家只为一个,但是这个似乎难以证明,也没有遍历过……

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 00:02 | 显示全部楼层
由于纸牌的随机性,以及部分组合出现的概率问题,初始版1.0的可靠性还有待于进行大量的游戏试验,这单靠我一个人是办不到的……
由于代码中过程众多,彼此牵扯、引用,在测试上是很繁琐的,渴望得到大家的帮助!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 00:05 | 显示全部楼层
5楼的比较中,比花色是最复杂的……
大王>二王>桃>红>梅>方
桃10>桃9>……>桃A>桃JQK
桃JQK>红10>……
……
以此类推,须拿出最大单张花色值与他人比较,最小者为最终输家。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 00:06 | 显示全部楼层
关于比花色是如何实现的呢?
采用了数值化的方法:
  1. Public Function huasezhi(pm$, m%, h%) '花色值计算自定义函数
  2. Select Case Mid(pm, 1, 1)
  3.     Case Is = "王"
  4.         If Mid(pm, 1, 2) = "王1" Then
  5.             huasezhi = wj(m)(h, 5) * 10 ^ 10
  6.         ElseIf Mid(pm, 1, 2) = "王2" Then
  7.             huasezhi = wj(m)(h, 5) * 10 ^ 9
  8.         End If
  9.     Case Is = "桃"
  10.         huasezhi = wj(m)(h, 5) * 10 ^ 8
  11.     Case Is = "红"
  12.         huasezhi = wj(m)(h, 5) * 10 ^ 6
  13.     Case Is = "梅"
  14.         huasezhi = wj(m)(h, 5) * 10 ^ 4
  15.     Case Is = "方"
  16.         huasezhi = wj(m)(h, 5) * 10 ^ 2
  17. End Select
  18. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 00:08 | 显示全部楼层
关于随机乱序洗牌是如何实现的呢?
  1. Public Sub xp() ' 洗牌
  2. Dim i%, j%, k%, l!, r%, t(1 To 1, 1 To 5)
  3. k = 0
  4. zp1 = 说明.Range("a1:d14").Value
  5. ReDim zp2(1 To 54, 1 To 5)
  6. For j = 1 To 4
  7.     l = 0
  8.     For i = 2 To 14
  9.         k = k + 1
  10.         zp2(k, 1) = k '序号
  11.         zp2(k, 2) = zp1(i, j) '牌面
  12.         zp2(k, 3) = i + 2 '行号
  13.         zp2(k, 4) = j + 11 '列号
  14.         If i < 12 Then l = l + 1 Else l = 0.5
  15.         zp2(k, 5) = l '点数
  16.     Next i
  17. Next j
  18. zp2(53, 1) = 53: zp2(53, 2) = "王1": zp2(53, 3) = 3: zp2(53, 4) = 13: zp2(53, 5) = 0.5
  19. zp2(54, 1) = 54: zp2(54, 2) = "王2": zp2(54, 3) = 3: zp2(54, 4) = 14: zp2(54, 5) = 0.5
  20. Randomize
  21. For i = 1 To 54  '香川【经典数组洗牌法】之多维应用
  22.     r = Int(Rnd() * (54 - i + 1)) + i
  23.     For j = 1 To 5
  24.     t(1, j) = zp2(r, j): zp2(r, j) = zp2(i, j): zp2(i, j) = t(1, j)
  25.     Next j
  26. Next i
  27. ancx = 1
  28. MsgBox "随机乱序洗牌完毕,可以发牌!", , "友情提示"
  29. End Sub
复制代码
对,来自于尊敬的香川大侠!!!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-31 00:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
建议大家测试时选择玩家数为5时比较方便,因为消息框总是出现在中间,会挡住玩家单元格信息的……
这也是我发下帖的原因:
http://club.excelhome.net/thread-1148863-1-1.html
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 06:40 , Processed in 0.037527 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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