The question
We took on two ThunderHacks challenges with one game:
- Canadian Bank Note: build a casino-style crash game. Players place a bet, watch a multiplier rise in real time, and cash out before a random crash. Judged on presentation, backend (game logic, accounts, RNG, security), modularity and creativity.
- Game Jam, Four Seasons: make a game where the four seasons actually shape the gameplay (rules, hazards, choices), not just the scenery.
Why we built it (motivation)
Crash games are exciting but cold: a rocket goes up and explodes, one player at a screen. We wanted to keep the real crash-game math but make it warm, funny and social:
- The crash is a cat getting distracted by a fish, a laser dot, yarn or a nap. Everyone gets it instantly.
- Each season changes one rule, so you have to rethink your strategy every walk.
- The whole room plays together from their phones, so a demo becomes a party, not a spectator sport.
What it does
Catino is a crash game where the "crash" is a distracted cat.
- Bet, kitty walks, the multiplier climbs (up to 100x), and you cash out before she gets distracted.
- Four seasons, four rules, forecast before betting:
- Spring (timing): a golden butterfly appears for 1.6 s. Cash out during it for +25%.
- Summer (speed): a 40% chance of zoomies, where the multiplier climbs much faster.
- Fall (information): leaf storms hide the multiplier. Read the cat, not the number.
- Winter (patience): a slow, sleepy walk. Cash out at 2.00x or more for a +10% cocoa bonus.
- Crowd mode: scan a QR code and bet on the same cat from your phone. Up to 60 players, one live leaderboard, no app.
Tech stack
| Part | Tech |
|---|---|
| Big screen | Unity 6 (URP 2D), C# |
| Backend | Python, FastAPI, Uvicorn |
| Database | SQLite (balances, rounds, transactions) |
| Randomness | Qiskit + Qiskit Aer (simulated noisy quantum circuits) XOR Python secrets |
| Phones | One HTML/JS page served by the API (Canvas, Web Audio), QR codes via segno |
| Art & audio | Pixel-art sprites, 22 sound effects made during the event, a music track per season |
How it works: the server decides everything. It draws $u \in (0,1)$ and sets the crash point
$$C = \min\left(100,\ \max\left(1,\ \frac{0.96}{u}\right)\right)$$
giving a 96% return to player (4% house edge). The multiplier grows as $m(t) = e^{g(t-3)}$ after a 3 s warm-up, with the growth rate $g$ set by the season. Money is exact (2-decimal Decimal), every payout is re-checked as wager × multiplier, cash-outs use the server's clock, and phones poll the room about 3 times a second.
Challenges
- Keeping a laptop and dozens of phones in sync on one round with one authoritative clock.
- Making seasons change the rules without breaking the payout math.
- Merging new features into a teammate's API without breaking their tests.
- Mobile audio quirks, and cutting a "meow to cash out" mic feature because phones need HTTPS for the mic.
What we're proud of
- A whole room joining one game in seconds, no install.
- Seasons that genuinely change strategy.
- A server-authoritative backend, verified at 96% RTP over 400,000 simulated rounds, and load-tested at 60 phones with 0 errors.
What we learned
- How crash games are balanced (RTP, house edge) and how a fun bonus can quietly push returns above 100%.
- Real-time multiplayer sync, and mixing simulated quantum randomness safely with cryptographic randomness.
Next steps
- Provably fair rounds: SHA-256 commit-and-reveal so anyone can verify a crash point.
- Balance and analytics: tune season bonuses for real-money-style RTP; track observed RTP and rounds played.
- Scale: persistent crowd wallets, WebSockets instead of polling, and a hosted server so phones don't need the same Wi-Fi.
- Polish: a visible multi-season cycle, a textless tutorial, accessibility settings and French localization.
Log in or sign up for Devpost to join the conversation.