牛牛能提前看牌或透视别人的牌吗?
抢庄和下注时,服务器连你自己的牌都还没发到手机上;亮牌阶段只发你自己的五张,本局结束才公开全桌。按源码说明为什么改客户端、抓包、观战和串通都看不到,以及服务器侧的边界。
结论先说:在 BluffKing 的牛牛里,你不能提前看到自己的牌,在正常的游戏流程里也没有办法在牌局中看到别人的牌。原因不是界面把牌“盖住”了,而是服务器在抢庄和下注阶段根本不把任何人的牌发到手机上,连你自己的也不发;亮牌阶段只发你自己的五张;等所有人亮完、这一局结束,才把全桌的牌一起公开。手机上从来没收到过的牌,改客户端、抓包、反复重连都变不出来。以下按 2026 年 11 月 5 日的源码说明。
一局牛牛里,什么时候能看到什么
| 阶段 | 你能看到 | 别人能看到 |
|---|---|---|
| 抢庄 | 没有任何人的牌;只能看到别人已经操作过,抢没抢要等阶段结束才知道 | 同样没有牌 |
| 闲家下注 | 仍然没有任何人的牌;只能看到别人已经下注,下多少要到亮牌阶段才公开 | 同样没有牌 |
| 亮牌 | 只有你自己的五张 | 只有他们自己的五张,看不到你的 |
| 本局结束 | 全桌所有人的牌和牌型 | 同样是全桌所有人的牌 |
有些牛牛玩法(比如常见的“看牌抢庄”)会先让每人看四张再决定抢不抢。BluffKing 的牛牛不是这样:抢庄、转庄和下注都在一张牌都没看到的情况下完成。到了亮牌阶段,唯一的操作就是“亮牌”,牛几由服务器按规则自动算,不需要你自己挑三张,也没有可以改的决定。15 秒没操作也一样:默认不抢庄、下最低注、自动亮牌。
为什么提前看不到自己的牌
服务器决定每个人能看到哪些牌的函数是 server/src/niuniu/hand.rs 里的 visible_cards,规则只有三条:抢庄和下注阶段,对谁都返回“无”;亮牌阶段,只返回看的人自己座位的牌;本局结束后,返回所有座位的牌。每次推送牌桌状态时,server/src/niuniu/room.rs 先生成一份所有座位牌面都为空的公共画面,再按“这个账号坐在哪个座位”逐个调用这个函数补上牌面。断线重连拿到的牌桌画面也走这条路径,所以重连不会让你提前看到牌。
这样设计是因为我们采用的规则是“先下注、后看牌”:既然抢庄和下注都应该在不知道牌的情况下做,最可靠的做法就是这时手机上根本没有牌。牌只要发到手机上,就有人能从内存或网络包里把它读出来;从来没发出去的数据,则不可能被读到。
为什么看不到别人的牌
- 改客户端、读内存、抓包:服务器发给你的数据里,别人的牌在本局结束前一直是空的。界面上的牌背后面没有藏着牌面。
- 观战:观战者不对应任何座位,按上面的规则在本局结束前拿不到任何牌。
- 和别人串通互报:在这套规则里没有用。亮牌阶段大家才看到自己的牌,而此时抢庄和下注都已锁定,就算互相告诉对方,也改变不了这一局的任何决定或结果。
- 电脑玩家:电脑也不看牌。它的抢庄只看筹码够不够坐庄,下注固定下最低注(
room.rs的play_bots),不存在“电脑偷看你的牌”的问题。 - 下一局谁坐庄:由上一局已经全部公开的牌决定(达到本桌接庄牌型且牌最大的闲家接庄),用的都是大家已经看到的信息。
牌是怎么来的,事后能不能核对
每一局开始时,发牌程序先锁定一副加密的标准 52 张牌和本局座位,并把它的承诺放进牌桌画面;新牌局还会让玩家先提交、再揭示自己的随机数,共同决定牌序。每个座位按顺序各拿五张。本局结束后,参与这一局的玩家可以在菜单里验证本局,浏览器用与德州扑克共用的验证器核对牌组和每张牌的发牌位置,也可以下载证明自行核对。秘密种子不公开,没发出去的牌不提供开牌证明。具体范围见公平机制与范围。
边界:什么情况下仍可能有人知道牌
服务器要负责发牌和结算,所以它从一局开始就持有整副牌。我们不声称“连服务器都不知道牌”;上面的结论说的是:游戏接口、牌桌推送、观战和重连都不会把未公开的牌交给玩家。仍需说明的情况包括:你自己的设备被别人控制(他能看到你能看到的东西)、服务器或主机被攻破、我们这次审查没发现的漏洞。所以准确的说法是“在当前源码的玩家可达路径里,没有提前看牌或透视的途径”,而不是“作弊绝对不可能”。