{"id":50733304,"url":"https://github.com/thepriben/quantum-tetris","last_synced_at":"2026-06-28T03:00:50.345Z","repository":{"id":361348639,"uuid":"1253968589","full_name":"thepriben/quantum-tetris","owner":"thepriben","description":"A Rust/Bevy/WASM experiment where Tetris gameplay decisions are driven by simulated quantum circuits.","archived":false,"fork":false,"pushed_at":"2026-06-26T23:45:35.000Z","size":942,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T01:21:28.806Z","etag":null,"topics":["2026","bevy-engine","preprint","programmez-magazine","quantum-computing","quantum-game","quantum-simulation","rust-lang","rustqip","tetris","tetris-game","wasm","webassembly"],"latest_commit_sha":null,"homepage":"https://thepriben.github.io/quantum-tetris/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thepriben.png","metadata":{"files":{"readme":"README.fr.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-30T01:56:53.000Z","updated_at":"2026-06-26T23:45:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thepriben/quantum-tetris","commit_stats":null,"previous_names":["thepriben/quantum-tetris"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thepriben/quantum-tetris","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thepriben%2Fquantum-tetris","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thepriben%2Fquantum-tetris/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thepriben%2Fquantum-tetris/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thepriben%2Fquantum-tetris/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thepriben","download_url":"https://codeload.github.com/thepriben/quantum-tetris/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thepriben%2Fquantum-tetris/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34875362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["2026","bevy-engine","preprint","programmez-magazine","quantum-computing","quantum-game","quantum-simulation","rust-lang","rustqip","tetris","tetris-game","wasm","webassembly"],"created_at":"2026-06-10T11:01:15.518Z","updated_at":"2026-06-28T03:00:50.340Z","avatar_url":"https://github.com/thepriben.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Quantum Tetris\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003e🇬🇧 \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e\u003c/strong\u003e · \u003cstrong\u003e🇫🇷 Français\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://thepriben.github.io/quantum-tetris/\"\u003e\u003cstrong\u003e▶ Jouer en ligne\u003c/strong\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cimg width=\"800\" alt=\"image\" src=\"https://github.com/user-attachments/assets/c09b7921-8ae3-41c6-b516-d941ff36349a\" /\u003e\n\nTetris où les événements stochastiques (pièce, état d’apparition, cadence, bonus…) sont pilotés par des circuits quantiques mesurés en mode par défaut. Le joueur garde les commandes ← → ↑ ↓ et Espace ; le jeu tire le reste depuis les mesures.\n\n\u003e **Le joueur :** ← → ↑ ↓ et Espace · **Le jeu :** tout le reste.\n\n**Exécution.** Bevy (Rust), en binaire desktop ou WASM dans le navigateur. Mode quantum par défaut : simulation statevector [**RustQIP**](https://github.com/Renmusxd/RustQIP), avec les mêmes circuits en local et en ligne.\n\n---\n\n## Publications \u0026 releases\n\nChaque release taguée fige un état reproductible du code.\n\n| Publication | Release |\n| --- | --- |\n| **Article *Programmez!*** — Benoît Prieur, *« Quantum Tetris : Rust, Bevy, WebAssembly et circuits quantiques dans la boucle de jeu »*, hors-série n°23, 2026, pp. 7–11. [Lien](https://www.programmez.com/magazine/article/quantum-tetris-rust-bevy-webassembly-et-circuits-quantiques-dans-la-boucle-de-jeu) | [`programmez-hs23`](https://github.com/thepriben/quantum-tetris/releases/tag/programmez-hs23) |\n| **Hasard auditable (C5/C6)** — reçus chaînés, journal de session commit-reveal, export à la game over. Voir [`docs/AUDIT.md`](docs/AUDIT.md). | [`preprint-randomness`](https://github.com/thepriben/quantum-tetris/releases/tag/preprint-randomness) |\n\n**Reproduire une release**\n\n```bash\ngit checkout programmez-hs23    # code de l'article *Programmez!*\ngit checkout preprint-randomness  # journal d'audit + pile C5/C6\n```\n\n---\n\n## Hasard auditable\n\nChaque tirage stochastique en mode quantum par défaut est consigné dans un **journal d'audit chaîné par hash** (couches C5 et C6). En desktop, à la game over, la session est révélée et exportée vers `audit/{session_id}.json`.\n\n| Étape | Commande / action |\n| --- | --- |\n| Jouer (desktop) | `cargo run -p quantum-tetris-game` — journal finalisé à la game over |\n| Vérifier l'export | `./scripts/verify_audit.sh audit/qt-….json` |\n| Lire la pile | [`docs/AUDIT.md`](docs/AUDIT.md) — contexte six couches, schéma JSON, chaîne de hash, tests |\n| Biais de mapping (C4) | Pièce **T** à P=¼ sous tirages 3 bits uniformes (`010` et `111`) — [`docs/QUANTUM.md`](docs/QUANTUM.md) |\n\n---\n\n## Gameplay \u0026 circuits\n\nÀ chaque moment stochastique, le moteur invoque un circuit de la liste partagée (voir [`docs/QUANTUM.md`](docs/QUANTUM.md)). Les diagrammes sont générés depuis les mêmes définitions de portes, recopiées dans [`scripts/render_circuit_diagrams.py`](scripts/render_circuit_diagrams.py).\n\n### Tirage de la pièce\n\n| | |\n|---|---|\n| **En jeu** | Détermine le tétromino en chute. |\n| **Circuit** | `quantum-teleportation-gate-v1` — une mesure de Bell inspirée de la téléportation ; le résultat 3 bits choisit directement le tétromino actif. |\n\n\u003cp align=\"left\"\u003e\u003cimg src=\"docs/circuits/quantum-teleportation-gate-v1.png\" alt=\"quantum-teleportation-gate-v1\" width=\"720\"\u003e\u003c/p\u003e\n\n### Rotation \u0026 colonne\n\n| | |\n|---|---|\n| **En jeu** | Fixe l’orientation à l’apparition et la colonne d’entrée. |\n| **Circuit** | `imp-brain-v1` — 2 qubits mesurés → rotation (0–3) et colonne d'apparition. |\n\n\u003cp align=\"left\"\u003e\u003cimg src=\"docs/circuits/imp-brain-v1.png\" alt=\"imp-brain-v1\" width=\"720\"\u003e\u003c/p\u003e\n\n### Cadence de chute\n\n| | |\n|---|---|\n| **En jeu** | Intervalle entre deux descentes ; diminue avec le niveau. |\n| **Circuit** | `enemy-profile-hunter-v1` — 2 qubits mesurés → intervalle de chute pour la pièce en cours. |\n\n\u003cp align=\"left\"\u003e\u003cimg src=\"docs/circuits/enemy-profile-hunter-v1.png\" alt=\"enemy-profile-hunter-v1\" width=\"720\"\u003e\u003c/p\u003e\n\n### Espace — chute forcée\n\n| | |\n|---|---|\n| **En jeu** | Pose immédiate ; bonus de score, parfois une ligne supplémentaire. |\n| **Circuit** | `observation-pulse-v1` — mesure à la pose forcée ; les bits choisissent le bonus. |\n\n\u003cp align=\"left\"\u003e\u003cimg src=\"docs/circuits/observation-pulse-v1.png\" alt=\"observation-pulse-v1\" width=\"720\"\u003e\u003c/p\u003e\n\n### Ligne complétée\n\n| | |\n|---|---|\n| **En jeu** | Multiplicateur de points ×1 à ×4 selon le tirage. |\n| **Circuit** | `q-shard-stabilizer-v1` — après effacement d'une ligne ; les bits fixent le multiplicateur (×1–×4). |\n\n\u003cp align=\"left\"\u003e\u003cimg src=\"docs/circuits/q-shard-stabilizer-v1.png\" alt=\"q-shard-stabilizer-v1\" width=\"720\"\u003e\u003c/p\u003e\n\n---\n\n## Démarrage rapide\n\n**Desktop**\n\n```bash\ncp .env.example .env          # optionnel ; QUANTUM_MODE=quantum est le défaut\ncargo run -p quantum-tetris\n```\n\n| Mode | Commande |\n| --- | --- |\n| Quantum — RustQIP (défaut) | `cargo run -p quantum-tetris` |\n| Classique | `QUANTUM_MODE=classic cargo run -p quantum-tetris` |\n\n**Navigateur** (nécessite ~3 Go d’espace libre pour le build WASM release)\n\n```bash\ncargo install wasm-bindgen-cli   # une fois\n./scripts/build_wasm.sh\npython3 -m http.server 8080 --directory docs\n# → http://localhost:8080/\n```\n\n**Contrôles :** ← → déplacer · ↑ rotation · ↓ chute douce · **Espace** chute forcée + observe (`observation-pulse-v1`).\n\n---\n\n## Architecture\n\nLe dépôt sépare le **moteur de jeu** (Bevy), la **couche quantique** (IR + backends) et **l’outillage** (rendu des diagrammes, build WASM, Pages).\n\n```mermaid\nflowchart TB\n  subgraph clients[\"Clients\"]\n    DESK[\"Binaire desktop\u003cbr/\u003ecargo run\"]\n    WASM[\"Navigateur\u003cbr/\u003edocs/index.html\"]\n  end\n\n  subgraph game[\"crates/game — Bevy 0.18\"]\n    APP[\"app.rs — TetrisPlugin\"]\n    TET[\"tetris.rs — boucle \u0026 spawn\"]\n    FX[\"measurement_fx.rs — bits → gameplay\"]\n    UI[\"ui.rs — grille + HUD + i18n\"]\n    CFG[\"config.rs — QuantumSession\"]\n  end\n\n  subgraph quantum[\"crates/quantum — simulation\"]\n    IR[\"circuit.rs — QuantumCircuit + Gate\"]\n    BE[\"backends/ — Classic · RustQIP\"]\n  end\n\n  DESK --\u003e APP\n  WASM --\u003e APP\n  APP --\u003e TET\n  TET --\u003e FX\n  TET --\u003e CFG\n  CFG --\u003e BE\n  BE --\u003e IR\n```\n\n**Principe :** le jeu n’appelle que `QuantumBackend::run(circuit) → Measurement`, puis décode les bitstrings via `measurement_fx.rs`. Passer de Classic à RustQIP ne modifie jamais la logique Tetris.\n\n### Pipeline au spawn\n\nTrois mesures s’enchaînent avant chaque pièce :\n\n```mermaid\nsequenceDiagram\n  participant T as tetris.rs\n  participant Q as QuantumSession\n  participant M as measurement_fx.rs\n\n  T-\u003e\u003eQ: piece_circuit() — tirage 3 bits inspiré de la téléportation\n  Q--\u003e\u003eT: bits → pièce active\n  T-\u003e\u003eQ: rotation_circuit() — imp-brain-v1\n  Q--\u003e\u003eM: rotation + colonne spawn\n  T-\u003e\u003eQ: speed_circuit() — hunter-profile-v1\n  Q--\u003e\u003eM: intervalle de chute\n  M--\u003e\u003eT: ActivePiece + HUD\n```\n\n### Backends\n\n| Backend | Où | Mécanisme |\n| --- | --- | --- |\n| **Classic** | partout | `rand` uniforme — baseline sans simulateur |\n| **RustQIP** | desktop + navigateur | simulateur statevector in-process |\n\n- `QUANTUM_MODE=classic|quantum` (alias `QUANTUM_BACKEND`)\n- Bascule **CLASSIQUE** / **RUSTQIP** in-game\n\n---\n\n## Arborescence\n\n```\nquantum-tetris/\n├── crates/\n│   ├── game/              # Bevy — binaire + cdylib WASM\n│   └── quantum/           # IR circuits + backends + tests\n├── docs/\n│   ├── index.html         # Jeu + guide (anglais par défaut)\n│   ├── circuits/*.png     # Diagrammes de circuits\n│   ├── QUANTUM.md         # Référence circuits \u0026 mappings\n│   ├── AUDIT.md           # Journal d'audit C5/C6 \u0026 vérification\n│   └── WASM.md            # Notes build navigateur\n├── scripts/\n│   ├── build_wasm.sh\n│   ├── clean_build.sh\n│   └── render_circuit_diagrams.py\n└── .github/workflows/\n    ├── ci.yml\n    └── pages.yml          # WASM + diagrammes → GitHub Pages\n```\n\n---\n\n## CI / déploiement\n\n| Workflow | Déclencheur | Actions |\n| --- | --- | --- |\n| **CI** | push / PR `main` | fmt, clippy, tests, check WASM |\n| **Pages** | push `main` | Build WASM release, PNG circuits, deploy `docs/` |\n\nEn ligne : [thepriben.github.io/quantum-tetris/](https://thepriben.github.io/quantum-tetris/)\n\n---\n\n## Projets liés\n\n- [**RustQIP**](https://github.com/Renmusxd/RustQIP) — le simulateur statevector `qip` qui alimente le backend quantique par défaut (`RustQipBackend`). Quantum Tetris en est une vitrine ludique, exécutée nativement comme dans le navigateur via WASM.\n\n---\n\n## Licence\n\nMIT — [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthepriben%2Fquantum-tetris","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthepriben%2Fquantum-tetris","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthepriben%2Fquantum-tetris/lists"}