Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

esrrhs/texas_algorithm

Repository files navigation

德州扑克算法

用于带鬼牌的德州扑克的算法,目前支持两张鬼,包括以下功能

  • 查表算法(内存占用十几M)
  • 评估算法(内存占用300M)

使用

<dependency>
    <groupId>com.github.esrrhs</groupId>
    <artifactId>texas_algorithm</artifactId>
    <version>1.0.12</version>
</dependency>
// 获取2张手牌5张公牌的最大的5张牌
TexasAlgorithmUtil.getMax("黑2,黑3", "方2,方A,黑7,黑5,鬼");
// 获取7张牌的大小,用于比牌
int win = TexasAlgorithmUtil.getWinPosition("方4,方A,鬼,黑A,黑3,黑5,黑6");
// 获取2张手牌4张公牌的胜率,用于评估
float p = TexasAlgorithmUtil.getHandProbability("方3,鬼", "黑2,黑4,黑5,黑K");

测试玩玩

  • 解压texas_algorithm.rar到当前文件夹
  • 运行TestUtil.Main

生成表玩玩

  • 解压texas_algorithm.rar到当前文件夹
  • 运行TexasAlgorithmUtil.Main,需要添加vm参数-Xmx8000m

查表算法

查表算法,给定任意7张牌(5张和6张也支持),查表给出5张最大牌的牌面以及大小、胜率、类型。查表方法很简单,下面讲一下生成表的算法。

算法实现

穷举C(52, 7)的组合

52张牌再加2张鬼牌里面选7张,一共有1亿多种组合,对7张牌进行编码变成long类型,得到一个1亿长度的数组。

  • 给定6张和5张,也是同理生成

多线程快速排序

对这1亿长度的数组进行从小到大排序,排序依据就是7选5后的大小。使用多线程快速排序,在8核的机器上,排完大概需要10小时。

  • 如果把最终的查表算法替换原始的比牌算法,速度可以缩短到2小时。

结果输出

数组已经排好序,现在按照顺序输出到一个文件,内容有key、大小顺序、max牌的值、max牌的类型、可阅读的牌面信息。最后文件大小差不多12G。

  • 注意到大小其实是阶梯状的,就是有很多牌是一样大,但是先后顺序不同,所以在输出的时候,要再做一下比牌处理。

结果去色

1亿条数据如果直接用,内存会爆,使用去色算法缩减规模。分为有花色和无花色两个文件,最后文件总大小18M。实际加载到内存占用几十M。

  • 对于同花的类型,比如同花、同花顺、皇家同花顺,7张牌的分布肯定是比如红红红红红梅黑,就是至少5张牌是同花色的,于是可以转变花色成为方方方方方黑黑,节省key值
  • 对于非同花的类型,花色毫无作用,那么只需要把花色全去掉,变成方方方方方方方即可

查询方法

给定7张牌,先去同花表里查,如果没有就去非同花表里查,两个都有就谁大选谁。

评估算法

评估算法,给定2张手牌,0-4张公牌,大致估算出这手牌在1v1情况下的胜率。

算法实现

胜率计算

注意到前面已经生成了7张牌的大小顺序了,那么现在给定N张牌(2<=N<=6),只需要去7张牌的集合里遍历,看包含这N张牌的7张牌的胜率,做一下平均值就是平均胜率。顺便还会生出最大胜率最小胜率。5个输出文件最终大小是2G。

结果去色

这个N张牌的胜率表同样存在重复的,采用类似的方法去掉花色,分为两张表,查询先查询原始表,没有再去查询去掉花色的表。通过这种方法,6个文件可以缩减到300M。实际加载到内存差不多200M。

公牌查询

把公牌代入上面计算的胜率表中,查询得到公牌的胜率情况,也就是说对方用这个公牌去组成7张牌的平均胜率记为P1,以及最大和最小胜率P1Max和P1Min。

手牌公牌查询

把我的手牌和公牌加起来,代入上面的胜率表中,查询得到一个平均胜率P2。注意这时候P2是不准确的,因为手牌被重复使用了。这里存在误差。

胜率预估

P1、P2都已经拿到,根据P1和P2的关系用P1Max和P1Min做下差值即可得出胜率。这里假定分布是均匀的所以也会有误差。

预估误差

如果采用最原始的方法穷举所有组合,即固定手牌和固定公牌,穷举剩下公牌和对方手牌,并计算胜率,目前2张手牌4张公牌需要20多天才能计算完,并且数据量已经超标。通过和实际胜率比较,误差大部分在0.1以内,比如实际胜率0.5,预估0.6。

其他

麻将算法 印度炸金花算法

About

texas algorithm 德州扑克算法

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
Morty Proxy This is a proxified and sanitized view of the page, visit original site.