← All posts
Fairness

Why our bots can't see your cards

It would be easy to let a bot peek. We made it structurally impossible — and that's a feature, not a footnote.


Plenty of game AIs cheat. It is the simplest way to make a hard opponent: let the bot read everyone's cards and play accordingly. We refuse to do that — not as a policy we promise to follow, but as something the code makes impossible by construction.

The one function that matters

Every bot decision flows through a single read on the hand: a Monte-Carlo equity estimate. Look at what it is allowed to receive:

estimateEquity(
  holeCards,    // the bot's OWN two cards
  board,        // the public, shared cards
  numOpponents, // just a count — not who they are or what they hold
  iterations,
)
The bot's entire view of the hand: its own cards, the public board, the opponent count.

That is the whole input. The function is handed the bot's own cards, the cards everyone can see, and a numberof opponents. It is never given another player's hand, because there is no parameter to pass one in. To simulate the future, it deals random cards to those phantom opponents itself. The bot literally cannot peek, because the door was never built.

Why a number, not the cards?

A strong hand against one opponent is a coin flip against five. The bot needs to know how many people it is up against to read its own strength correctly — but that is all it needs. Identity and holdings are irrelevant to a fair estimate, so they are simply not in the room.

It survives multiplayer too

In our live games the server sends each device a projectionof the table — your cards face-up, everyone else's face-down — and the same rule applies to bots. The bot brain is fed only what a fair seat would see. Anti-cheat is not a layer we bolt on; it is the shape of the data.

Keep reading