Jdeme na to s Urwigem - 11. Rozhodování I. (Větvení kódu)

Stejně jako život nebývá přímočarý, ale různě se kroutí a nabízí varianty, tak i ve wherigu si málokdy vystačíme jenom s jednou příběhovou linií. Aby byla hra zajímavá, musíme dát hráči možnost se v určitých okamžicích rozhodovat o dalším postupu a tím pádem budeme potřebovat větvit kód podle hráčovy volby, případně podle jiných kritérií. Možnosti interakce (dialogu) s hráčem si probereme příště, dnes se zaměříme výhradně na větvení kódu a s tím související otázky.

Akce Když/jinak

Základním prostředkem pro větvení kódu v Urwigu je akce Když/jinak. Umožňuje nám vytvořit v jednom okamžiku několik paralelních větví kódu a určit, za jakých podmínek se ta která větev vykoná.

Podmínka

Po přetažení akce do diagramu vznikne jakýsi zárodek s jednou jedinou větví nadepsanou „Jinak“. Tato větev není ničím zajímavá a kód, který je v ní obsažen, se vykoná vždy (tedy jako kdyby tam žádná akce Když/jinak nebyla). Abychom z ní opravdu udělali správnou rozhodovací větev, musíme na její začátek přidat podmínku.

K zadání podmínky slouží většina možností z levého panelu nazvaného Výrazy. Přesunutím požadovaného výrazu do záhlaví vznikne podmíněná větev, jejíž kód se vykoná pouze v případě, že je podmínka splněna. Podmíněná větev je uvozena textem „Když“.

Přidání dalších větví

Pomocí klepnutí na malé tlačítko „+“ v záhlaví akce (pokud na něm necháme myš chvíli spočinout, objeví se v bublině nápis „Přidat větev“) můžeme přidávat další větve. Platí pravidlo, že počet větví „Když“ není omezen, zatímco větev „Jinak“ může být maximálně jedna a musí se nacházet úplně vpravo.

Můžeme tedy udělat akci Když/jinak, která:

  • obsahuje pouze jednu větev „Jinak“ - kód ve větvi se vykoná vždy, stejně jako kdyby byl uveden samostatně mimo akci,
  • obsahuje pouze jednu větev „Když“ - kód ve větvi se vykoná pouze v případě, že je podmínka splněna, v opačném případě je celá akce Když/jinak vynechána a běh pokračuje kódem následujícím po akci,
  • obsahuje jednu větev „Když“ a jednu větev „Jinak“ - kód ve větvi „Když“ se vykoná v případě, že je podmínka splněna, pokud splněna není, vykoná se kód ve větvi „Jinak“,
  • obsahuje několik větví „Když“ - vykoná se pouze kód v té větvi, jejíž podmínka je splněna, pokud není splněna podmínka žádné větve, je celá akce Když/jinak vynechána a běh pokračuje kódem následujícím po akci,
  • obsahuje několik větví „Když“ a jednu větev „Jinak“ - vykoná se pouze kód v té větvi, jejíž podmínka je splněna, pokud není splněna žádná podmínka, vykoná se kód ve větvi „Jinak“.

Na druhou stranu NEMŮŽEME udělat akci Když/jinak, která:

  • obsahuje více jak jednu větev „Jinak“,
  • obsahuje větev „Když“, která nemá uvedenu podmínku,
  • obsahuje jednu větev „Jinak“, která ale není umístěna úplně vpravo.

Co když jsou v jednom okamžiku splněny podmínky z více větví současně?

Každá větev „Když“ může mít uvedenu libovolnou podmínku. Podmínky v jednotlivých větvích spolu nemusí být v žádném souladu. Může se tedy klidně stát, že při vyhodnocování jsou splněny podmínky více větví současně. Vadí to nějak? Nevadí. Větve jsou vyhodnocovány postupně zleva doprava. Jakmile se narazí na první větev splňující podmínku, je vykonán její kód a ostatní větve jsou ignorovány. Na to je potřeba myslet při sestavování pořadí větví.

Mějme např. tři větve:

  • A s podmínkou „proměnná = 3“,
  • B s podmínkou „proměnná > 4“,
  • C s podmínkou „proměnná > 1“.

Pokud je poskládáme v pořadí ABC, pak může dojít k těmto variantám: V případě, že bude platit „proměnná = 5“, pak se vykoná kód větve B. Pro „proměnná = 3“ se vykoná kód větve A a pro „proměnná = 2“ se vykoná kód větve C.

Jak to však bude, pokud je poskládáme v pořadí ACB? Pro „proměnná = 3“ se vykoná větev A a pro „proměnná = 2“ se vykoná C jako v předchozím případě. Ale pro „proměnná = 5“ se vykoná také větev C a nikoliv B. Proč? Protože větev C se vyhodnotí dříve a 5 > 1, takže podmínka je splněna. Na větev B už nedojde.

Ještě hůře dopadneme, pokud větve poskládáme v pořadí CBA. Ve všech uvedených případech se vykoná větev C a na větve B a A se nedostane.

Jak vidíme, při sestavování podmínek do akce Když/jinak si musíme dát dobrý pozor na to, co děláme. Jinak by se nám mohlo stát, že některými větvemi nebude mít hra vůbec šanci projít.

Odebrání větve

Již přidanou větev můžeme kdykoliv odebrat tak, že na ni klepneme levým tlačítkem myši a stiskneme klávesu Delete. Také můžeme klepnout pravým tlačítkem myši a ze zobrazeného kontextového menu zvolit příkaz Odstranit. Větev je odebrána včetně případného kódu.

Změna pořadí větví

O kousek výše jsme si ukázali, že pořadí větví může hrát důležitou roli. Co dělat, pokud už máme větve zadefinované, ale chceme dodatečně změnit jejich pořadí? Jednoduše použijeme myš a pomocí operace drag&drop uchopíme libovolnou větev a přesuneme ji na nové místo.

Sbalení větve

I jednotlivé větve můžeme podobně jako celé akce sbalit klepnutím na malý trojúhelníček vlevo od jejich nadpisu. To je obzvlášť výhodné ve chvíli, kdy je větví hodně nebo mají komplikovaný obsah a orientace v diagramu začíná být nepřehledná.

Zakázání větve

A stejně jako akci, také větev můžeme zakázat a pak zase případně povolit. Opět to provedeme pomocí pravého tlačítka myši, když z kontextového menu vybereme příkaz Zakázat. Celá větev nám zezelená a při vyhodnocování nebude vůbec brána v potaz.

Náhodné rozhodnutí

Akci Náhodné rozhodnutí lze s výhodou použít v případě, že chceme další kód větvit podle výsledku nějakého náhodného jevu. Například ve hře sdělíme hráči: „Hoď si korunou.“ Výsledkem takového hodu je jedna ze dvou možností - panna nebo orel, přičemž obě mají stejnou pravděpodobnost - 50%. Dalším příkladem je hod kostkou - zde je výsledkem jedna ze šesti možností, z nichž každá má stejnou pravděpodobnost výskytu - cca 16,67%.

Obě tyto situace v Urwigu jednoduše vyřešíme pomocí akce Náhodné rozhodnutí. Jakmile ji přidáme do diagramu, zjistíme, že se nám vytvořila struktura obdobná akci Když/jinak se dvěma větvemi - obě jsou nadepsány „1/2 (50%)“. To znamená, že každá větev nastane s padesátiprocentní pravděpodobností, což odpovídá hodu mincí. Pokud pomocí tlačítka „+“ přidáme čtyři další větve, dostaneme se do situace, kdy budeme mít šest větví, přičemž každá nastane s pravděpodobností 1/6, což odpovídá hodu kostkou.

Váha

Ne vždy ale budeme chtít, aby všechny větve nastaly se stejnou pravděpodobností. Předpokládejme, že necháme hráče hledat čtyřlístek a náhodně určíme, jestli ho našel nebo ne. Máme tedy dvě větve - hráč čtyřlístek našel a hráč čtyřlístek nenašel. Je jasné, že nalézt čtyřlístek je vzácné, takže určitě není vhodné, aby tato větev měla pravděpodobnost 50%, stejně jako jeho nenalezení. Budeme chtít, aby pravděpodobnost nalezení byla odpovídajícím způsobem malá.

I tuto možnost nám Náhodné rozhodnutí nabídne. Po přesunutí do diagramu vzniknou dvě větve „1/2 (50%)“. Označíme si tu z nich, která bude představovat NENALEZENÍ čtyřlístku. V pravém panelu vidíme parametr Váha, který má v tuto chvíli hodnotu 1. Právě váha určuje, jak moc pravděpodobná je která varianta. Pokud zvýšíme váhu této větve na 2, můžeme se podívat, jaký vliv to mělo na celé náhodné rozhodnutí. Vidíme, že pravděpodobnost označené větve se změnila na „2/3 (66,67%)“ a pravděpodobnost druhé na „1/3 (33,33%)“. Pokud chceme nerovnováhu ještě zvýraznit, můžeme zvýšit váhu na 3, pak bude rozdělení pravděpodobnosti v poměru „3/4 (75%)“ proti „1/4 (25%)“.

Váhu samozřejmě můžeme nastavovat u kterékoliv větve. Co by se stalo, kdybychom zvýšili váhu druhé větve (nalezení čtyřlístku) na 2? Pravděpodobnosti by se změnily na „3/5 (60%)“ a „2/5 (40%)“.

A jak fungují váhy u rozhodnutí s více než dvěma větvemi? Velice jednoduše - každá větev má pravděpodobnost vypočítanou ze vzorečku P=V/(ƩV), kde V je váha konkrétní větve a ƩV je součet vah všech větví. Podívejme se na naše předcházející příklady: U základní verze s dvěma větvemi počítáme pro každou z nich P=1/(1+1)=1/2. Po zvýšení váhy jedné větve na 2 to bude P=2/(2+1)=2/3, zvýšení na 3 způsobí výsledek P=3/(3+1)=3/4 a v posledním příkladu pak dostaneme P=3/(3+2)=3/5.

Obdobně pro tři větve: Základní verze dává P=1/(1+1+1)=1/3, zvýšíme-li váhu jedné větve na 2, dostaneme pro ni P=2/(2+1+1)=2/4 a P=1/(2+1+1)=1/4 pro obě zbylé.

Věřím, že teď je situace již zřejmá. Balancováním s váhou u jednotlivých větví můžeme docílit vhodného rozdělení pravděpodobnosti. Nepodaří se nám sice docílit libovolné procentní hodnoty, vždy bude výsledkem nějaký zlomek, ale myslím, že pro účely hry jsou tyto možnosti dostatečné.

Kontrolní otázka na závěr: Jaká bude pravděpodobnost jednotlivých větví v příkladu s čtyřlístkem, pokud u obou nastavíme váhu 3?

 

Pokračování: Jdeme na to s Urwigem - 12. Rozhodování II. (Podmínky)

VytisknoutE-mail

Komentáře mohou psát jen registrovaní uživatelé.