bruno

A multi-player card game

About the game

In early 2022, Aaron told me (with an excited voice) that he came up with a new card game, which is based on bridge and UNO. I was persuaded to try it out and actually found it interesting. This page descrcibes how the game works. Later I built a web app so anyone interested can play it online. Recently, I added agent players powered by LLMs, so you can still play even without enough humans around. Give it a try here !

This game has several appealing features: stochastic, partially observable, competitive-cooperative… with simple rules to learn/exercise. In a hypothetical but implausible future, we want to build a reinforcement learning agent to play this game, with the hope that it can achieve similar or better performance than human players.


How to play

Game Rules

The game uses a standard 52-card deck with the jokers removed. Four players sit around the table, and the two who aren’t neighbors form a team. Play proceeds counter-clockwise. The first player to finish all of their cards, both hand and table, wins the game for their team.

Dealing and Card Types

Each player starts with 13 cards in three groups: 7 hand cards, visible only to you; 3 face-up table cards, visible to everyone; and 3 face-down table cards, invisible even to you.

Cards ranked 4–8 and J–A are ordinary cards: higher beats lower. Cards ranked 2, 3, 9, and 10 are function cards; their rank doesn’t matter, but each has its own effect:

  • 2: skips the current turn, and the next player responds instead.
  • 3: skips the current player and the next player, so the current player’s teammate responds instead.
  • 9: forces the next player to play a card ranked below 9, or a function card.
  • 10: collects everyone’s hand cards, shuffles them, and redeals them in turn order starting from the current player, and the next player then responds. The played 10 leaves the game for good; it never becomes part of the pile that a player might later collect.
Bruno game setting

Play Rules

  1. Cards must be played in this order: hand cards first, then face-up table cards, and only then face-down table cards.
  2. The first player to act, whether at the start of the game or after a round resets, may play any card.
    • After that, play a card ranked no lower than the last one played, or a function card.
    • You can play one card, or several cards of the same rank at once; suit and count don’t matter.
    • A stack of matching cards counts the same as playing just one.
  3. If you have a legal card to play, you must play it. If you don’t, you collect everything played so far into your hand, and the next player may open the next round with any card.
  4. When you start using face-down table cards, you reveal one at random. If it doesn’t satisfy the current play rules, you collect everything played so far, and the next player opens a new round with any card.

Winning Rule

To win, you must play all of your hand cards, face-up cards, and face-down cards, but your final card cannot be a function card. If you attempt to finish the game with a function card, its effect doesn’t trigger: you collect everything played so far, and the next player starts fresh with any card.


# 中文规则点这里

基本设置

使用一副去除大小王的扑克牌,共 52 张。四名玩家围坐进行游戏,不相邻的两人为一队,按逆时针顺序依次出牌。 任意一名玩家率先打完自己所有的牌(包括手牌与桌面牌),其所在队伍即获胜。

发牌与牌型

每位玩家在开局时获得 13 张牌,分为三部分:7 张手牌(仅自己可见)、3 张桌面明牌(所有人可见)以及 3 张桌面暗牌(所有人不可见,包括玩家自己)。

牌面点数为4–8、J–A 为普通牌,按点数递增比较大小;2、3、9、10 为功能牌,不受大小限制,并具有以下效果:

  • 2:跳过当前回合,由下一位玩家接牌。
  • 3:跳过当前玩家和下一位玩家,由其队友接牌。
  • 9:强制下一位玩家出小于 9 的牌或功能牌。
  • 10:收集所有玩家手牌并洗牌,从当前玩家开始按顺序重新分发手牌,随后由下一位玩家接牌。打出的 10 会从游戏中移除,不进入可收取的牌堆。

出牌规则

1. 玩家使用牌时必须遵循以下顺序:先出完手牌,再使用桌面明牌,最后才能使用桌面暗牌。

2. 游戏开始或回合重置后的首位玩家出牌可以出任意牌。之后的玩家必须出点数不小于上一手的牌,或出功能牌。可一次出一张或多张相同点数的牌,花色与张数均不作限制。多张相同点数的牌效果等价于单张该点数的牌。

3. 若玩家有可出的牌,则必须出牌。若玩家没有可出的普通牌或功能牌,则必须收回场上所有打出的牌到手中。此后由下一位玩家任意出牌,开启新的回合。

4. 当玩家开始使用桌面暗牌时,需要随机翻开一张;若该牌不符合当前出牌规则,同样需要收回场上所有打出的牌。由下一位玩家任意出牌,开启新的回合。

胜利规则

玩家必须打完所有手牌、明牌和暗牌才能获胜,但最后一张牌不能是功能牌。若玩家尝试以功能牌结束游戏,该功能不会生效,玩家需收回场上所有打出的牌到手牌。由下一位玩家任意出牌,开启新的回合。


Game Analysis

When creating a new game, the first question is whether it’s fair: does the team that plays first hold any edge over the team that plays second? To explore this, I simulated 10,000 complete games under each of three simple strategies for choosing actions:

  • First legal: always pick the first action from a list of legal moves
  • Uniform random: sample uniformly among all legal moves
  • Greedy: always play the move that sheds the most cards immediately

None of these approximate skilled play. They’re baselines for stress-testing the game engine and probing its structural properties.

Game length distribution. All 30,000 games finished normally, with no games hitting the step cap.

Distribution of completed-game length (central 99.5%) by strategy.

Now, back to the fairness question. The starting team’s win rate is statistically indistinguishable from 50% under all three strategies, and exact binomial tests confirm it:

Mode Starter win rate 95% CI p vs. 50%
First legal 49.69% [48.71%, 50.67%] 0.5419
Uniform random 50.49% [49.51%, 51.47%] 0.3320
Greedy 50.27% [49.29%, 51.25%] 0.5961
Starting team's win rate (with 95% CI) across 10,000 simulated games per strategy. Every interval straddles 50%.

The same picture holds when we split by team identity instead of pooling starter and non-starter together. Labeling the two teams T1 and T2:

Mode T1 win rate when T1 starts T1 win rate when T2 starts Difference 95% CI
First legal 49.99% 50.59% −0.60% [−2.56%, +1.36%]
Uniform random 49.97% 49.02% +0.95% [−1.01%, +2.91%]
Greedy 50.05% 49.52% +0.53% [−1.43%, +2.49%]

Across 30,000 simulated games with no adversarial skill involved, going first confers no detectable advantage, a good sign that the game’s asymmetric turn order doesn’t secretly favor anyone.

Of course, “fair under baseline strategies” isn’t the same as “fair under skilled or adversarial play.” A clever team might still exploit the turn order in ways these simple baselines can’t. That’s part of the motivation for eventually training an RL agent: a strong enough policy would let us re-run this fairness check under real competitive pressure instead of just structural symmetry.