Scrabble

Phase 1 — Dictionary & Core Model

  • CLI: scrabble.py <dictionary_path> loads a word list into memory
  • Board model (15×15), rack (7 tiles), tile bag with letter counts and scores
  • Draw tiles to racks; basic placement grid (no scoring yet)

Functional result: The game starts with a populated tile bag, two 7-tile racks, and a blank 15×15 board using the provided dictionary.


Phase 2 — Placement Rules & Scoring

  • Validate moves: contiguous line, board connectivity, dictionary check for all formed words
  • Premium squares (DL/TL/DW/TW - Double Letter, Triple Letter, Double Word, Triple Word) and first-move center rule
  • Compute and return move score; refill rack after valid move

Functional result: Legal placements are accepted and scored correctly (including premiums); illegal moves are rejected with a brief message.


Phase 3 — GUI Play Surface (Tkinter)

  • Render board with premiums, player rack, and a minimal controls bar (Place, Recall, Submit, Pass, Swap)
  • Mouse: click-to-select tile from rack, then board cell; Recall returns tiles to rack
  • Score panel showing per-player totals and last move score

Functional result: A user can place tiles from the rack onto the board, submit a move, see the score update, and tiles refill visually.


Phase 4 — Turn Flow & Endgame

  • Two local players alternating turns (Pass, Swap consume a turn)
  • End when tile bag is empty and a rack is emptied, or after two consecutive passes
  • Final tally (subtract remaining rack points), winner dialog, “Play again” resets state

Functional result: A full match runs to completion with correct turn alternation and endgame scoring; the winner is announced and a new game can be started.