Audamir

časť 15

Čo sa dá povedať o jednej partii: záznam, analýza a skladba

Partia na 1,3 kB, graf šance na výhru, ktorý vie rozlíšiť šťastie od rozhodnutia, a skladba, ktorú zatiaľ nikto nepočul. Tri veci, ktoré vyrastajú z jedného nápadu: hra je deterministická.

· 10 min čítania

Pôvodný Dice Wars mal tlačidlo História, ktoré po hre ukázalo, ako sa partia vyvíjala (podľa dobových recenzií). V Audamire z tohto tlačidla vznikli tri veci, ktoré sa dajú napísať jednou vetou: partia sa dá prehrať, partia sa dá rozobrať a partia sa dá zahrať ako skladba. Prvé dve existujú, tretia je zatiaľ nápad s presným plánom, ako zistiť, či stojí za to.

Všetky tri majú jeden základ, o ktorom sa hovorilo v článku o testovaní: celá náhoda hry je odvodená zo stavu, takže tá istá partia dopadne vždy rovnako.

Záznam: partia na jeden riadok

Partia sa dá opísať štyrmi vecami: nastaveniami, seedom, „soľou“ hodov a rozhodnutiami človeka. Všetko ostatné (hody, ťahy súperov, náhodné posily) sa dá z nich vypočítať. Typická partia z meraní (300 náhodných nastavení, nie len Kniežatstvá[1]) má 140 rozhodnutí, 1,3 kB ako JSON a 1,7 kB ako odkaz (najväčšia mala 5,5 kB). Rozhodnutie je jeden zápis s číslami: a12-13 je útok z územia 12 na 13, e koniec ťahu, r1 odpoveď na otázku o prehodení.

Takto vyzerá skutočný záznam jednej krátkej partie, rozfarbený podľa častí:

Anatómia záznamu: jedna partia ako jeden riadok textuSkutočný záznam krátkej partie (623 bajtov textu) zalomený na riadky a rozfarbený na časti: nastavenia hry, seed, soľ hodov, rozhodnutia hráča, rozhodnutia súpera a obal so kontrolami. Pod ním šípka k trom mapám tej istej partie, ktoré sa z neho dajú vypočítať: na začiatku je 21 políčok hráča proti 21 súperovým, na začiatku tretieho kola 29 proti 13 a na konci piateho kola 42 proti 0. Nakoniec porovnanie veľkosti: celý záznam má 623 bajtov, jedna snímka obrazovky 90 286 bajtov.Jedna partia = jeden riadok textuskutočný záznam (formát 2), zalomený na riadky{"v":2,"g":1,"r":2,"mode":"free","cfg":{"size":"small","shape":"square","opponents":1,"maxDice":6},"seed":"LLF4A5","salt":"EXEU9X","t":1793964618274,"s":[{"d":"a18-19 a40-32 a22-23 ea6-2 a5-1 a1-0 a23-24 a32-33 a11-10 a31-30 a20-19a27-18 a14-15 a24-25 a19-28 a25-16 a16-17 e a18-19a19-28 a33-34 a34-35 a35-26 a26-25 a28-36 e a10-19a30-38 a38-37 a37-36 a36-28 a28-29 a17-9 e a9-17a15-16 a11-10 a10-4"},{"b":"ai2@2","d":"a0-1 a10-19a19-18 a1-2 a29-30 e a36-28 a28-19 a26-25 a25-16 ea37-36 a36-28 a28-19 a19-20 e a4-10 a16-17 e"}],"cp":"1e8d5xi,p7s5gn,n4ckr,4x9mj6","res":{"r":"won","n":5,"h":"1x1ohrl","w":"conquest"}}Čo je ktorá časť (bajty)nastavenia66 Blen to, čo sa líši od základu: malá mapa, štvorcovépolíčka, jeden súper, najviac 6 kociek na políčkuseed16 Bčíslo hry: z neho hra vždy vyrobí tú istú mapusoľ hodov16 Bz nej a zo stavu hry vznikne každý hod kockamirozhodnutia hráča257 Ba18-19 = útok z políčka 18 na 19, e = koniec ťahurozhodnutia súpera129 Btie isté značky; ai2@2 = AI úrovne 2 (formát 2)obal a kontrola139 Bformát a verzia pravidiel, čas, odtlačky mapy po kolácha výsledok: podľa nich hra overí, že partia dopadla rovnakoZ toho sa dá vypočítať všetko ostatné:hody kociek, posily a mapa po každom ťahuzačiatok · 1. kolo21 : 21 políčok3. kolo29 : 13 políčokkoniec · 5. kolo42 : 0 políčokhráčsúpercelý záznam623 Bjedna snímkaobrazovky (webp)90 286 B
Skutočný záznam jednej krátkej partie vo formáte 2 (hra 0.119.0 zo 6. 11. 2026): malá mapa so štvorcovými políčkami, dvaja hráči, 5 kôl, 623 bajtov. Partiu zahral nástroj hry (zástupná AI na mieste hráča), nie človek. Formát 2 zapisuje aj rozhodnutia súperov, aby sa starý záznam prehral rovnako, nech sa AI v hre zmení; text článku opisuje stav z 20. 10., keď ťahy súperov počítala AI znova. Tento záznam je zámerne krátky: typická partia vo formáte 2 má asi 3,2 kB. Mapy kreslí vykresľovač hry (bez počtu kociek), snímka na porovnanie je snímka mapy z tohto webu.

Z toho vyplývajú veci, ktoré hráč uvidí ako tlačidlá:

  • Opakovanie v prehrávači: Prehrať a Pozastaviť, krok vpred a vzad, rýchlosť 0,5× až 8×, posuvník na kolo. Prehranie partie trvá asi 12 ms.
  • Zdieľanie odkazom #R=… alebo súborom .dwr.json. Nič sa nikam nenahráva, odkaz nesie celý záznam.
  • Kopírovať výsledok: jeden riadok a odkaz, ako pri Wordle. Napríklad (preložený príklad z dokumentácie) Audamir · denná výzva 2026-10-19 · výhra za 12 kôl · 1 420 bodov · šťastie +2,1.
  • Hlásenie chyby nesie rozohranú partiu ako riadok Record:, takže chyba sa dá zopakovať.
  • Posledných 20 partií sa uchováva v zariadení hráča.

Dve pasce, ktoré záznam odhalil

Dvojité stlačenie „Koniec ťahu“. Keby sa druhé stlačenie zaznamenalo ako druhé rozhodnutie, prehrávanie by skončilo ďalší ťah. Druhé stlačenie sa preto nepočíta.

Hráč sa pozrie na hod, potom odíde. Partia uložená uprostred útoku nesie „rozohraný útok“, ktorý sa po obnove zopakuje s rovnakým hodom, aby hráč nemohol po pohľade na výsledok zvoliť iný útok. Záznam to musí zvládnuť: rozhodnutia z neukončeného útoku sa z neho pri obnove vyberú a znova sa vyžiadajú.

Zmluva s minulosťou, druhýkrát

Rovnako ako pri generátore území vzniká pri zázname zmluva: ak sa zmenia pravidlá alebo AI, staré záznamy sa nedajú prehrať rovnako. Preto každý nesie číslo verzie pravidiel (RULES_VERSION) a záznam z inej verzie sa označí ako zastaraný a neprehráva sa. Pravidlo pre vývojára je v zozname: s každou zmenou, ktorá môže zmeniť partiu, zvýš číslo verzie. A pretože sa na to dá zabudnúť, stoja za tým zlaté záznamy: test prehrá uložené partie a ak sa výsledok zmenil bez zvýšenia čísla, zlyhá a povie, čo urobiť.

Pri revízii sa našla jedna závažná chyba. Uložená hra pri „Koniec ťahu“ niesla token konca ťahu, kým jej snímka ešte zodpovedala ťahu človeka. Po „Pokračovať“ sa ťah zahral znova, pridal sa druhý token a prehrávanie sa pokazilo. Oprava je v poradí: token sa zapíše až po uložení.

Analýza: kde sa partia rozhodla

Keď sa partia dá prehrať, dá sa z nej počítať. Tlačidlo Analýza (na konci hry, v karte záznamov a v prehrávači) odpovie na dve otázky: kde sa hra rozhodla a či to bolo šťastie alebo rozhodnutie.

Hlavná veličina je šanca na výhru po kolách. Počíta sa metódou Monte Carlo: z uloženej pozície z každého kola sa zvyšok hry odohrá mnohokrát a šanca je podiel partií, ktoré tím hráča vyhrá. Podobné grafy poznajú používatelia šachových serverov z rozborov partií.

Dôležitá je presná definícia. Za hráča hrá zástupná AI (proxy) úrovne 2, súperi hrajú na úrovni hry. Číslo teda znamená: tvoja šanca, keby za teba odtiaľto hrala táto AI. Nie je to výrok o tom, čo by urobil lepší alebo horší hráč.

Šťastie plus rozhodnutie

Zlomový útok (turning point) sa rozloží na dve časti. Pre útok so šancou p sa vyhodnotia tri pozície: pred útokom (V0), po výhre (Vw) a po prehre (Vl). A potom:

zmena     = Vreal − V0
očakávané = p · Vw + (1 − p) · Vl
šťastie   = Vreal − očakávané      (čo kocky pridali k tomu, čo sľubovali šance)
rozhodnutie = očakávané − V0       (akú hodnotu mal útok podľa šancí)
zmena     = šťastie + rozhodnutie

Je to tá istá myšlienka, ktorú pozná každý, kto počíta očakávanú hodnotu: útok so šancou 40 % môže byť dobrým rozhodnutím a aj tak sa prehrať. Analýza to vie povedať: pri každom zlomovom bode ukáže osobitne šťastie a osobitne rozhodnutie.

Takto to vyzerá na jednej skutočnej partii:

Šanca na výhru po kolách jednej partie a jeden zlomový bodČiara šance hráča na výhru na začiatku každého z 22 kôl jednej skutočnej partie: 40 %, 32 %, 19 %, 39 %, 27 %, 39 %, 44 %, potom v 8. kole 85 % a od 9. kola takmer vždy 100 %; okolo čiary je pás štandardnej chyby simulácií. Zlomový bod je útok v 7. kole so šancou 72 %, ktorý vyšiel a zdvihol šancu na výhru z 58 % na 81 %, teda o 23 bodov. Pod grafom je tá zmena rozložená na tri stĺpce: zmena +23 bodov je šťastie +8 bodov (kocky vyšli lepšie, než sľubovali šance) a rozhodnutie +16 bodov (útok mal už podľa šancí hodnotu); úsečka pri každom stĺpci je štandardná chyba.šanca hráča na výhru po kolách0 %25 %50 %75 %100 %15101520konieckolopás = ± chyba simuláciízlom: útok v 7. koleso šancou 72 % vyšiel,šanca na výhru 58 % → 81 %Z čoho sa zlom skladázmena šance = šťastie + rozhodnutie (v bodoch)+23zmena+8šťastiečo kocky pridalinad to, čo sľubovali šance+16rozhodnutiečo útok sľubovalpodľa šancí=+čísla sú zaokrúhlené, presne +23,4 = 7,9 + 15,5; úsečka = chyba simulácií
Analýza jednej skutočnej partie (hra 0.119.0, 6. 11. 2026): malá mapa so štvorcovými políčkami, dvaja hráči, 22 kôl, číslo hry BAE8MR, iná partia než na obrázku záznamu. Partiu zahral nástroj hry (zástupná AI na mieste hráča), nie človek, a analyzoval ju nástroj analýzy hry: za hráča hrá zástupná AI úrovne 2, súper hrá na úrovni hry (2), z každého kola sa zvyšok hry odohral 16- až 64-krát, spolu 1 797 simulácií. Číslo teda hovorí, aká by bola šanca hráča, keby od daného kola hrala za neho táto AI. Pás okolo čiary a úsečky pri stĺpcoch sú štandardná chyba simulácií. Čísla pri stĺpcoch sú zaokrúhlené na celé body.

Šum, ktorý rozpráva príbehy

Analýza sa pokazila na jednej veci, a vďaka nej má dnes svoje pravidlo. V reálnej partii našla „zlomový bod“ so zmenou +8 bodov, ktorý bol len šumom z náhodných simulácií. Preto platí, že zlomový bod musí byť významný: zmena šance musí byť aspoň dvojnásobkom svojej štandardnej chyby, ktorá sa počíta spárovane zo simulácií so spoločnými hodmi („common random numbers“). Rozdelenie na šťastie a rozhodnutie sa slovne uvádza len vtedy, keď je aspoň 3 body a 1,5 násobok vlastnej chyby.

Dá sa jej veriť?

Pozerať sa na graf šance a veriť mu je lacné. Preto sa kalibrovala: jej predpovede sa porovnali so skutočnými výsledkami na 210 hrách.

  • Brierovo skóre 0,0452 (0 je dokonalé, 0,25 je neustále hádanie 50 %).
  • Bez skreslenia: priemerná predpovedaná šanca (51 %) sa rovná skutočnému podielu výhier (51 %).
  • Šanca v prvom kole sa od podielu výhier rovnakej AI na iných mapách líši o +0,9 ± 1,5 %.
  • Nezávislá vzorka dala 0,0431. Skupina predpovedí 80 až 90 %, ktorá v prvej vzorke vyzerala zle (95 % pri predpovedi 85 %), bola výsledkom náhody: v druhej vzorke sa splnilo 80 %.

Výpočet beží vo Workeri 0,6 až 1,4 s. Pri simulovanom pomalom procesore (telefón) to bolo 3,3 až 6,1 s. Rovnaký záznam dá vždy rovnaký graf: plán výpočtu je funkciou záznamu, nie hodín.

Analýza je hotová, overená a od 20. októbra zlúčená do hlavných vetiev hry (dev aj main). Otvorené otázky dostali odpovede a tie sú zapracované: úroveň proxy 2 ostáva, rozprávačka (Avatar[2]) ponúkne analýzu po nevyhratej hre a analýza je všade, kde existuje záznam hry.

Skladba z jednej partie

Tretia vec je ešte len nápad, a práve preto je pri nej vidieť, ako sa v projekte zaobchádza s nápadmi. Predstava je takáto: každá akcia v hre vydá zvuk a zvuky sa zložia do skladby, ktorá sleduje, ako partia išla. Niekoľko štýlov (techno, rock, ambient), dá sa vypnúť, počas hry hrá krátky záznam predchádzajúceho kola a po hre sa dá skladba prehrať alebo uložiť. Odkaz na záznam je zároveň skladba: nič sa neukladá, skladba je funkcia partie.

V pláne rozšírení (ROADMAP) je z toho nápadu pomerne nezvyčajný dokument:

  • Hudba, nie hluk. Udalosti sa kvantizujú na rytmickú mriežku. Jedna tónina a stupnica na hru zo seedu. Jedno kolo je jeden takt. Každý hráč má hlas (farba hráča určuje zafarbenie tónu). Výška útoku vyplýva z jeho šance: pravdepodobný zásah znie konzonantne, prekvapenie ostro. Výhry sa riešia do akordových tónov, straty padajú, vyradenie hráča je kadencia.
  • Hustota. Partia má 400 až 600 útokov. Skladateľ ich riedi: najprv vlastné udalosti, potom veľké zlomy, najviac okolo 16 udalostí na takt.
  • Poctivé obmedzenia. Techno, chiptune a ambient sa dajú dobre syntetizovať z oscilátorov, rock prijateľne. „Klasika“ bez zvukových vzoriek bude znieť ako hracia skrinka a pad, orchester sa nesľubuje.
  • Slučka, ktorá rastie, sa zmení na hluk asi po desiatich kolách, preto počas hry zahrá najviac jednotaktový prehľad predchádzajúceho kola.

A potom pravidlo, ktoré robí z nápadu projekt: prototyp bez rozhrania. Plán počíta s nástrojom tools/score.js (zatiaľ neexistuje), ktorý by zahral pár partií, zapísal súbory MIDI v troch štýloch a autor by si ich vypočul v ľubovoľnom prehrávači. Potom sa rozhodne, či sa pokračuje. Žiadne rozhranie, kým si autor prototyp nevypočuje. Kvalita zvuku rozhodne všetko.

Je to rovnaký princíp ako pri Boss duel: skús najmenšiu vec, ktorá nápad zabije, ak je zlý.

Čo si z toho odnášam

  • Determinizmus je najlepšia investícia. Z jedného rozhodnutia (náhoda zo stavu) vyšli záznam, opakovanie, zdieľanie, hlásenie chýb, testovanie aj analýza.
  • Zmluvy s minulosťou treba zapísať do testu. Číslo verzie bez testu je prianie.
  • Meraj aj to, čo vyzerá ako meranie. Graf s dvomi desatinnými miestami nie je dôkaz. Kalibrácia predpovedí áno.
  • Šum rozpráva príbehy. Bez pravidla významnosti ti simulácia ukáže „zlomy“, ktoré sú len náhoda.
  • Nápady potrebujú vstupnú podmienku. Pri hudbe je to „najprv sa to musí dať počúvať“.

Zdroje a poznámky

  • Záznam: docs/DESIGN.md §28 (formát, overenie, revízia), nástroj node tools/replay.js --games 300 --check.
  • Analýza: docs/DESIGN.md §34 a docs/TUNING.md §26 (stav k 20. 10. 2026; zlúčené do dev aj main v ten istý deň); čísla kalibrácie z dokumentácie a z poznámok vývoja (Brierovo skóre 0,0452 a 0,0431, 210 hier, doby 0,6 až 1,4 s a 3,3 až 6,1 s).
  • Skladba: docs/ROADMAP.md, kapitola 15 (návrh a prototyp, nič z toho ešte nie je postavené).
  • Tlačidlo História v pôvodnej hre: podľa dobových recenzií (JayIsGames, Gigazine), uvedených v pláne rozšírení.
  • Obrázky (orientačné, z dnešného stavu hry, nie z 20. 10.; hra 0.119.0, dev, commit 25bc3d57, 6. 11. 2026): obe partie zahral nástroj hry so zástupnou AI na mieste hráča (playRecorded z tools/realms/kastgard/games/stacks/replay.js), nie človek. Záznam na prvom obrázku je skutočný záznam formátu 2 (malá mapa, štvorcové políčka, jeden súper, seed LLF4A5, 623 B), jeden z najkratších zo 240 skúšaných (vybraný spomedzi vyhratých partií, ktoré nezačínajú koncom ťahu); prehrá sa (Replay.run) na kontrolné odtlačky aj výsledok, ktoré nesie, a tri mapy kreslí Scenario.svg pri jeho prehrávaní. Veľkosť snímky obrazovky je súbor assets/shots/sk/kastgard-map.webp tohto webu (90 286 B); typická partia vo formáte 2 (3,2 kB) je z docs/RECORD-V2.md §0. Graf šance je z inej partie (číslo hry BAE8MR, rovnaký druh nastavení, 22 kôl, 2 249 B záznamu), vybranej zo zhruba 200 partií, ktoré sa zahrali a analyzovali, ako jedna s jasným zlomom, v ktorom je šťastie aj rozhodnutie; čísla vrátil príkaz node tools/realms/kastgard/games/stacks/analysis.js --record BAE8MR.json --json (1 797 simulácií, pri opakovaní rovnaké). Zlom je útok v 7. kole so šancou 72 % (58 % → 81 %, šťastie +7,9 a rozhodnutie +15,5 bodu).

Poznámky

  1. Do verzie 0.65.6 z 31. októbra 2026 sa volal Klasik. ↩︎
  2. Do verzie 0.80.1 z 1. novembra 2026 sa Avatar volal Hero Dice (pozri Z Hero Dice na Avatar (pripravovaný článok č. 39)). ↩︎