平衡模拟器
bjsim 让脚本机器人打成千上万局和整轮游戏,用来测量庄家优势、每条混沌规则的影响、道具价值、商店定价和一轮的长度。它在独立的仓库里(black-jack-sim):游戏从不 import 它,它也从不修改游戏。实测结果见平衡数据页。
怎么保证结果可信
- 只有一个接口。 只有模拟器的
bjsim/adapter.py会 import 游戏。游戏接口变了,只改这一个文件。 - 只用可见信息。 机器人只能看到玩家能看到的东西,有两个写明的例外:信息类道具刚揭示的牌,以及定价实验里改写的商店价格。
- 不产生费用。 混沌 AI 始终是脚本替身,从不调用真实模型。
- 可复现。 同一个种子得到同样的结果,与并行进程数无关。默认模拟游戏随附的默认平衡数值,而不是你本地数据库里的值。
运行
需要 Python 3.10+,不需要额外的包。在 black-jack-sim/ 里运行,旁边要有游戏仓库。
| 命令 | 用法 |
|---|---|
career | python -m bjsim career --policy mixed --careers 200 --length 40 [run options] |
check | python -m bjsim check [--bands bands.json] regression gate (exit 1 if out of band) |
edge | python -m bjsim edge [--rules all|none|<name>,...] EV per chaos rule |
items | python -m bjsim items [--rules none,...] [--items ...] EV gain per item use |
runs | python -m bjsim runs [--chaos off|stub|mix|<rule>] [--bet pct25] [--shop never] [--prices game] |
sweep | python -m bjsim sweep --param prices --values game,scaled:3,scaled:5 [run options] |
upgrades | python -m bjsim upgrades [run options] value and payback of every meta upgrade |
通用选项:--profile NAME(模拟游戏数据库里的某个平衡配置)、--rounds N、--runs N、--seed N、--jobs N(进程数,不影响结果)、--out FILE(.md 或 .json)。
| 选项 | 可选值 |
|---|---|
--chaos | off, stub, mix, mix:a+b, modify_card_value-1, modify_card_value+1, reverse_bust, great_crash, odd_even_chaos, suit_power, fragile_bust, tiebreaker_dealer, tiebreaker_player |
--bet | flat10, pct10, pct25, max, pct25_max_with_item |
--shop | never, eager, value |
--prices | game, fixed:<factor>, scaled:<pct> |
--chaos stub是游戏自带的离线混沌 AI,行为由平衡配置决定;mix从所有规则里均匀抽取。--shop eager有用的都买(保留一点余钱);--shop value只在押最大注值得时买一件。--prices fixed:<倍数>把游戏价格乘以倍数;scaled:<百分比>让偷看的价格等于资金的这个比例,其他道具按比例换算。upgrades用相同牌局比较升级等级,报告胜率、每轮代币的变化及代币回本轮数。career模拟连续多轮和局外购买,使用--policy none|permanent|consumable|mixed、--careers N和--length N;用逗号分隔多个策略可在一份报告中比较。
机器人
机器人按经典基本策略打(不分牌),规则改变爆牌线时会相应调整,但不会针对混沌规则做其他变通。所以混沌规则下的结果是"普通玩家"视角:会利用规则的玩家表现更好。
回归区间
模拟器维护一份关键指标及允许范围的清单(bands.json)。python -m bjsim check 会测量它们;某个值超出区间,说明游戏改动影响了平衡。如果这是有意为之,就在同一次改动里重新测量并更新区间。
本次报告有超出回归区间的测量,下表保留原始结果;调整区间属于独立的模拟器仓库。离线替身指标名称仍描述过去仅修改点数的场景,而当前配置按权重混合抽取规则,也包含平静局。
python -m bjsim check · 种子 1 · 平衡配置 default@b574fce2d1a5 · 游戏 108b5e1 · 模拟器 d11d84e · Balance bands
| 指标 | 样本 | 实测值 | 允许区间 | 在区间内 |
|---|---|---|---|---|
| EV, no chaos | 50000 局 | +0.0000 | [-0.020, +0.020] | 是 |
| EV, offline stub chaos (values -1) | 50000 局 | -0.0239 | [-0.120, -0.075] | 否 |
| EV, uniform mix of all rules | 50000 局 | -0.0117 | [-0.015, +0.025] | 是 |
| EV with one peek per hand | 50000 局 | +0.1309 | [+0.110, +0.150] | 是 |
| Win rate, no chaos, bet 25% | 2000 轮 | +0.2570 | [+0.165, +0.235] | 否 |
| Win rate, offline stub chaos, bet 25% | 2000 轮 | +0.2340 | [+0.075, +0.130] | 否 |
百科怎么用它
每次运行 python -m wiki sync,百科都会用模拟器 main 的干净 checkout,对游戏 main 的干净 checkout 跑一遍模拟,并把结果存为事实。两边的提交都没变时直接复用结果,所以本百科上的数值总会注明来自哪个游戏提交和哪个模拟器提交。