
Einhand-Kneif-Puzzle-Spiel basierend auf reComputer-RK / Docker / RKNN / YOLO
Projektübersicht
Dieses Projekt ist ein reines Puzzle-Projekt mit 217 Zeilen: gesture.py erkennt das Kneifen → drawing.RectDrawer sammelt zwei Rechtecke → puzzle_game.PuzzleGame mischt sie zu 3×3 → dieselbe Zustandsmaschine nutzt das Kneifen, um das Puzzle zu ziehen.

Schnellstart
1. Repo klonen und Verzeichnis öffnen
git clone https://github.com/doublelf/puzzle_game
cd puzzle_game2. Abhängigkeiten installieren
pip install -r requirements.txtrequirements.txt legt vier Abhängigkeiten fest:
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.03. Spiel starten
python main.py # Standardkamera 0, horizontale Spiegelung aktiviert
python main.py --cam 1 # zweite Kamera verwenden
python main.py --no-flip # horizontale Spiegelung deaktivieren
python main.py --no-landmarks # Keypoint-Overlay deaktivieren (standardmäßig aktiv)
python main.py --hide-trails # Gesten-Trails deaktivieren (standardmäßig aktiv)Nach dem Start sehen Sie zunächst den Menübildschirm „Pinch-Puzzle"; drücken Sie eine beliebige Taste, um das Spiel zu starten.
4. Steuerung
| Phase | Spielereingabe | Programmreaktion |
|---|---|---|
| DRAW | Daumen+Zeigefinger kneifen, ziehen → loslassen, um das erste Rechteck zu zeichnen | Rechteck halbtransparent grün gefüllt, oben links Draw rectangles: 1/2 |
| DRAW | Einmal wiederholen, um das zweite Rechteck zu zeichnen | 2/2 → READY - generating puzzle..., automatischer Übergang zu PLAY |
| PLAY | Kneifen, um die nächste Puzzle-Kachel auszuwählen (goldener pulsierender Rahmen) | Toast Tile #N selected + Hinweis drag toward blank tile |
| PLAY | Fingerspitze in die Nähe einer angrenzenden leeren Zelle ziehen | Beide Kacheln blinken grün + Toast SWAP!, moves wird hochgezählt |
| PLAY | 9 Kacheln an ihrem Platz | 80 Regenbogenpartikel platzen in der Mitte + großer Toast SOLVED! |
| Jederzeit | R setzt das aktuelle Puzzle zurück | Zurück zur DRAW-Phase, Rechtecke werden gelöscht |
| Jederzeit | M zurück zum Menü | Kamera erfasst weiter, nur die Spiel-Schleife wird beendet |
| Jederzeit | ESC beenden | Kamera freigeben, MediaPipe schließen, Fenster zerstören |
Betrieb ohne Kamera
recomputer-rk3576-devkit wird werkseitig ohne angeschlossene USB-Kamera ausgeliefert. Dieses Projekt bündelt drei Werkzeuge, um auch ohne Kamera einen End-to-End-Lauf zu ermöglichen:
tools/verify_all.py — 8-Schritte-Verifikationssuite
cd /home/seeed/hand/puzzle_game
python3 -m tools.verify_allDruckt jeden Schritt:
- Modul-Importe (
gesture/drawing/puzzle_game/overlay/utils) utilsGeometrie- und Text-HelferRectDrawer.update(None)löst keine Ausnahme ausshuffle_solvableerzeugt ein legales Brett- Echter MediaPipe Hand Landmarker auf aarch64 geladen (XNNPACK-Delegate, ca. 110 ms Aufwärmphase)
HandOverlay.add_event+ Rendering- Synthetische Pipeline läuft 60 Frames ohne Fehler durch
tools/run_synthetic.py — Offline-Rendering nach PNG
python3 -m tools.run_synthetic --frames 180 --out /tmp/puzzle_demo
ls /tmp/puzzle_demo | wc -l # → 180Treibt die vollständige PuzzleGame + HandOverlay-Pipeline und schreibt jeden Frame nach out/puzzle_XXXX.png. In einer kamerlosen Umgebung können die Bilder mit feh / eog / einem Bildbetrachter Frame für Frame angesehen oder mit ffmpeg zu einem mp4 zusammengefügt werden:
ffmpeg -framerate 30 -i /tmp/puzzle_demo/puzzle_%04d.png -c:v libx264 -pix_fmt yuv420p puzzle.mp4tools/synthetic_source.py + tools/fake_tracker.py
Eine synthetische Videoquelle und ein synthetischer HandTracker, die schnittstellenkompatibel zu cv2.VideoCapture / gesture.HandTracker sind. Um später auf eine echte Kamera umzustellen, ersetzen Sie einfach diese zwei Zeilen:
cap = cv2.VideoCapture(args.cam) # ersetzt SyntheticHandSource
tracker = HandTracker(num_hands=2) # ersetzt SyntheticHandTrackerAnschließend wird tools/run_synthetic.py zu einem echten Kameratreiber-Skript aufgewertet.