testsAndMisc-archive/python_pkg/puzzle_solver
Krzysztof kuhy Rudnicki 996617d4a0 test: achieve 100% branch coverage across all python_pkg packages
- Add comprehensive tests for all packages (3572 tests, 100% branch coverage)
- Split oversized test files to stay under 500-line limit
- Add per-file ruff ignores for test-appropriate suppressions
- Fix _cache_decks.py to properly convert JSON lists to tuples
- Add session-scoped conftest fixture for logging handler cleanup (Python 3.14)
- Update ruff pre-commit hook to v0.15.2
- Add codespell ignore words for test data
- Add generated output files to .gitignore
2026-03-21 17:51:36 +01:00
..
tests test: achieve 100% branch coverage across all python_pkg packages 2026-03-21 17:51:36 +01:00
__init__.py refactor: move Python packages under python_pkg/ 2026-03-18 22:54:45 +01:00
__main__.py refactor: move Python packages under python_pkg/ 2026-03-18 22:54:45 +01:00
main.py refactor: move Python packages under python_pkg/ 2026-03-18 22:54:45 +01:00
parse_image.py refactor: move Python packages under python_pkg/ 2026-03-18 22:54:45 +01:00
README.md refactor: move Python packages under python_pkg/ 2026-03-18 22:54:45 +01:00
solver.py refactor: move Python packages under python_pkg/ 2026-03-18 22:54:45 +01:00

Sliding-Square Puzzle Solver

Parses a screenshot of a sliding-square puzzle and solves it via BFS.

Setup

cd puzzle_solver
python -m venv .venv && source .venv/bin/activate
pip install opencv-python-headless numpy

Usage

# From workspace root, with venv active:

# Step 1  Parse screenshot to editable JSON
python -m puzzle_solver parse screenshot.png -o puzzle.json

# Step 2  Review & fix any "unknown" squares in puzzle.json
#   (set "type" to: normal / portal / teleporter / key / lock)

# Step 3  Solve
python -m puzzle_solver solve puzzle.json

# One-shot (no manual review)
python -m puzzle_solver run screenshot.png

# Debug overlay (visualise detected squares on image)
python -m puzzle_solver debug screenshot.png -o debug.png

Game mechanics

Square JSON type Description
Empty outline normal Regular landing square
Solid fill player Starting position
Ring inside goal Target destination
Inner square offset portal Pass through from the side marked by "side"
Antenna line(s) teleporter Warp to paired teleporter ("group" id)
Key symbol key Removes matching lock ("lock_id")
Lock symbol lock Solid until matching key collected, then vanishes

Movement

You slide in a cardinal direction (up/down/left/right) until you hit another square. If you slide off the grid without hitting anything, you die.

Algorithm

BFS over state = (position, set_of_active_locks). Explores all reachable states and returns the shortest move sequence to the goal.