PvP Minesweeper over gRPC
  • C# 82.4%
  • JavaScript 11%
  • HTML 3.8%
  • CSS 2.5%
  • Shell 0.3%
Find a file
2026-05-01 11:50:03 +01:00
e2e Initial commit, empty projects 2025-09-02 13:27:06 +01:00
scripts Started refactor to make it possible to join games from multiple sources 2026-04-04 16:48:49 +01:00
src Made XyPair.Neighbours take a range value 2026-05-01 11:50:03 +01:00
test/Protosweeper.Api.Tests Starting with web interface 2025-09-06 22:15:01 +01:00
.gitignore Game IDs and seeds are kept separate now 2026-04-23 22:53:02 +01:00
global.json Started refactor to make it possible to join games from multiple sources 2026-04-04 16:48:49 +01:00
LICENSE Initial commit 2025-09-02 12:43:36 +01:00
Protosweeper.sln Added validator stub 2026-04-07 16:43:25 +01:00
README.md Added some plans to README, reduced time between mines detonating 2025-09-16 23:41:46 +01:00
TODO.md Game IDs and seeds are kept separate now 2026-04-23 22:53:02 +01:00

Protosweeper

PvP Minesweeper over gRPC

Goals

  • Practice mode
    • Single player
    • Untimed
    • Play specific seeds (optional)
    • Restart games
    • Interactable web page to work test strategy
      • Web page uses websockets
    • Playable through gRPC to practice for PvP
  • PvP (either race or timed with scoreboard)
    • Race
      • Game can start once two players join
      • Starts when the first player clicks a cell
      • First click streamed to both players
      • All subsequent clicks are kept hidden from opponent
      • Winner is the first player to clear the board
      • Clicking a mine loses the game
    • Leaderboard
      • Solve five games back to back
      • Discard the slowest and fastest times
      • The average of the remaining three games goes on the scoreboard
    • When joining a game, provide a spectator link
    • Spectate through webpage
      • Stream clicks with SSE
    • Receive seed at the end of a game for optional practice

User flow

  • Practice
    • Create a new game
      • Difficulty
      • Optional seed
      • Check game is solvable without guessing?
    • Store game in ConcurrentDictionary?
    • Connect websockets for the browser
    • Connect optional gRPC
    • Connections add a ChannelReader and ChannelWriter to the game
    • Listen for clicks on all ChannelReaders
    • Generate game board when first click received
    • Stream cells to all ChannelWriter instances
      • Prioritise gRPC?
    • Finish the game when all cells cleared or mine detonated
    • Cleanup the game when all channels disconnected or store state in a DB?
    • Restarting a game returns the state to just after the first click
  • PvP
    • TBC