百家乐大路图中的列分布情况统计

一 百家乐大路图中的列分布情况统计

  • 运行环境:vscode/windows
  • 运行条件:
  • 开启10个goroutine,每个goroutine循环100次,也就是一共运行1000次,每循环1次就是,牌靴中有8副牌[去掉大小鬼,每副牌52张]

简单归纳为:1000靴牌,每靴牌中有8副扑克,统计列分布

列节点数 列数/总列数 百分比 说明
1 16346/32446 50.3791% 总手数63868[去掉和局的情况]
2 8294/32446 25.5625
3 3963/32446 12.2141%
4 1993/32446 6.1425%
5 912/32446 2.8108%
6 504/32446 1.5534%
7 211/32446 0.6503%
8 122/32446 0.3760%
9 42/32446 0.1294%
10 27/32446 0.0832%
11 16/32446 0.0493%
12 6/32446 0.0185%
13 5/32446 0.0154%
14 2/32446 0.0062%
15 1/32446 0.0031%
16 2/32446 0.0062%
从结果来看,大致可以归纳为
1 一列中有一颗的情况,有1/2的情况发生
2 一列中有两颗的情况,有1/4的情况发生
3 一列中有三颗的情况,有1/8的情况发生
4 一列中有四颗的情况,有1/16的情况发生
5 一列中有五颗的情况,有1/32的情况发生
...
n 一列中有n颗的情况,有1/(n的2次方)的情况发生

--the end

Baccarat百家乐大路图显示

一 因为需要测试同一靴牌,在不同下注策略的时候,盈利结果如何,所以增加大路图显示,方便比对

  • 可选显示节点序号
  • 大路图上不包含Tie[因为在测试多种不同的下注额策略的时候,Tie基本上不作为下注选项]
  • 使用的svg包[https://github.com/ajstarks/svgo]
  • 有长龙,单跳,双跳 特殊形态的简单检测
  • 以积分10为基准,下注额策略为斐波那契策略
  • 实际结果和预测的押注区吻合,则打对勾,否则,则叉叉
  • 节点右上角为下注额

--the end

PLO-5 5张奥马哈中两个玩家手牌的胜率计算

一 今天无意之中看到两篇关于德州扑克计算玩家之间胜率的资讯

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

Baccarat百家乐中庄对闲对的概率

一 百家乐中,庄对闲对出现的概率,庄对和闲对的赔率是11:1

  • 运行环境:vscode/windows
  • 运行条件:
  • 开启10个goroutine,每个goroutine循环1000次,也就是一共运行1万次
    每循环1次就是,牌靴中有8副牌[去掉大小鬼,每副牌52张]

从结果来看

1 庄对和闲对概率基本一致
2 按概率6.35来算,15.7次才出现一次对子,假设每次下注额为1,下注16才可以押对一次,获得赔付金额12[包含下注额1],所以,下对子是明显的-EV

运行结果:

Baccarat,8副牌[8*52=416张],庄对闲对统计,总运行次数1w次

统计类别 出现次数 百分比 总手数
庄对 50765 6.30% 805779
闲对 51196 6.35%

二 网络上其他信息资讯

2.1 Baccarat Pair Bet

https://wizardofvegas.com/forum/questions-and-answers/math/35419-baccarat-pair-bet/

这个论坛里的帖子的回复,比较有意思。而且应该是对的,1/17。
我算出来的结果是1/16,和这个回复差一次的概率,很有可能是我运算的样本还不够多导致的误差。

MathCurious,

The probability of a Pair for the Player in one-deck baccarat is 1/17. Naturally, the probability for the Dealer is also 1/17.

You seem to be over-thinking the problem. Pretend the four cards are dealt face-down. Now we look at the Player's first card and see that it is an Ace. So what is the probability that the Player's second card is also an Ace? Well, right now the only information we have is that his first card is an Ace, so the other 51 cards contain 3 Aces, so the probability is 3/51 = 1/17.

Naturally, if the Player's first card is at other card, say a 4, then just like above the pair probability is 1/17.

Note that the Wizard's value of 78/1326 is equal to 1/17.

--the end

Baccarat百家乐中闲家/庄家点数概率分布

一 百家乐中,庄家和闲家因为补牌规则不同,导致点数的分布也不是均匀和相同的

  • 运行环境:vscode/windows
  • 运行条件:
  • 开启10个goroutine,每个goroutine循环1000次,也就是一共运行1万次
    每循环1次就是,牌靴中有8副牌[去掉大小鬼,每副牌52张]

从结果来看

1 闲家和庄家出现3的概率大致相同
2 庄家出现4,5的概率比闲家多
3 闲家出现0,1,2,6,7,8,9的概率比庄家多
4 庄家和闲家某一家中都是6,7,8,9出现的概率最多,4个点值相加的百分比基本上是50%

运行结果:

Baccarat,8副牌[8*52=416张],点数次数统计,总运行次数1w次

闲家点数 出现次数 百分比 总手数
0 75901 9.42% 806123
1 59721 7.41%
2 59952 7.44%
3 60278 7.48%
4 59643 7.40%
5 60464 7.50%
6 107392 13.32%
7 107987 13.40%
8 107258 13.31%
9 107527 13.34%

Baccarat,8副牌[8*52=416张],点数次数统计,总运行次数1w次

庄家点数 出现次数 百分比 总手数
0 71494 8.87% 806123
1 55995 6.95%
2 55501 6.88%
3 58516 7.26%
4 75231 9.33%
5 81077 10.06%
6 97617 12.11%
7 103665 12.86%
8 103138 12.79%
9 103889 12.89%

--the end

Blackjack中的庄家爆牌率计算

一 近期看Blackjack游戏比较多,所以,想知道当dealer明牌为某张时,爆牌的概率大体情况

  • 运行环境:vscode/windows
  • 运行条件:
  • 开启10个goroutine,每个goroutine循环10000次,也就是一共运行10万次
    每循环1次就是,牌靴中有4副牌[去掉大小鬼,每副牌52张],dealer明牌为指定的牌

从结果来看

1 dealer明牌为2,3,4,5,6时爆牌率逐渐提高
可以化简记忆为,依次递增2%:
明牌为2,35%爆牌率,
明牌为3,37%爆牌率,
明牌为4,39%爆牌率,
明牌为5,41%爆牌率,
明牌为6,43%爆牌率,

2 从7开始,爆牌率可以简化记忆为逐渐递减,也是2%
明牌为7,26%爆牌率,
明牌为8,24%爆牌率,
明牌为9,22%爆牌率,
明牌为10,J,Q,K,20%爆牌率,
明牌为A,10%爆牌率,

3 从7开始,可以简化理解为在底牌中出现10的概率大约为35%,
所以,
当明牌为7时,组成17的概率大约为35%,
当明牌为8时,组成18的概率大约为35%,
当明牌为9时,组成19的概率大约为35%,
当明牌为10,J,Q,K[在Blackjack中它们权重一样]时,组成20的概率大约为35%,
当明牌为A时,组成21的概率大约为35%,

运行结果:

Blackjack,4副牌[4*52=208张],dealer明牌为♦2,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 14080 14.08%
18 13525 13.53%
19 13048 13.05%
20 12321 12.32%
21 11810 11.81%
22 14988 14.99% 35.22%
23 6220 6.22%
24 5518 5.52%
25 4681 4.68%
26 3809 3.81%

Blackjack,4副牌[4*52=208张],dealer明牌为♦3,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 13395 13.40%
18 13175 13.18%
19 12622 12.62%
20 11932 11.93%
21 11535 11.54%
22 9646 9.65% 37.34%
23 14194 14.19%
24 5287 5.29%
25 4460 4.46%
26 3754 3.75%

Blackjack,4副牌[4*52=208张],dealer明牌为♦4,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 13051 13.05%
18 12493 12.49%
19 12053 12.05%
20 11706 11.71%
21 11092 11.09%
22 9604 9.60% 39.61%
23 8814 8.81%
24 13113 13.11%
25 4486 4.49%
26 3588 3.59%

Blackjack,4副牌[4*52=208张],dealer明牌为♦5,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 12060 12.06%
18 12282 12.28%
19 11925 11.92%
20 11230 11.23%
21 10865 10.87%
22 9374 9.37% 41.64%
23 8481 8.48%
24 7884 7.88%
25 12296 12.30%
26 3603 3.60%

Blackjack,4副牌[4*52=208张],dealer明牌为♦6,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 16433 16.43%
18 10605 10.61%
19 10739 10.74%
20 10221 10.22%
21 9754 9.75%
22 8676 8.68% 42.25%
23 8122 8.12%
24 7334 7.33%
25 6869 6.87%
26 11247 11.25%

Blackjack,4副牌[4*52=208张],dealer明牌为♦7,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 37073 37.07%
18 13765 13.76%
19 7774 7.77%
20 7897 7.90%
21 7345 7.34%
22 6493 6.49% 26.15%
23 5829 5.83%
24 5163 5.16%
25 4655 4.66%
26 4006 4.01%

Blackjack,4副牌[4*52=208张],dealer明牌为♦8,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 12997 13.00%
18 36034 36.03%
19 12830 12.83%
20 6834 6.83%
21 7020 7.02%
22 5981 5.98% 24.29%
23 5570 5.57%
24 4819 4.82%
25 4283 4.28%
26 3632 3.63%

Blackjack,4副牌[4*52=208张],dealer明牌为♦9,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 11934 11.93%
18 11922 11.92%
19 35246 35.25%
20 11901 11.90%
21 6170 6.17%
22 5660 5.66% 22.83%
23 5058 5.06%
24 4534 4.53%
25 4080 4.08%
26 3495 3.50%

Blackjack,4副牌[4*52=208张],dealer明牌为♦T,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 11146 11.15%
18 11242 11.24%
19 11150 11.15%
20 34278 34.28%
21 11245 11.24%
22 5084 5.08% 20.94%
23 4698 4.70%
24 4313 4.31%
25 3666 3.67%
26 3178 3.18%

Blackjack,4副牌[4*52=208张],dealer明牌为♦J,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 11205 11.21%
18 11132 11.13%
19 11190 11.19%
20 33963 33.96%
21 11192 11.19%
22 5175 5.17% 21.32%
23 4848 4.85%
24 4242 4.24%
25 3799 3.80%
26 3254 3.25%

Blackjack,4副牌[4*52=208张],dealer明牌为♦Q,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 11286 11.29%
18 11051 11.05%
19 11270 11.27%
20 34145 34.14%
21 11131 11.13%
22 5132 5.13% 21.12%
23 4702 4.70%
24 4327 4.33%
25 3790 3.79%
26 3166 3.17%

Blackjack,4副牌[4*52=208张],dealer明牌为♦K,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 11314 11.31%
18 11237 11.24%
19 11073 11.07%
20 34093 34.09%
21 11107 11.11%
22 5233 5.23% 21.18%
23 4649 4.65%
24 4246 4.25%
25 3781 3.78%
26 3267 3.27%

Blackjack,4副牌[4*52=208张],dealer明牌为♦A,总运行次数10w次

dealer停牌时点数 出现次数 百分比 爆牌率
17 12948 12.95%
18 13041 13.04%
19 13026 13.03%
20 13172 13.17%
21 36280 36.28%
22 3197 3.20% 11.53%
23 2765 2.77%
24 2237 2.24%
25 1839 1.84%
26 1495 1.49%

--the end

Go项目,传递bool类型的命令行参数(flag)时需要留意的

一 这里命令行参数解析使用的是第三方包 go-flags

github地址 https://github.com/jessevdk/go-flags

在README.md文件中,有部分关于bool类型的说明

var opts struct {
    // Slice of bool will append 'true' each time the option
    // is encountered (can be set multiple times, like -vvv)
    Verbose []bool `short:"v" long:"verbose" description:"Show verbose debug information"`
}

This specifies one option with a short name -v and a long name --verbose. When either -v or --verbose is found on the command line, a 'true' value will be appended to the Verbose field. e.g. when specifying -vvv, the resulting value of Verbose will be {[true, true, true]}.

【只要在命令行中找到 -v 或--verbose,那么,参数对应的值就是 true】

【如果需要设置false,则 去掉 -v 或--verbose 就好】

// Make some fake arguments to parse.
args := []string{
    "-vv",
}

fmt.Printf("Verbosity: %v\n", opts.Verbose)

// Output: Verbosity: [true true]

二 在 vscode中的具体使用

  • launch.json 中设置
    "configurations": [
        {
            "name": "lobby_server",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${workspaceFolder}/cmd/lobby_server",
            "args": [
                "--debug",//bool flag只要设置 short或long,值就是true
                "--lobby_config_file","lobby_8101.toml",
            ]
        },

main.go 文件

import(
"github.com/jessevdk/go-flags"
)

// 命令行参数
type CmdParams struct {
    Debug             bool   `short:"d" long:"debug" description:"是否debug"`
    Lobby_config_file string `short:"l" long:"lobby_config_file" description:"大厅配置文件"`
}

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    //解析参数
    var cmd_params CmdParams
    if _, err := flags.Parse(&cmd_params); err != nil {
        panic("Parse err:" + err.Error())
    }

    if !cmd_params.Debug {
        xdebug.Set_release()
    }

    //...
}

三 调试跟踪代码

具体可详细查看 函数 parseOption

func (p *Parser) parseOption(s *parseState, name string, option *Option, canarg bool, argument *string) (err error) {
    if !option.canArgument() {//bool类型 不能带参数
        if argument != nil {
            return newErrorf(ErrNoArgumentForBool, "bool flag `%s' cannot have an argument", option)
        }

        err = option.set(nil)
    } else if argument != nil || (canarg && !s.eof()) {
    //...
    }
    //....
}   

func (option *Option) canArgument() bool {
    if u := option.isUnmarshaler(); u != nil {
        return true
    }

    return !option.isBool()
}

//运行参数是否是bool类型
func (option *Option) isBool() bool {
    tp := option.value.Type()

    for {
        switch tp.Kind() {
        case reflect.Slice, reflect.Ptr:
            tp = tp.Elem()
        case reflect.Bool:
            return true
        case reflect.Func:
            return tp.NumIn() == 0
        default:
            return false
        }
    }
}

--the end

总结一下,2023.4月-2023.8月,业余时间整理的telegram游戏机器人

Telegram官网: https://telegram.org/
Telegram bot api: https://core.telegram.org/bots/api

在一个Go工作区[workspace]中,建立了4个项目[其实有5个,只有4个和telegram机器人相关]

一 telegram机器人-游戏百家乐[端口8001]

描述
开发语言 Go
IDE VSCode
技术栈 echo框架,mysql,gorm,logrus
展现端 telegram前端

功能:

  • 每次结果由加密货币trx交易hash值,按固定规则,提取最多6张牌,按百家乐规则补牌
  • 玩家可以押注庄,闲,对子,和等
  • 游戏中有三种角色:闲家,庄家,平台
    • 闲家:获得盈利的方式是压注和返水
    • 庄家:按不同组合定式赔率进行赔付,负责闲家返水
    • 平台:无论是庄家还是闲家,赢了就扣除千分之五[可配置]服务费
  • 充值货币当前支持usdt-trc20,usdt-erc20
  • 机器人测试telegram群:

二 telegram机器人-游戏骰子快三[端口8002]

描述
开发语言 Go
IDE VSCode
技术栈 echo框架,mysql,gorm,logrus
展现端 telegram前端

功能:

  • 每次结果由加密货币trx交易hash值,按固定规则,提取三颗骰子
  • 玩家可以押注骰子的一颗[单骰],两颗[对子],三颗[豹子],三颗和值[大,小,单,双,和值]等不同组合定式,对应不同的赔率
  • 游戏中有三种角色:闲家,庄家,平台
    • 闲家:获得盈利的方式是压注和返水
    • 庄家:按不同组合定式赔率进行赔付,负责闲家返水
    • 平台:无论是庄家还是闲家,赢了就扣除千分之五[可配置]服务费
  • 充值货币当前支持usdt-trc20,usdt-erc20
  • 机器人测试telegram群:

三 telegram机器人-ustd充值网关[端口8041]

描述
开发语言 Go
IDE VSCode
技术栈 echo框架,mysql,gorm,logrus
展现端 -
功能 接入第三方加密货币充值网关,充值usdt-trc20,usdt-erc20

四 telegram游戏管理后台[端口8081]

描述
开发语言 Go
IDE VSCode
技术栈 beego框架,mysql,orm,log,html模板
展现端 web
功能 分配后台用户和角色,查看对应游戏群的用户押注,收支明细等

五 下一步

  • 打算来开发一套在线小游戏平台,后端go,ubuntu部署,前端Javascript/Cocos Creator 2.4
  • 时间大概4个月的样子,业余时间开发,2024年初开始内部测试
  • 初期三人斗地主和德州扑克两个游戏
  • 发布形式有web[Web端]和apk[Android端]

--the end

借用gofox项目代码,整理了一个go管理后端

一 感谢 gofox 项目无私的贡献

技术栈 beego + layui + mysql
https://github.com/pzhen/gofox

二 我自己管理后端的界面

三 这两个月的业余时间,都在整理两个Go开发的telegram机器人游戏,一直缺少一个管理后端,可以直观展示游戏数据。找来找去,感觉gofox看起来比较简洁清晰。

这个管理后端的整理,对于beego的路由树也加深了一些认知。

--the end

百家乐Baccarat庄闲和胜率统计

一 开发了一个Go程序,来统计百家乐游戏中的庄闲和胜率情况。

  • 运行环境:vscode/ubuntu,32G内存
  • 运行条件:
  • 开启50个goroutine,每个goroutine循环10000次,也就是一共循环50万次
  • 每循环1次就是,牌靴中有8副牌的游戏流程[去掉大小鬼,每副牌52张]
  • 运行时间:2023-07-18 20:06:55
  • 运行时长:6:47(6分47秒)
  • 运行结果:

二 运行结果说明:

图表上的总运行次数代表的是,洗牌之后,每次下发闲家庄家的牌[闲家2张,庄家2张],并完成补牌整个流程,最终获胜的某个下注区域,这样的流程。

看起来,百家乐其实是游戏中,少有的庄闲对赌中,庄家没有占据大优势的游戏类别之一。

为方便记忆,可以简单取整,庄家 46%胜率,闲家45%胜率,和9%胜率。

三 可以参考:

维基百科中的 百家乐词条

https://zh.m.wikipedia.org/zh-cn/%E7%99%BE%E5%AE%B6%E6%A8%82

词条中庄胜率45.8597%,闲家胜率44.6247%,和胜率9.5156%

--the end