Puzzle game spec C++

Letโ€™s spec this puzzle game in C++ terms before we write code.

๐ŸŽฎ Game Concept

Board Size: 8 ร— 8 grid (64 tiles total).

Tiles: Numbered sequentially.

Hard (1 missing): Tiles 1โ€“63 + 1 blank (0/64).

Medium (2 missing): Tiles 1โ€“62 + 2 blanks.

Easy (3 missing): Tiles 1โ€“61 + 3 blanks.

Blank Tiles: Represent โ€œholesโ€ where tiles can move.

๐Ÿงฉ Mechanics

Tiles slide into adjacent blank spaces (classic sliding puzzle rules).

Objective: Arrange tiles back into ascending order (1 โ†’ N), with blanks at the end (bottom-right).

๐Ÿ“Š Data Structures

Represent the board as:

2D array: int board[8][8].

Or 1D vector: std::vector of size 64 for easier shuffling.

Blanks are represented by 0.

๐Ÿ”„ Gameplay Flow

Choose difficulty (easy, medium, hard โ†’ defines number of blanks).

Initialize board:

Fill with numbers 1..(64 – blanks).

Insert blanks (0s).

Shuffle into a solvable configuration.

Game loop:

Print board.

Ask player for a move (tile number or arrow direction).

Validate move (must be adjacent to a blank).

Swap tile โ†” blank.

Check win condition.

Win condition: Board is sorted ascending with blanks at the end. <<–Lets make sure to add a frame around the puzzle and radio buttons so the user can select the difficulty. We are mouseclicking to move tiles. If a tile has one of its faces is not touching another tile, move into that tile.

Hereโ€™s a clean **C++ spec** that covers all your points plus the GUI additions (frame, radio buttons, mouse clicks).

## ๐ŸŽฎ Puzzle Game (C++ Spec)

### Board
– **Grid**: `8 ร— 8` (64 positions).
– **Tile Representation**:
– **Numbered tiles**: integers `1..(64 – blanks)`.
– **Blank tiles**: represented as `0`.
– **Data Structures**:
– Internal: `std::vector board(64)`.
– Optional: `int board[8][8]` for row/col logic.
– Coordinate mapping:
`row = index / 8`, `col = index % 8`.

### Difficulty
– **Easy**: 61 tiles + 3 blanks.
– **Medium**: 62 tiles + 2 blanks.
– **Hard**: 63 tiles + 1 blank.

Chosen via **radio buttons** in the GUI before starting.

### GUI Layer
– **Frame**: Drawn around puzzle area.
– **Tiles**:
– Rendered as squares with numbers centered.
– Blanks: drawn as empty space.
– **Controls**:
– Radio buttons โ†’ difficulty selection.
– “Start” button โ†’ initializes board + shuffle.
– **Input**: Mouse clicks.
– Player clicks a **tile**.
– If an adjacent blank exists (up, down, left, right), the clicked tile slides into it.
– Multiple blanks? Prioritize the one orthogonally adjacent.

### Game Logic
1. **Initialization**
– Create board with correct number of blanks.
– Place numbers sequentially.
– Shuffle into a **solvable** permutation.
– Render.

2. **Gameplay Loop**
– Wait for mouse click.
– Identify clicked tile index.
– Check adjacency:
– If one of its 4 sides touches a blank, swap.
– Update board + redraw.
– Check win condition.

3. **Win Condition**
– Board tiles in ascending order.
– Blanks occupy the last positions (bottom-right corner, continuing left if multiple).
– Example: `[1, 2, 3, โ€ฆ, 61, 0, 0, 0]`.

### Support Functions
– `shuffleBoard(board, blanks)` โ†’ produces a random but solvable layout.
– `isSolvable(board)` โ†’ parity check for inversions.
– `drawBoard(board)` โ†’ GUI render function.
– `handleClick(x, y)` โ†’ maps mouse coords to tile index.
– `canMove(tile)` โ†’ checks if adjacent to blank.
– `swapTiles(tile, blank)` โ†’ updates board.
– `checkWin(board)` โ†’ validates ascending order + blanks at end.

This keeps the **logic decoupled** from the GUI:
– Core = pure C++ puzzle logic.
– GUI = wrapper for drawing + mouse input (SFML, SDL, or ImGui would work).

Do you want me to **draft the C++ class structure** (e.g., `class PuzzleBoard`, `class PuzzleGame`, `class PuzzleGUI`) so we can drop into code cleanly?