Ručně psané SQL nad pěti tabulkami, žádné ORM.
- hry ukazují na players.id, nikdy na jméno, takže se přejmenování
propíše i do starých her
- párování hráčů napříč hrami přes normalizovaný klíč (trim, casefold),
plus slučování pro případ překlepu
- zapisuje se každý tah hned, ne až na konci — rozehraná hra se po pádu
serveru najde podle stavu a dá se v ní pokračovat
- součty se neukládají nikde, stav hry se rekonstruuje načtením tahů
- časy jako ISO text, sqlite3 vlastní adaptéry pro datetime zavrhl
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Pravidla byla propletená se vstupem a výstupem (add_score se uprostřed
zastavovalo na input()), takže nešla testovat ani použít z webu.
- core.Game drží stav a pravidla, nic nevypisuje a na nic se neptá
- součty jsou vždy odvozené z tahů, díky tomu je undo() jen zahození
posledního tahu — funguje i pro vracení vynulování
- vynulování se ukládá jako hodnota 0 s příznakem reset místo záporného
tahu, aby do historie nepadala čísla, která nikdo nehodil
- zero_streak() je jediný zdroj pravdy pro pravidlo i pro indikátor x/xx
a počítá se od posledního vynulování
- pořadí na tahu plyne z počtu zápisů, globální pointer zmizel
- dice.py zůstává navenek stejné, jen deleguje na Game
- 15 testů nad pravidly
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sliceování [-2:][0] vrátí u seznamu s jediným záznamem tentýž
prvek jako [-1:][0], takže po první nule se zobrazilo rovnou "xx".
Nahrazeno přímým indexováním s kontrolou délky.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Převzato 1:1 z kostky/kostky.py a přizpůsobeno počitadlu:
- volitelné finální skóre při zakládání hry (výchozí 10 000)
- vynulování skóre po třech nulových hodech za sebou
- indikátor "x"/"xx" u hráče na tahu
- check_win() + to_sorted_tuple() + win() s výslednou tabulkou
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>