6. Petr v bludišti <<< Obsah >>> 8. Samá příšera
Zůstaneme ještě u programu Cesta z minulé kapitoly. Program upravíme tak, abychom Petříka v bludišti ovládali klávesnicí namísto aby hledal cestu sám. Budeme zkoušet více metod ovládání, necháme si je všechny v programu uschované pro možnost porovnání. Uschováme si i metodu, ve které Petřík hledá východ sám.
Přetáhněte do hlavního cyklu programu
ze skupinky řízení programu
prvek skupina
.
Prvek skupina nic nedělá, slouží jen ke shluknutí úseku
programu do jednoho místa. Přemístěte do něj všechny
příkazy, které jsou nyní v hlavním cyklu: prvek otočení
vpravo, cyklus pro nalezení průchodného políčka a příkaz
pro provedení kroku (zachovejte původní pořadí prvků).
Skupinu sklapněte a připište k ní poznámku Petřík jde sám. Tím jsme si metodu automatického vyhledání
východu uschovali do jedné skupiny, aby se nám "nepletla
dohromady" s ostatními metodami, které budeme vytvářet.
Zkuste program pro kontrolu spustit. Měl by fungovat stejně
jako před úpravou.
Skupinu vyberte kliknutím myší na její
ikonku. Na panelu nástrojů zapněte tlačítko Vypnout .
Skupina i všechny prvky v ní zešednou. Tato funkce nám
umožňuje vypínat části programu pokud je zrovna v programu
nepotřebujeme. Když program spustíte, uvidíte, že Petřík
pouze stojí v levém dolním rohu a nic se neděje. Program se
chová tak, jakoby tam skupina s příkazy vůbec nebyla.
Naši novou část programu budeme
konstruovat uvnitř hlavního cyklu programu, hned pod
předcházející skupinou. Využijeme nový konstrukční prvek
- vícestupňové
větvení příkazů (mezi programátory
někdy označován jako "hrábě"). Najdete ho ve
skupince řízení
programu
. Položte ho do
hlavní smyčky pod skupinu Petřík jde sám.
Vícestupňové větvení příkazů slouží k větvení programu na více částí v závislosti na hodnotě proměnné či výrazu. Obvyklým použitím je větvení podle číselné hodnoty. Později budeme větvení používat i pro jiné typy dat, jako například texty.
Prvek větvení obsahuje další čtyři
prvky. Do prvního prvku, pro hodnotu výrazu , vkládáme proměnnou či výraz, podle kterého se
má větvení provést. My sem umístíme prvek vstup klávesy (čeká na
stisk)
, který bude
větvicí konstrukci předávat číselný kód stisknuté
klávesy.
Následují dva spojené prvky - proveď příkazy v
případě, že a výraz je roven hodnotě
. Jedná se o jednu větev větvicí konstrukce. Do
prvku výraz je
roven hodnotě umisťujeme
hodnotu, pro kterou budou příkazy ve větvi provedeny. Větví
může být libovolné množství, stejně tak testovaných
hodnot ve větvi může být libovolně. Celou větev proveď příkazy v
případě, že
zkopírujte
ještě třikrát.
Máme teď čtyři větve větvicí
konstrukce. Do testované hodnoty v první větvi dáme ze skupinky ovládání
,
klávesnice
, klávesy
, řídicí klávesy
kód klávesy nahoru
.
Tato větev se provede při stisku klávesy nahoru. Do příkazů
větve
dáme
příkaz pro krok. Budeme hlídat, aby Petřík neprocházel
přes zeď. Okraj plochy hlídat nemusíme, Petřík ven z plochy
neuteče. Namísto jednoduchého kroku použijeme podmíněný
příkaz. Do testu podmínky dáme porovnání předmětů zda je
před Petříkem zeď. Pokud ano
, nebude se dít nic. Pokud ne
, Petřík udělá
krok.
Do dalších tří větví uvedeme
postupně jako testované hodnoty klávesy vlevo , vpravo
a dolů
a
jako příkazy prvky vlevo
, vpravo
a
vzad
.
Posledním prvkem větvicí konstrukce je
prvek jinak
proveď příkazy . Jak napovídá
název, příkazy v této části konstrukce se provedou tehdy,
když testovaná hodnota nebude nalezena ani v jedné z větví.
V našem případě zde nebude nic.
Spusťte program. Petřík stojí v levém dolním rohu. Vyzkoušíte-li kurzorové klávesy (šipky), zjistíte, že se Petřík otáčí vlevo, vpravo, vzad a dělá krok vpřed. Můžete Petříka vodit bludištěm. Až dorazíte k východu, Petřík se otočí na vás a po stisku další klávesy program skončí.
Použitý způsob ovládání je ovládání typické pro auta. Používáme ho v případech, kdy potřebujeme pohybovaným objektem přesně otáčet do požadovaného směru, ale není tak důležitá rychlost pohybu po ploše (manipulovatelnost).
V případech, kdy je potřeba se rychle a snadno přemisťovat, použijeme následující způsob ovládání. Řídíme v něm ne otáčení postavy, ale popocházení ve směru šipky.
Zkopírujte pravým tlačítkem myši
předešlou větvicí konstrukci ještě jednou níže. Původní
konstrukci vypněte tlačítkem Vypnout . Novou konstrukci
nazvěte ovládání
Petříka směry. Z větví
vyhoďte příkazy pro otáčení vlevo, vpravo a vzad.
První větev větvicí konstrukce (pro
šipku nahoru) upravíme tak, aby se Petřík otočil nahoru a
udělal krok. Krok máme již připraven - kontroluje se v něm,
zda před Petříkem není zeď. Směr otočení Petříka
nastavíme pomocí prvku směr . Najdete ho v
rozšířených funkcích Petříka. Prvek vložte před
podmínku k provedení kroku Petříka. Jako parametr připojte
prvek nahoru
(1/2 pi, tj. 90 stupňů)
, je ve skupince výpočty
,
podskupince úhel,
směr
. Je to číselná konstanta mající
hodnotu pi/2, neboť úhly se v Petrovi měří v radiánech.
Vytvořte příkazy pro nastavení směru i v ostatních větvích větvicí konstrukce, směry změňte odpovídajícím způsobem podle směrů kláves. Příkaz pro opatrné provedení kroku bychom mohli zkopírovat z první větve, ale jak už jsme si řekli dříve, rozkopírování kódu je neprogramátorské. Raději použijeme funkci.
Co je funkce? Funkce je prvek, který obsahuje část programu. Namísto vícenásobného výskytu shodné části programu použijeme vícekrát funkci, která potřebnou část programu vykoná. Program se zpřehlední a budou se nám snáze provádět změny.
Novou funkci vytvoříme přetažením
prvku funkce z
pole Knihovna
proměnných a funkcí do pole
Společné
proměnné a funkce. Funkci
pojmenujte Opatrný
krok vpřed. Když dvakrát
kliknete na ikonku funkce, objeví se prázdné editační okno.
Funkce zatím neobsahuje žádné příkazy.
Mohli bychom teď ve funkci vytvořit
příkaz pro krok, ale my si to usnadníme, protože máme tento
příkaz již v programu vytvořený. Přepněte se zpět do
hlavní funkce programu (tlačítkem Předešlá editace )
a najděte podmíněný příkaz s testem zdi a krokem vpřed (je
ve větvi pro šipku nahoru). Kliknutím na ikonku podmíněný
příkaz označte. Klikněte na tlačítko Kopie
(nebo na klávesnici stiskněte Ctrl+C).
Označený prvek programu (včetně připojených prvků) se
uschová do schránky k přenášení dat.
Vraťte se do funkce Opatrný krok vpřed (tlačítkem Následující editace ).
Klikněte na tlačítko Vložit
(nebo stiskněte Ctrl+V). V okně se objeví přenášená část programu.
Teď již můžeme z větve pro šipku nahoru podmíněný příkaz vyhodit a nahradit ho funkcí pro opatrný krok. Doplníme ji i do ostatních větví za příkazy nastavení směru.
Program můžete spustit a vyzkoušet. Jak vidíte, Petřík teď popojde o krok ve směru stisknuté klávesy šipky.
Do třetice všeho dobrého si vyzkoušíme
ještě jednu metodu ovládání, kterou budeme používat u
složitějších a dokonalejších her. Možná jste si všimli,
že držíte-li u předešlých dvou metod chvíli klávesu,
Petřík se pohybuje i potom, co jste již klávesu dávno
pustili. Příčinou je rychlejší generování kódů
držených kláves, než je schopen Petřík popocházet, a tak
se klávesy uchovávají v zásobníku kláves. Jistým
řešením je příkaz vyprázdnění
zásobníku kláves , který zruší
klávesy uchované v zásobníku kláves. Použijeme ho vždy na
začátku každé obsluhy platného znaku z klávesnice před
provedením kroku Petříka.
Další nectnost, která nám může u předešlých dvou metod ovládání vadit, se projevuje při ovládání rychlých dějů nebo při jemném grafickém ovládání. Zkuste si v nastavení sprajtu Petříka změnit počet fází na krok na 1 (po zkoušce vraťte zpět na 8). Petřík bude rychle přeskakovat po políčkách. Když na delším volném úseku klávesu chvíli podržíte, Petřík poskočí nejdříve o políčko, chvíli čeká a až pak začne rychle přeskakovat na další políčka. Příčinou tohoto jevu je způsob generování znaků klávesnicí - prodleva po první klávese a potom opakování. Při psaní textů je tato vlastnost užitečná, ale při hraní her nám může trochu vadit.
Náš požadavek na ovládání
klávesnicí je, aby se Petřík pohyboval vždy, když držíme
klávesu. Bez úvodních prodlev a bez setrvačnosti po
uvolnění klávesy. K tomuto účelu slouží funkce je stisknuta klávesa
ze skupinky klávesnice
. Funkce otestuje požadovanou klávesu, zda ji
uživatel drží, a navrátí příznak ano/ne.
Nejdříve opět vypněte předešlou
metodu tlačítkem Vypnout . Pod
ni připravte prvek podmíněné
provedení příkazů
. Můžete ho
nazvat třeba ovládání
držením kláves. Do testu
podmínky platí-li,
že
vložte prvek je stisknuta klávesa
,
jako parametr k němu připojte klávesu nahoru
.
Do větve platnosti podmínky potom proveď
vložte příkazy pro popojítí nahoru, tak jako u předešlého
typu ovládání. Konstrukci teď čteme: "Je-li držena
klávesa nahoru, potom se otoč nahoru a opatrně popojdi o krok,
jinak pokračuj testem dalších kláves."
Ve větvi neplatnosti podmínky jinak proveď
vytvořte stejnou konstrukci znovu, tentokrát ale pro směr
vlevo. V její větvi neplatnosti podmínky vytvořte obsluhu
směru vpravo a nakonec vytvořte obsluhu směru dolů. Do větve
neplatnosti podmínky v obsluze směru dolů (tedy úplně
poslední větev) vložte příkaz čekání (bez zadání = 0.05 s)
,
najdete ho ve skupince řízení
programu
. Značka malého
rovnítka
před ikonkou čekání indikuje nepovinnost parametru příkazu,
žádný parametr nemusíme doplňovat, použije se implicitní
hodnota 0,05 sekundy.
Proč příkaz čekání? Operační systém Windows je víceúlohový. To znamená, že současně může být v chodu více programů. Každý program by měl zajistit, aby zbytečně nespotřebovával výkon počítače, když to nutně nepotřebuje. Známkou dobrého programátora je slušné chování jeho programů v prostředí, ve kterém poběží. Když by uživatel žádnou klávesu nestiskl, smyčka programu by jela neustále dokola velkou rychlostí. Program by se tvářil jako nečinný, ale přitom by jel na plné obrátky. Ti zkušenější si mohou spustit systémový program Sledování systému a sledovat zatížení procesoru. Program neberoucí ohled na své okolí zabírá téměř celý výkon počítače a počítač se tak stává těžce ovladatelný.
Na obrázku vidíte hotovou obsluhu ovládání Petříka. Části pro obsluhu kroku v daném směru jsou sklapnuty, známe je již z předešlého ovládání.
Nevýhodou takového dlouhého řetězce podmínek je, že může být na první pohled nepřehledný. Ukážeme si ještě jinou možnost stavby podobné konstrukce, i když nutno říct že méně používanou a svým způsobem neobvyklou (běžné programovací jazyky neumožňují vícenásobné větvení podle jiných typů dat než číselné konstanty).
Vypněte naši poslední variantu
tlačítkem Vypnout .
Zkopírujte si znovu variantu ovládání Petříka směry a přejmenujte ji na ovládání držením kláves 2. Podmínková konstrukce pracovala tak, že se
provedla právě jedna z větví v závislosti na stisknuté
klávese. Z prvku pro
hodnotu výrazu
zrušte funkci
vstupu z klávesnice a nahraďte ji prvkem ano
(ze
skupinky výpočty
,
logické
operace
).
V testovaných hodnotách jednotlivých
větví postupně nahraďte kódy kláves kombinacemi prvku je stisknuta klávesa
a kódu klávesy. Postupujte následovně: Kliknutím myší na
ikonu kódu klávesy prvek kódu klávesy vyberte. Stiskem
tlačítka Vyjmout
(nebo z klávesnice Ctrl+X) přesuňte prvek kódu klávesy do schránky. Na
jeho původní místo vložte prvek je stisknuta klávesa
.
Vyberte ho myší a stiskněte tlačítko Vložit
(nebo z klávesnice Ctrl+V). Kód klávesy se připojí k testu stisku
klávesy. Závěrem doplňte do prvku jinak proveď příkazy
prvek čekání
(bez zadání = 0.05 s)
, jinak by program ve
volných chvílích přetěžoval chod počítače.
Hotovou konstrukci vidíte na dalším obrázku (pro přehlednost jsou příkazy pro pohyb sklapnuty ve skupinách). Jak funguje? Program při svém chodu na začátku zjistí, že ve větvích bude testována logická hodnota platnosti. Prochází jednotlivé větve a hledá stejnou hodnotu, tedy platnou podmínku. Příkazy v nalezené větvi provede a pokračuje až za celou konstrukcí vícestupňového větvení příkazů, dalších případných splněných podmínek a větví si již nevšímá. Jinak řečeno, vykoná se první (a jediná) větev se splněnou podmínkou (stisknutou klávesou), jinak se vykoná až poslední z příkazů - čekání.
6. Petr v bludišti <<< Obsah >>> 8. Samá příšera