Indikátor strikes ukáže "xx" už po první nule #32

Open
opened 2026-08-20 17:52:39 +02:00 by david-spacil · 0 comments
Owner

Popis

V game() (kostky/kostky.py, cca ř. 275–281) se počítá indikátor nulových hodů:

if len(players[pointer]) > 0:
    if players[pointer][-1:][0] == 0:
        strikes = "x"
        if players[pointer][-2:][0] == 0:
            strikes += "x"

Když má hráč v players[pointer] jediný záznam, vrátí [-2:][0] tentýž prvek jako [-1:][0] — slice [-2:] na jednoprvkovém seznamu je celý ten seznam. Vnitřní podmínka je tedy splněná automaticky a zobrazí se xx, přestože hráč má za sebou teprve jednu nulu.

Reprodukce

  1. Spustit hru, první hráč hned v prvním tahu skončí s nulou (k při skóre 0, nebo hod bez hodnoty).
  2. Až na něj znovu přijde řada, v hlavičce je Na tahu je X (0xx/10000).
  3. Očekáváno: 0x/10000 — druhá nula ještě nepadla.

Dopad

Jen zobrazení. Samotné vynulování skóre po třech nulách je v pořádku, protože používá vlastní kontrolu:

last_two = players[pointer][-2:]
if len(last_two) > 1:

Hráč ale podle hlavičky vidí, že je „o jeden hod od vynulování", i když má ve skutečnosti hody dva.

Návrh opravy

if len(players[pointer]) > 0:
    if players[pointer][-1] == 0:
        strikes = "x"
        if len(players[pointer]) > 1 and players[pointer][-2] == 0:
            strikes += "x"

Kontext

Narazil jsem na to při přenosu těchto mechanik do repa dice-counter, kde jsem opravu už udělal (větev agents/claude/tri-nuly-a-vitez).

## Popis V `game()` (`kostky/kostky.py`, cca ř. 275–281) se počítá indikátor nulových hodů: ```python if len(players[pointer]) > 0: if players[pointer][-1:][0] == 0: strikes = "x" if players[pointer][-2:][0] == 0: strikes += "x" ``` Když má hráč v `players[pointer]` jediný záznam, vrátí `[-2:][0]` **tentýž** prvek jako `[-1:][0]` — slice `[-2:]` na jednoprvkovém seznamu je celý ten seznam. Vnitřní podmínka je tedy splněná automaticky a zobrazí se `xx`, přestože hráč má za sebou teprve jednu nulu. ## Reprodukce 1. Spustit hru, první hráč hned v prvním tahu skončí s nulou (`k` při skóre 0, nebo hod bez hodnoty). 2. Až na něj znovu přijde řada, v hlavičce je `Na tahu je X (0xx/10000).` 3. Očekáváno: `0x/10000` — druhá nula ještě nepadla. ## Dopad Jen zobrazení. Samotné vynulování skóre po třech nulách je v pořádku, protože používá vlastní kontrolu: ```python last_two = players[pointer][-2:] if len(last_two) > 1: ``` Hráč ale podle hlavičky vidí, že je „o jeden hod od vynulování", i když má ve skutečnosti hody dva. ## Návrh opravy ```python if len(players[pointer]) > 0: if players[pointer][-1] == 0: strikes = "x" if len(players[pointer]) > 1 and players[pointer][-2] == 0: strikes += "x" ``` ## Kontext Narazil jsem na to při přenosu těchto mechanik do repa `dice-counter`, kde jsem opravu už udělal (větev `agents/claude/tri-nuly-a-vitez`).
Sign in to join this conversation.