Inspiration
The inspiration for this project was the fact that poker is often treated as a game of luck, when it isn't. Over enough hands, math and probability decide who comes out ahead. We wanted to build something that proves it: a bot that doesn't bluff on instinct or chase hunches, and makes every decision based on the numbers.
What it does
AuroraBot is a heads-up Short Deck PLO5 poker bot. At every decision, it simulates how the hand could play out to measure how strong its hand really is. It then looks up that strength and the current betting situation in a strategy it learned from 1.8 billion games of self-play. It doesn't always make the same move in the same spot. It picks its action using the learned probabilities, so opponents can't predict it or exploit a pattern.
How we built it
We built AuroraBot with Python and C, using Claude as a development partner throughout. The bot has two main parts:
- Hand strength through simulation: the bot plays the hand out many times from the current point to estimate its real strength. In Short Deck PLO5, five hole cards and a smaller deck make strength hard to judge at a glance.
- A strategy learned from self-play: we trained the bot by having it play itself 1.8 billion times. The result is a strategy that maps every combination of hand strength and betting situation to a probability for each action.
During a hand, the bot combines the two: it measures its strength, finds its situation in the learned strategy, and samples a move from those probabilities. We then tested it over thousands of hands against a range of test bots to check both its decisions and its stability.
Challenges we ran into
- The time limit. We had to build, test and tune a working bot within the datathon window, so every idea had to earn its place quickly.
- Bugs that looked like a bad bot. In poker, a losing stretch can come from variance, a weak strategy or a bug, and they look almost identical from the outside. Several "strategy problems" turned out to be code problems.
- Promising ideas that didn't pan out. Some approaches looked great on paper but didn't improve results in testing, and we had to be willing to drop them.
Accomplishments that we're proud of
- AuroraBot beat every test bot we put it up against.
- It beat two other teams' bots in a friendly competition before official judging.
- It ran with zero errors across thousands of test hands.
What we learned
We learned that poker isn't mostly luck. Over a single hand anything can happen, but over 2,000 duplicate hands, where both bots get the same cards, better decisions clearly showed up in the results.
We also learned not to trust first impressions. One match can make a strong bot look broken (ours once lost purely because of a network delay) or make a weak idea look good. So we stopped judging changes by single matches and only trusted results that held up across thousands of hands.
What's next for AuroraBot
Next, we want to test AuroraBot against more real opponents instead of only test bots, and give it the ability to keep thinking while the hand is being played, so it can update its strategy as the action happens.