Files
tic-tac-toe/README.md

8.2 KiB
Raw Blame History

Project Status Report

Multiplayer Tic-Tac-Toe Platform

To: CTO & Technical Interview Panel

Date: November 28, 2025

Version: v0.2.0


1. Objective

Design and implement a lightweight, scalable, server-authoritative multiplayer game system using **Nakama + Go plugins **, supporting authentication, matchmaking, authoritative gameplay, leaderboards, and a functional UI — deployable to Google Cloud for demonstration.


2. Current Completion Summary

Requirement Status
Install Nakama + PostgreSQL Completed
Custom Go server plugins Completed
Server-authoritative Tic-Tac-Toe Completed
Real-time WebSocket communication Completed
Device-based authentication Completed
JWT-based session management Completed
Match creation & joining Completed
Matchmaking queue support Completed
Game state validation & turn enforcement Completed
Leaderboard system Completed
UI Game Client 🟡 Partially Implemented
Google Cloud deployment 🟡 Not Started

Backend is fully authoritative and complete 🟡 UI functional but missing polish, UX, and failure handling


3. Core Technical Architecture

  • Backend Framework: Nakama 3.x
  • Business Logic: Custom Go runtime module
  • Frontend: React + Vite + Nakama JS
  • Database: PostgreSQL 14
  • Transport: WebSockets (real-time)
  • Authentication: Device-ID based auth → JWT session returned
  • State Management: Fully server-authoritative
  • Build & Deployment: Docker-based

4. Authentication

Backend

  • Device authentication, auto-account creation
  • JWT returned and used for RT connections

UI

  • Generates a device UUID and authenticates via client.authenticateDevice()
  • Stores and manages session state in React context

5. Game Server Logic (Go)

Significant enhancements made:

✔ Initial State Broadcast

  • When the second player joins, the server immediately sends the full authoritative state.

✔ Complete Turn + Move Validation

Rejects:

  • out-of-bounds moves
  • occupied cells
  • wrong player's turn
  • invalid payloads

✔ Forfeit Handling

  • When a user disconnects or leaves, match ends in forfeit
  • Final state broadcast to remaining player

✔ Authoritative State Updates

  • Only broadcasts when state actually changes
  • Robust structured logging

Result: Absolute server authority, zero trust in client.


6. Real-Time Networking

Communication validated end-to-end:

  • match_create
  • match_join
  • matchmaker_add / matchmaker_matched
  • match_data_send for moves (OpCode 1)
  • Server broadcasts state (OpCode 2)

Python simulators and UI both confirm:

  • move ordering
  • correct enforcement of turn rules
  • correct state sync
  • stable WebSocket behavior

7. Matchmaking System (Go + UI)

Backend (Go)

  • Implements MatchmakerMatched hook

  • Ensures both players:

    • have valid mode
    • match modes
    • exactly two players
  • Creates authoritative matches server-side

  • RPC leave_matchmaking added

UI

  • Integrates matchmaking: mode selection → queue → ticket → matched → auto-join
  • Uses Nakama JS socket.addMatchmaker()

Status: Fully functional end-to-end


8. Leaderboard System (Go + UI)

Backend (Go)

  • Leaderboard auto-created on startup

  • On win:

    • winner identified
    • username resolved
    • score incremented (+1 win)
    • metadata logged

UI

  • Implements leaderboard view using client.listLeaderboardRecords()
  • Read-only UI display works

Remaining

  • UI sorting, layout, styling
  • No leaderboard write actions needed from UI

9. UI Implementation Status (React + Vite)

What Is Implemented

  • ✔ Authentication flow (device auth)
  • ✔ WebSocket session handling
  • ✔ Matchmaking (classic/blitz modes)
  • ✔ Automatic match join
  • ✔ Move sending (OpCode 1)
  • ✔ State updates (OpCode 2)
  • ✔ Board rendering and interactive cells
  • ✔ End-of-game messaging
  • ✔ Leaderboard display

Partially Implemented

  • 🟡 Match mode UI selection wired but not visually emphasized
  • 🟡 Context handles all RT states but missing error handling

Not Implemented / Missing

  • 🔴 Reconnect flow (UI does not recover session after WS drop)
  • 🔴 No error UI for: matchmaking failure, move rejection, disconnects
  • 🔴 No UI for leaving match or returning to lobby
  • 🔴 No rematch button / flow
  • 🔴 No transitions, animations, or mobile layout
  • 🔴 No global app shell (Routing, Home Screen, etc.)

Summary: UI is functional and capable of playing full authoritative games, but lacks UX polish and failure handling.


10. Testing & Validation

Backend

  • Extensive scenario tests: draws, wins, illegal moves, disconnects
  • Matchmaking simulation across N clients

UI

  • Verified:

    • matchmaking
    • game correctness
    • leaderboard retrieval
    • state sync
  • Missing:

    • stress testing
    • reconnection scenarios
    • mobile layout testing

11. Google Cloud Deployment

Planned architecture remains:

Component GCP Service
Nakama server Compute Engine VM (Docker)
PostgreSQL Cloud SQL (shared tier)
Game UI Cloud Run or Firebase Hosting
Networking Static IP + HTTPS
Auth secrets Secret Manager (optional)

Estimated setup time: 68 hours


12. Risks & Considerations

Risk Mitigation
UI lacks error/reconnect logic Add retry + reconnection flows
No rematch or lobby UX Add match lifecycle UI
No mobile layout Add responsive CSS
Cloud deployment pending Prioritize after UI polish
Matchmaking UX is minimal Add feedback, loading states

None of these affect core backend stability.


13. Next Steps

UI Tasks

  1. Add reconnect + error-handling UI
  2. Create lobby → gameplay → results, flow
  3. Add rematch capability
  4. Add responsive + polished UI
  5. Add loading indicators & animations

Estimated remaining effort: 6 to 8 hours


Executive Summary

Issues faced

Several unexpected integration challenges during UI setup contributed to the additional day of work. These included:

  • Aligning the UIs matchmaking flow with the new authoritative Go-based matchmaking logic.
  • Handling Nakama JS WebSocket behaviors, especially around session timing, matchmaker ticket handling, and match join events.
  • Ensuring OpCode handling and server-produced state updates matched the servers authoritative model.
  • Resolving environment-related issues (Vite dev server, Node version mismatches, and WebSocket URL configuration).
  • Debugging cross-origin and connection-reset issues during early WebSocket initialization.

These challenges required deeper synchronization between the backend and frontend layers, resulting in an additional +1 day of engineering time.

Project Progress

The system now features a fully authoritative backend with matchmaking, gameplay logic, and leaderboards implemented completely in Go. The UI is functional and integrates correctly with all backend systems, supporting end-to-end matchmaking and gameplay.

Key remaining work involves UI polish, recovery/error handling, and deployment setup. No major architectural risks remain.

The project is now fully playable, technically solid, and ready for final UI enhancements and cloud deployment.