← 返回博客

·

炸金花发牌公平吗?别人能看到我的牌吗?闷牌的人能偷看吗?

每手先封牌,再由在座玩家的随机数决定发牌顺序;闷牌时你的牌不会发到你自己的设备,别人只在规则允许时才看得到。讲清证据怎么自己查,也说清目前做不到的事。

打炸金花时常有人问三件事:牌真的是随机发的吗?别人会不会偷看我的牌?说是闷牌的人,会不会其实早就看过自己的牌?下面按 BluffKing 当前线上的代码逐条回答,并说明你能亲自检查什么、哪些事目前做不到。

  • 随机:每手用一副完整的 52 张牌。服务器先把洗好的牌加密封住并公布一个“指纹”,再由本手在座真人玩家的浏览器各出一个随机数,一起决定封好的牌按什么顺序发。洗牌不读取会员、充值、房主身份或历史输赢。
  • 其他人看不到你的牌:同桌玩家、观众、房主和机器人,都拿不到你没亮出的牌。只有规则规定的几种情况才会公开,比如比牌双方互看、强制开牌。
  • 闷牌就是真没看:点“看牌”之前(且你还在局中、这手没结束),你的三张牌根本不会发到你的手机或浏览器上,连你自己的设备里都没有。别的闷牌玩家也一样。
  • 需要信任的部分:服务器要判断比牌谁大,所以牌局进行时服务器知道牌面。默认发牌虽然也把牌加密,但钥匙在服务器手里;炸金花目前没有德州那种把钥匙分给玩家的“高级加密”模式。

一、牌是怎么洗、怎么发的?

  1. 先封牌。每手开始前,服务器用系统提供的安全随机数洗好一副标准 52 张牌,把每张牌加密,然后公布这副封好的牌的“指纹”(承诺)。此后如果换牌,验证时就会对不上(能否发现事后换牌,取决于你当时用的浏览器是否还留着开局记录,见第六节)。
  2. 玩家出随机数,分两步交。本手每位真人玩家的浏览器自动生成一个随机数,先只交它的“指纹”;所有人都交完,才各自亮出随机数。谁也不能先看到别人的数,再改自己的。
  3. 大家的随机数决定发牌顺序。把锁牌指纹、所有玩家的随机数和本手编号放在一起算出一个顺序,决定“第几张封好的牌发给谁”,再按座位顺序每人连续发三张。
  4. 结束后可以验证。一手结束,参与这手的玩家可以拿到证明,在自己设备上检查:这副牌是一副不多不少的标准牌,发牌顺序确实由开局锁定的牌和大家的随机数算出,你看到的每张牌都对得上。

为什么谁都挑不了牌?服务器封牌时还不知道玩家的随机数,所以没法提前排出对某人有利的顺序;玩家交随机数时既不知道封好的牌是什么,也看不到别人的数,同样挑不了。只要有一位玩家的随机数是真随机的、按时交了上来,而且没有人交了指纹又扣着随机数不亮(这种情况见第六节),最后的发牌顺序就是随机的。

公开出来的数据也算不出牌。牌桌上公开的只有锁牌指纹和大家的随机数,用它们只能算出“第几张封好的牌发给谁”。封好的牌本身既不公开也没有发给任何玩家,所以算不出谁拿了什么。

二、为什么说对每个玩家都公平?

发牌时用到的只有:封好的牌、本手编号、本手的座位名单和玩家随机数。里面没有用户身份、会员等级、充值记录、筹码多少或谁最近输得多,所以不存在“照顾新人”“给充值玩家好牌”“让一直赢的人吐回来”这类步骤。

机器人也守同样的规则:它没看牌前同样不知道自己的牌,看牌后只用自己的三张牌和桌上公开的下注、比牌结果做判断,读不到别人的牌,也读不到牌堆。

随机不等于好运平均分。连着几把拿差牌、对面连出大牌,都可能发生。我们曾核对全部 11,397 手炸金花,豹子出现率与理论概率相符,见五把出了两把豹子的核查。

三、别人能看到我的牌吗?

服务器给每个人发桌面数据时,会按下面的规则逐人过滤,只发这个人此刻有权看到的牌:

  • 你自己:点了“看牌”之后;或者你已经弃牌、比牌输了出局;或者这手已经结束。
  • 和你比牌的那一位:比牌双方互相看到对方的三张牌,其他人看不到这次比牌的牌。
  • 全桌:打满轮数强制开牌时参与开牌的人、主动亮牌的赢家,以及房间开了喜钱时,独赢收喜钱的顺金或豹子。
  • 其他情况:同桌玩家、观众、房主、机器人都看不到。手牌记录也按同一规则显示,看不到的牌标为“未公开”。

别人能知道的是你有没有看过牌:座位上会显示“闷牌”或“已看牌”,因为看牌后跟注要付 2 倍。但别人看不到你看到的是什么牌。

还有两条与服务器无关的路要注意:有人控制了你的手机、浏览器或账号,就能看到你自己的牌;两位玩家私下互报牌面,也不需要任何外挂。怀疑有人串通,可以参考对手是不是作弊了里的自查和举报方法。

四、闷牌的人能偷看自己的牌吗?

不能。闷牌时,服务器发给你设备的桌面数据里,你自己的三张牌也是空的。不是“数据到了、界面先盖住”,而是牌面根本没有发到你的设备上,所以改界面、翻缓存都找不到。点“看牌”后,服务器才把你的三张牌发给你,同时全桌看到你变成“已看牌”,你之后跟注按 2 倍计算。

几个容易混淆的情况:

  • 闷牌比牌赢了:你仍算闷牌,自己的牌仍不会发给你;但和你比牌的那位输家能看到你的牌,这是比牌规则。
  • 闷牌弃牌或比牌输了:这时你已经出局,可以看到自己的牌,不会再影响这一手。
  • 机器人闷牌:同样不知道自己的牌,决策只用公开信息。

规则细节见炸金花规则。

五、证据:你可以自己检查什么?

  1. 在牌桌里验证一手牌。打开牌桌菜单的“战绩”,进入“本桌手牌”,选中一手,在“发牌证明”里点“验证发牌”。验证在你自己的设备上运行,证明只打开你本来就能看到的牌,没亮出的牌继续保密。
  2. 看懂结果。“完全通过”表示:这台设备在开局时就记下了锁牌指纹,你的随机数被纳入了洗牌,没有人扣着随机数不交,你看到的牌也全部对得上。“证明有效,本机未完整亲历本局”表示证明本身成立,但这台设备缺少完整的开局记录,比如换了设备、清了浏览器存储或中途掉线,不能当成同等结论。“不一致”就该截图并反馈。
  3. 离线复核。点“下载证明”保存文件,在自己电脑上装好 Rust、下载下面的开源代码,在代码目录里运行验证器:cargo run -p mental-poker --bin pf_verify -- --hand 证明文件.json,输出 OK 即通过。
  4. 看源码。发牌证明与验证代码公开在 github.com/CisaSettle/bluffking,炸金花的部分在 mental-poker/src/pf2_zjh.rs,封牌、洗牌证明和发牌顺序在 pf2.rs。公开源码本身不能证明线上运行的程序与它完全一致,所以第 1、3 步的逐手验证更重要。

六、目前做不到的事

  • 服务器在牌局中知道牌面。它要判断比牌和开牌谁大,所以需要牌。在第一节所说的条件下(有真人随机数按时交上、没人扣着不亮),验证能说明牌没有被事先挑过;在下一条的本机记录条件下,还能发现事后换牌。但它不能证明“服务器那边没人偷看”。能读取发牌程序内部数据或数据库里发牌秘密的人,技术上可以看到牌、还原历史牌局;普通游戏账号和后台账号都没有这种权限。这一点和德州默认发牌相同,见BluffKing 靠谱吗。
  • 发现事后换牌要靠本机记录。只有参与时用的浏览器仍保存着开局记录(最多 30 天),证明才能发现事后换牌。
  • 没交上随机数的座位不参与洗牌。页面版本太旧、掉线或没在开局交换的时限内(每步约 1.5 秒)交上,这个座位的随机数就不算进去;机器人也不出随机数。没有任何真人随机数时,顺序只依赖服务器的随机数。有人交了指纹却不亮随机数,验证结果会列出来,这时不会显示“完全通过”。
  • 无法排除“作废重来”。如果有人能让一手在开局阶段失败重开,验证这一手看不出来,这需要另外核查。
  • 2026 年 11 月 1 日之前的旧牌局不再提供证明:当时的旧格式已经停用。

如果你发现牌对不上、看到了不该看到的牌,或能复现提前读牌,请记下手牌编号和时间,截图后通过应用内反馈提交;符合条件的可以走安全悬赏。