
Jeu de puzzle à pincement à une main basé sur reComputer-RK / Docker / RKNN / YOLO
Présentation du projet
Ce projet est un puzzle pur de 217 lignes : gesture.py détecte le pincement → drawing.RectDrawer recueille deux rectangles → puzzle_game.PuzzleGame les mélange en un 3×3 → la même machine à états utilise le pincement pour faire glisser le puzzle.

Démarrage rapide
1. Cloner le dépôt et entrer dans le répertoire
git clone https://github.com/doublelf/puzzle_game
cd puzzle_game2. Installer les dépendances
pip install -r requirements.txtrequirements.txt fixe quatre dépendances :
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.03. Lancer le jeu
python main.py # caméra 0 par défaut, miroir horizontal activé
python main.py --cam 1 # utilise la 2ᵉ caméra
python main.py --no-flip # désactive le miroir horizontal
python main.py --no-landmarks # désactive la surcouche de points-clés (activée par défaut)
python main.py --hide-trails # désactive les traînées de gestes (activées par défaut)Au lancement, vous verrez d'abord l'écran de menu « Pinch-Puzzle » ; appuyez sur n'importe quelle touche pour entrer dans le jeu.
4. Commandes
| Phase | Saisie du joueur | Réponse du programme |
|---|---|---|
| DRAW | Pincement pouce + index en glissant → relâcher pour dessiner le premier rectangle | Rectangle rempli en vert semi-transparent, en haut à gauche Draw rectangles: 1/2 |
| DRAW | Répéter une fois pour dessiner le deuxième rectangle | 2/2 → READY - generating puzzle..., passage automatique à PLAY |
| PLAY | Pincement pour sélectionner la tuile de puzzle la plus proche (bordure dorée pulsante) | Toast Tile #N selected + indication drag toward blank tile |
| PLAY | Faire glisser le bout du doigt près d'une case vide adjacente | Les deux tuiles clignotent en vert + Toast SWAP!, moves s'incrémente |
| PLAY | Les 9 tuiles à leur place | 80 particules arc-en-ciel éclatent au centre + grand Toast SOLVED! |
| À tout moment | R réinitialise le puzzle en cours | Retour à la phase DRAW, rectangles effacés |
| À tout moment | M retour au menu | La caméra continue de capturer, seule la boucle de jeu est fermée |
| À tout moment | ESC quitte | Libère la caméra, ferme MediaPipe, détruit la fenêtre |
Exécution sans caméra
Le recomputer-rk3576-devkit est livré sans caméra USB connectée par défaut. Ce projet embarque trois utilitaires permettant un fonctionnement de bout en bout même sans caméra :
tools/verify_all.py — suite de vérification en 8 étapes
cd /home/seeed/hand/puzzle_game
python3 -m tools.verify_allImprime chaque étape :
- Importation des modules (
gesture/drawing/puzzle_game/overlay/utils) - Fonctions géométriques et texte de
utils RectDrawer.update(None)ne lève pas d'exceptionshuffle_solvableproduit un plateau légal- Vrai MediaPipe Hand Landmarker chargé sur aarch64 (XNNPACK delegate, ~110 ms d'échauffement)
HandOverlay.add_event+ rendu- La pipeline synthétisée tourne 60 images sans erreur
tools/run_synthetic.py — rendu hors-ligne en PNG
python3 -m tools.run_synthetic --frames 180 --out /tmp/puzzle_demo
ls /tmp/puzzle_demo | wc -l # → 180Pilote la pipeline complète PuzzleGame + HandOverlay et écrit chaque image dans out/puzzle_XXXX.png. Dans un environnement sans caméra, parcourez les images avec feh / eog / un visualiseur d'images, ou assemblez les PNG en mp4 avec ffmpeg :
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
Une source vidéo synthétisée et un HandTracker synthétisé, équivalents en interface à cv2.VideoCapture / gesture.HandTracker. Pour basculer plus tard sur une vraie caméra, il vous suffit de remplacer ces deux lignes :
cap = cv2.VideoCapture(args.cam) # remplace SyntheticHandSource
tracker = HandTracker(num_hands=2) # remplace SyntheticHandTrackertools/run_synthetic.py devient alors un script pilote à caméra réelle.