一 今天无意之中看到两篇关于德州扑克计算玩家之间胜率的资讯
-
1.1 https://viegg.com/texas/cn.html
这个网址,是一个计算德州扑克玩家之间胜率的工具每次选择两张手牌,点击「手牌」按钮选定,可以添加二至多名玩家。然后选择 0~4 张公共牌。选完后点击计算按钮计算胜率。由于性能问题不能穷举时,电脑会最多选出 10000 种情况,然后根据结果算出胜率,计算结果与真实胜率存在约 1% 以内的误差。点击计算后大概几秒钟后会算出结果,请耐心等候。
-
1.2 一个感兴趣的尝试,计算德州扑克胜率
https://www.cnblogs.com/wengshuhang/p/12510803.html
这个网址,是关于德州扑克胜率算法的
二 下面的github地址,是个人使用Go语言开发的,计算各种牌类游戏[Blackjack,Baccarat,Texas holdem,Pot Limited Omaha-4,Pot Limited Omaha-5]胜率的项目,代码开源。
https://github.com/poker-x-studio/poker_odds
三 关于PLO-5计算胜率任务的代码中,今天有修改一个bug。所以,也分享一下,poker_odds 项目中关于两个玩家之间胜率的算法。
1 确认两个玩家手上的有5张牌[一共10张牌]
2 洗牌,分别删除掉两个玩家手中的5张牌,剩下的42张牌为底牌
3 选择前面的5张作为公共牌
4 玩家1手里的5张牌和5张公共牌组合,选择一个最佳牌型1[玩家手里拿2张,公共牌拿3张,组合后最大的5张牌型]
5 玩家2手里的5张牌和5张公共牌组合,选择一个最佳牌型2
6 比较最佳牌型1和最佳牌型2,算一次计算结果[可能的结果包含胜,平,负],保存下来
7 从流程1开始到流程6,重复1w次,最后得到每次比牌的结果列表,计算总的胜利次数,比率
代码中有这样一个结构体
// 相同值
type sameValue struct {
single_cnt int //单牌个数
pair_cnt int //对子个数
three_cnt int //三条个数
four_cnt int //四条个数
}
// AnalyseItem 分析项
type AnalyseItem struct {
cards []byte //牌
suit_cnts []int //花色统计
value_cnts []int //牌值统计
same_value sameValue //相同值
Card_types []CARD_TYPE.TYPE //牌型
compare_cards []byte //比较牌
weight int //权重,用于比较牌大小,任何一副牌都有一个权重
}
每一手5张的牌型,都使用这个 分析项 分析解构,比如 包含了多少种花色,多少种值,相同值,解构之后的比较牌[比较牌是专门为A出现的情况而设置的,当A出现在顺子Straight中,会有两种不同的情况,A最小或最大]情况。
比如,
- 当需要知道这一手牌是否是三条牌型[Three of kind]的时候,只需要查看 same_value.three_cnt 是否是1,same_value.single_cnt是否是2
- 当需要知道这一手牌是否是同花[Flush]牌型的时候,只需要查看 suit_cnts 是否只有一种花色
四 实际运行结果和对比
用于对比的网站地址:https://beastsofpoker.com/poker-odds-calculator/
这个在线工具可以计算德州扑克,奥马哈等牌类游戏的手牌之间的胜率
- 运行环境:vscode/windows
- 运行条件:
- 开启10个goroutine,每个goroutine循环1000次,也就是一共运行1万次[选择1万次的原因是计算时间刚好1秒,如果想要更加精确,可以加大循环次数]
每循环1次就是,牌靴中有1副牌[去掉大小鬼,每副牌52张]
同样的手牌,计算的结果存在一定的误差。
项目 | Win | Lose | Tie |
---|---|---|---|
https://beastsofpoker.com/poker-odds-calculator/ | 59.82% | 40.17% | 0.01% |
https://github.com/poker-x-studio/poker_odds | 58.62% | 41.10% | 0.28% |
--the end