Interviewopoly: Turning interview prep into a board game
The struggle of interview prep is an experience almost all prospective software engineers share. Our project aims to provide an engaging platform where engineers can reinforce their technical and behavioral interviewing skills. Using a pragmatic mix of AI tooling, the OpenAI API when available, plus Python, HTML, CSS, and JavaScript, we built Interviewopoly.
How we built it
We kept the stack simple and fast to iterate:
Backend:
FastAPI with a single in-memory game state. board.py defines every tile. server.py exposes /new, /roll, /prefetch, /resolve, /submit_answer, and /state. Passing GO awards offer points, not cash, and Chance/Community operate through a small card engine.
Question engine:
logic.py can call the OpenAI API for LC, System Design, and Behavioral prompts and scoring. If an API key is missing, it falls back to deterministic local scoring so the game always runs.
Front end:
Vanilla JS (static/app.js) draws a 10×10 grid board, animates dice, moves the pawn tile by tile, and rotates the board as you traverse sides. A compact modal handles questions with examples, hints, and rubrics. The HUD shows offer points, turns left, and owned tiles.
Prefetch and UX:
When you are about to land on a question tile, the client asks the server to pre-generate the prompt. A lightweight loader masks any model latency.
Challenges we ran into
Board rotation and corners:
Getting rotation to change exactly once per side, including special cases like Go to Jail, took several iterations and careful side detection.
Currency refactor:
We removed money entirely and migrated all rewards to offer points. That required deleting every lingering cash reference across server and logic code without breaking state or UI.
Monopoly semantics:
Implementing answer again to build a house only if you already own the whole color set required robust group detection and a clean houses map keyed by property name.
LLM availability:
The app had to behave predictably with or without an API key. We built clear fallbacks and surfaced judge provenance in outcomes.
Race conditions:
Coordinating dice animation, pawn walking, board rotation, prefetch, and resolve called for careful client sequencing to avoid double modals or stale state.
Accomplishments that we are proud of
A smooth gameplay loop:
Dice roll animation, stepwise pawn movement, and auto rotation make the experience feel like an actual board game, not a quiz form.
Crisp challenge surfaces:
LC, System Design, and Behavioral prompts are short, structured, and scorable. Hints and rubrics are revealed just in time.
Clear progression:
Correct answers grant offer points and ownership. Land on your own tile with a full set, answer correctly, and a house gets built. Land on your own without the full set and you get immediate, helpful feedback.
Resilient architecture:
The game runs fine in local judge mode, which made development and demos painless. We also added a FORCED_ROLLS test hook to reproduce edge paths like go to jail.
What we learned
Keep game truth server side:
Centralizing rules in server.py reduced UI bugs and made new mechanics easier to add.
Design for latency:
Prefetch plus a focused modal keeps the flow snappy even when an LLM is thinking.
Small, composable modules:
Separating board data, rules, and prompts made refactors like removing cash or adding houses low risk.
Tight feedback loops matter:
Quick, concrete changes based on play testing beat speculative features every time.
What is next for Interviewopoly
Local multiplayer:
Hot seat turns with per player state for position, offers, owned sets, and houses. We will introduce lightweight turn passing, per player dice, and visual markers on tiles.
Accounts and cloud saves:
A simple auth layer and persistent storage so you can pick up and play anywhere, any time. This includes syncing game state, owned properties, houses, and offer totals across devices.
UI for buildings and sets:
On board house markers and color set badges, plus a sidebar inventory of monopolies.
Stability and fairness:
Guards for forced rolls when not in dev mode, rate limiting on scoring endpoints, and clearer outcomes with traceable judge sources.

Log in or sign up for Devpost to join the conversation.