
Juego de puzzle con pellizco a una mano basado en reComputer-RK / Docker / RKNN / YOLO
Descripción del proyecto
Este proyecto es un puzzle puro de 217 líneas: gesture.py detecta el pellizco → drawing.RectDrawer recoge dos rectángulos → puzzle_game.PuzzleGame los mezcla en un 3×3 → la misma máquina de estados usa el pellizco para arrastrar el puzzle.

Inicio rápido
1. Clonar el repositorio y entrar al directorio
git clone https://github.com/doublelf/puzzle_game
cd puzzle_game2. Instalar dependencias
pip install -r requirements.txtrequirements.txt fija cuatro dependencias:
opencv-python>=4.8.0
mediapipe>=0.10.14
numpy>=1.26.0
Pillow>=10.4.03. Iniciar el juego
python main.py # cámara 0 por defecto, volteo horizontal activado
python main.py --cam 1 # usa la 2.ª cámara
python main.py --no-flip # desactiva el volteo horizontal
python main.py --no-landmarks # desactiva la superposición de puntos clave (activada por defecto)
python main.py --hide-trails # desactiva los rastros de gestos (activados por defecto)Al iniciar verás primero la pantalla de menú "Pinch-Puzzle"; pulsa cualquier tecla para entrar al juego.
4. Controles
| Fase | Entrada del jugador | Respuesta del programa |
|---|---|---|
| DRAW | Pellizco de pulgar + índice arrastrando → soltar, dibuja el primer rectángulo | Rectángulo relleno verde semitransparente, esquina superior izquierda Draw rectangles: 1/2 |
| DRAW | Repetir una vez para dibujar el segundo rectángulo | 2/2 → READY - generating puzzle..., pasa automáticamente a PLAY |
| PLAY | Pellizco para seleccionar la pieza del puzzle más cercana (borde dorado pulsante) | Toast Tile #N selected + sugerencia drag toward blank tile |
| PLAY | Arrastrar la punta del dedo cerca de una casilla en blanco adyacente | Ambas piezas parpadean en verde + Toast SWAP!, moves se incrementa |
| PLAY | Las 9 piezas en su sitio | Estallido central de 80 partículas arcoíris + Toast grande SOLVED! |
| En cualquier momento | R reinicia el puzzle actual | Vuelve a la fase DRAW, rectángulos borrados |
| En cualquier momento | M vuelve al menú | La cámara sigue capturando, solo se cierra el bucle del juego |
| En cualquier momento | ESC sale | Libera la cámara, cierra MediaPipe, destruye la ventana |
Ejecución sin cámara
El recomputer-rk3576-devkit se distribuye sin una cámara USB conectada por defecto. Este proyecto incluye tres utilidades para poder ejecutarlo de extremo a extremo incluso sin cámara:
tools/verify_all.py — suite de verificación de 8 pasos
cd /home/seeed/hand/puzzle_game
python3 -m tools.verify_allImprime cada uno:
- Importación de módulos (
gesture/drawing/puzzle_game/overlay/utils) - Funciones geométricas y de texto de
utils RectDrawer.update(None)no lanza excepcionesshuffle_solvableproduce un tablero válido- MediaPipe Hand Landmarker real cargado en aarch64 (XNNPACK delegate, ~110 ms de calentamiento)
HandOverlay.add_event+ renderizado- La pipeline sintética de 60 fotogramas se ejecuta sin errores
tools/run_synthetic.py — renderizado sin conexión a PNG
python3 -m tools.run_synthetic --frames 180 --out /tmp/puzzle_demo
ls /tmp/puzzle_demo | wc -l # → 180Mueve la pipeline completa de PuzzleGame + HandOverlay y escribe cada fotograma en out/puzzle_XXXX.png. En un entorno sin cámara, revisa las imágenes con feh / eog / un visor de imágenes, o ensambla los PNG en un mp4 con 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
Una fuente de vídeo sintética y un HandTracker sintético equivalentes en interfaz a cv2.VideoCapture / gesture.HandTracker. Para pasar a una cámara real más adelante, basta con sustituir estas dos líneas:
cap = cv2.VideoCapture(args.cam) # reemplaza SyntheticHandSource
tracker = HandTracker(num_hands=2) # reemplaza SyntheticHandTrackerCon esto, tools/run_synthetic.py se convierte en un script controlador con cámara real.