testsAndMisc/python_pkg/puzzle_solver
Krzysztof kuhy Rudnicki 72c6c3788c refactor: move Python packages under python_pkg/
- Move puzzle_solver/, poker_modifier_app/, articles/, tests/ into python_pkg/
- Move moviepy_showcase.py and _moviepy_*.py into python_pkg/moviepy_showcase/
- Update all imports to use python_pkg. prefix
- Update pyproject.toml per-file-ignores and pytest testpaths
- Add pre-commit hook to enforce Python files under python_pkg/
2026-03-18 22:54:45 +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.