11. Samá příšera <<< Obsah >>> 13. Začínáme s grafikou
Naším dalším programem bude hra Had. S podobnou hrou jste se zřejmě již setkali. Po ploše se pohybuje had, požírá jídlo a s každým polknutím se prodlouží o článek. My si hru ještě trochu vylepšíme. Had bude požírat různé typy jídla a články hada budou také různé podle jídla, které had spolkne.
Založte nový program s názvem Had (popř. Had 2, pokud program tohoto jména již existuje). Otevře se program zející prázdnotou a bez jediného příkazu, ale to nám nevadí, protože za chvíli okna programu zaplníme hezkou novou hrou. Jestli máte zájem, můžete otevřít program Had již vytvořený v ukázkových programech Petra.
Připravíme hrací plochu programu a to tak, že ji po obvodě obestavíme zdí. Z knihovny předmětů přetáhněte do okna Společné proměnné a funkce předmět Zeď (z podskupiny [vzory]\Domek). Dvojklikem na prvek plocha vyvolejte editor hlavní plochy programu. Položte předmět Zeď do levého horního rohu plochy.
Podíváme se na novou vlastnost plochy. Každé políčko na ploše obsahuje kromě obrázku předmětu ještě pět logických přepínačů a tři číselné hodnoty. Logický přepínač umožňuje uchovat stav ano/ne a tento stav později testovat. V našem programu použijeme první přepínač k signalizaci, že na políčku je postavena zeď. Nebudeme tak muset vyhodnocovat předmět na políčku, jenom se vždy zeptáme přepínače: "Je na políčku zeď?" Můžeme dokonce používat více variant zdí.
V panelu nástrojů editoru plochy je úplně vpravo rozbalovací seznam typu editace. Rozbalte jej a zvolte funkci Přepínač 1 . Zobrazená plocha se změní, v levém horním rohu každého políčka se objeví tmavě červený čtvereček . Čtvereček je indikátor stavu přepínače 1 v políčku. Nyní je vypnutý (stav "ne"). Zapněte v panelu nástrojů přepínací tlačítko Editace (kliknutím na tlačítko). Tím aktivujete režim úpravy obsahu políček. Klikněte na políčko v levém horním rohu s předmětem Zeď. Čtvereček se stane světle červený se značkou zaškrtnutí . Přepínač 1 na políčku je nyní zapnutý (stav "ano"). Vypněte editaci políček novým kliknutím na tlačítko Editace .
Teď bychom rádi položili zeď kolem celé plochy. Máme k dispozici trochu snadnější postup, než neustálé kopírování předmětu pravým tlačítkem myši. V panelu nástrojů zapněte přepínací tlačítko Výplň . Stiskněte levé tlačítko myši na předmětu zdi v levém horním rohu plochy a táhněte myší do pravého horního rohu, tam tlačítko myši pusťte. Plocha, kterou jste takto označili, se vyplní výchozím políčkem. Podobně vyplňte i ostatní strany plochy. Nakonec vypněte tlačítko Výplň a ještě můžete pravým tlačítkem myši doplnit zeď někam do plochy, například podle vzoru:
Připravíme jídlo, které bude had požírat. Vytvořte pět nových předmětů a nakreslete do nich obrázky hadího jídla. Například:
Vytvoříme články hada. Můžete zkopírovat předměty jídla a články dokreslit:
Podobně vytvoříme tři předměty s obrázky jedu a jeden článek hada s obrázkem lebky:
Posledním grafickým úkonem bude vytvoření hlavy hada. Jako hlavu hada použijeme Petříka. Vyvolejte editaci sprajtu Petříka dvojklikem myší na prvek Petřík v okně Společných proměnných a funkcí. Otevřete tlačítkem Vlastnosti okno pro nastavení vlastností sprajtu. Změňte řádek Prodleva mezi fázemi z 55 na 165 (doba mezi jednotlivými fázemi animace), řádek Fází na krok (0 = ihned) z 8 na 0 (posouvá se ihned), řádek Fází pro klid změňte z 1 na 2 a řádek Fází pro pohyb ze 4 na 0. Uzavřete okno stiskem klávesy Enter. Sprajt Petříka má teď čtyři směry a dvě fáze pro klid.
Vyhoďte první obrázek vlevo nahoře s Petříkem. Dvojklikem do obrázku vyvolejte editaci obrázku a nakreslete hlavu hada dívající se směrem doprava. Vraťte se tlačítkem Předešlá editace do editoru sprajtu. Pravým tlačítkem myši zkopírujte první obrázek i do druhého obrázku na stejném řádku. V editoru upravte hlavu tak, aby had otvíral pusu. Zkopírujte oba obrázky i do ostatních řádků pro ostatní směry. Vyvoláním editací obrázků otočte hlavy podle směrů na řádcích sprajtu, použijte k tomu funkci Úpravy . Nakonec můžete sprajt vyzkoušet tlačítkem Test .
Předmětů s obrázky jídla máme v našem programu již větší množství a možná bychom je rádi v budoucnu ještě rozšířili. S našimi současnými znalostmi bychom museli každý typ předmětu obsluhovat zvlášť, a to by již bylo trochu těžkopádné. Proto se naučíme používat nový prvek - seznam.
Nejdříve si seznam připravíme, přestože zatím nevíme, k čemu vlastně je. Ze skupiny řízení programu přetáhněte do okna Společné proměnné a funkce prvek seznam . Pojmenujte ho seznam jídel. Po jeho rozevření uvidíte tři prvky. První prvek, počet , přejmenujte na 5 - počet jídel. Druhý prvek, index , přejmenujte na index jídla. Třetí prvek, inkrementace indexu , přejmenujte na inkrementace indexu jídla. Do seznamu doplňte ještě dva nové předměty, pojmenujte je jídlo a jídlo - had.
Nyní si vysvětlíme, co to seznam je. Seznam je něco jako kniha. Všechny stránky knihy vypadají podobně, například na každé stránce bude jeden obrázek a jeden text, ale přitom je v každém obrázku či textu něco jiného. V našem seznamu uchováme předměty jídla a článků hada, abychom si usnadnili jejich použití. Na každé stránce seznamu bude jiný obrázek jídla a jiný obrázek článku hada. První položka v seznamu udává počet stránek seznamu, my máme v seznamu 5 typů jídel. Druhá položka je číslo nastavené stránky seznamu - ukazatel seznamu (čísluje se od stránky 0). Třetí položka určuje, o kolik stránek se ukazatel automaticky posune při každém přístupu k datům v seznamu (poznámka: slovo inkrementace znamená zvýšení).
Seznam jídel musíme při startu programu naplnit, to znamená určit, jaký předmět na které stránce seznamu bude. Příkazy pro naplnění seznamu vidíte na následujícím obrázku. Umístěte je na začátek hlavní funkce programu.
Před zahájením plnění seznamu určíme počáteční stránku, od které budeme seznam plnit. Nastavíme prvek index jídla na hodnotu 0. Použijeme automatické zvyšování čísla stránky, proto nastavíme prvek inkrementace indexu jídla na hodnotu 1.
Nejdříve naplníme předmět jídlo na všech stránkách seznamu. Postupně nastavujeme prvek jídlo na jednotlivé předměty jídla. Předměty se ukládají do seznamu a po každém nastavení předmětu se stránka automaticky zvýší o jedničku. Po nastavení posledního předmětu se ukazatel stránek automaticky převine na začátek. Začneme plnit předměty jídlo - had, opět se stránky samy zvyšují nahoru. Na závěr nastavíme automatické zvyšování stránek na hodnotu 0, protože v programu již automatické zvyšování nebudeme používat.
Bude-li během hry hráč neúspěšný, to znamená narazí-li had na překážku nebo se nají jedu, začne hra od začátku. K tomu budeme potřebovat znovu vykreslit plochu programu tak, jako při startu, tj. bez jedů a jídel. Mohli bychom plochu vyčistit programově, ale je jeden snadnější způsob. Hlavní plochu si můžeme uschovat do proměnné typu plocha a při nové hře ji pomocí této proměnné jednoduše obnovit.
Vytvořte novou proměnnou plochy (kopií prvku plocha z okna Knihovny proměnných a funkcí do okna Společných proměnných a funkcí) a pojmenujte ji uschovaná hrací plocha. Na začátek programu dejte příkaz pro uschování hlavní plochy:
Při hře budeme hráči zobrazovat jeho nejvyšší dosažené skóre. Vytvořte číselnou proměnnou s názvem dosažené maximum, její hodnotu nastavte na nulu.
Vytvořte novou funkci s názvem nová hra. Funkci necháme vykonat při startu programu, a proto ji doplňte na začátek programu za skupinu pro naplnění seznamu jídel. Její obsah budeme sestavovat podle obrázku uvedeného níže.
Vytvořte logickou proměnnou příznak pohybu hada, číselnou proměnnou délka hada, číselnou proměnnou čítač pro další krok a funkci s názvem zobrazení počtu článků hada. Logickou proměnnou příznak pohybu hada použijeme k indikaci zahájení pohybu hada (po startu hry bude had stát na místě a čekat na stisk první klávesy). Hodnotu proměnné nastavte ve funkci nová hra na vypnuto. Proměnná délka hada udává počet článků hada a během hry se zvyšuje. Při zahájení nové hry ji nastavte na 0. Čítač pro další krok čítá časové impulsy 0.1 sekundy, než se provede posun hada o políčko (snižuje se od hodnoty 5 do 0). Nastavte čítač při zahájení hry na hodnotu 1, aby se první krok provedl ihned po stisku první klávesy.
Dalším příkazem při zahájení nové hry je návrat uschované hrací plochy. Použijte stejný příkaz jako při úschově plochy, ale s obráceným pořadím prvků. Následujícími příkazy se provede nastavení výchozí pozice hada. Vypněte viditelnost Petříka, nastavte jeho souřadnice na X=9 a Y=8, otočte ho vpravo a opět viditelnost zapněte. Na závěr funkce nová hra uveďte funkci zobrazení počtu článků hada.
Teď se zaměříme na funkci zobrazení počtu článků hada. Při mnoha hrách je třeba uživateli sdělovat různé informace, jako je např. dosažené skóre. Nechceme-li se zobrazováním informací příliš zabývat, je dobrým a rychlým řešením vypisovat takové informace v nadpisu okna. My budeme sdělovat hráči dosaženou délku hada a případně maximální dosažené skóre. Při zobrazení počtu článků se budeme snažit alespoň částečně vyjadřovat lidsky, proto rozlišíme stavy "1 článek", "2...3...4 články" a "5...6... článků". Většina hráčů nám snad odpustí češtinářský prohřešek, když namísto "23 články" vypíšeme "23 článků". Zde je obsah funkce:
Délka hada 0 se vyskytne vždy při zahájení nové hry. V této chvíli můžeme zobrazit informace o autorovi programu nebo později maximální skóre.
Na obrázku vidíte použitý nový prvek - nadpis okna (naleznete jej ve skupině ovládání , podskupina dialogy ). Prvek má charakter textové proměnné (lze jej nastavovat i číst), představující text na horní liště okna (titulek okna). Prvek sloučení textů slouží ke sloučení více textů do jednoho textu. Sloučení probíhá shora dolů. Běžný text je možné zadat zápisem textu u prvku textová konstanta . Prvek převod čísla na textový tvar převádí číslo na textové vyjádření čísla.
Podobně jsou sestaveny i větve pro ostatní délky hada. Všimněte si, že můžeme jednu větev větvící konstrukce použít pro více hodnot délek.
Jedna poznámka k používání nadpisu okna. Při startu programu se v nadpisu okna objeví jméno hlavní funkce programu. Není-li potřeba během chodu programu nadpis okna měnit, stačí patřičně upravit jméno hlavní funkce. U nového programu je jméno hlavní funkce přednastaveno na jméno programu.
Dále se budeme zabývat hlavní smyčkou programu. Na konec hlavní funkce umístěte podmíněné opakování příkazů . Do testu podmínky dejte prvek ano , čímž změníme cyklus na nekonečný cyklus. Ukončení programu bude uskutečněno uvnitř obsluhy kláves jako reakce na klávesu Esc. Na začátku hlavní smyčky vytvoříme nejdříve obsluhu kláves, následuje obsluha pohybu hada a na závěr obsluha vytváření nových věcí (jídlo a jed). Posledním příkazem ve smyčce bude obsluha čekání zajišťující časování programu. Příkaz čekání můžete doplnit do smyčky již teď, ostatní obsluhy budeme doplňovat postupně.
Začneme obsluhou vytváření nových věcí. Před obsluhu čekání vložte podmíněné provedení příkazů , nazvěte ho vytváření věcí. Obsah vidíte na dalším obrázku.
Novou věc budeme vytvářet náhodně s určitou pravděpodobností, proto do testu podmínky dáme porovnání náhodného čísla s konstantou. Nastavením hodnoty na 0.03 zajistíme, že se nová věc vytvoří v každých 3 ze 100 průchodů programu hlavní smyčkou, pravděpodobnost vzniku věci je tedy 3%.
K vytvoření věci na ploše použijeme opět Petříkovu kamarádku - Lucku. Nejdříve ji nastavíme na náhodné políčko plochy. Pro horizontální pozici Lucky použijeme prvek šířka plochy , který nám předá číselnou hodnotu 20, což je šířka plochy programu. Je možné číslo zadat přímo, ale výhodnější je pracovat s obecnými čísly. Ušetříme si tak problémy, až někdy v budoucnu budeme něco v programu měnit. Šířku plochy předáme funkci náhodné číslo , která vytvoří náhodné číslo v rozsahu od 0 do 19.999999999. Následující funkce celočíselná část odstraní desetinnou část čísla. Vznikne tak náhodné celé číslo v rozsahu 0 až 19, což jsou horizontální souřadnice prvního až posledního políčka plochy. Připomeňme si, že se políčka číslují od nuly z levého dolního rohu směrem doprava a nahoru. Podobně vytvoříme i náhodnou pozici ve vertikálním směru.
Za nastavením náhodné pozice následuje podmíněný příkaz, testující zda je nastavené políčko prázdné. Pokud ano, rozhodne se program dalším podmíněným příkazem, jestli vytvoří jed nebo jídlo. Náhodné číslo porovnáváme s hodnotou 0.1, která zajistí, že se v 1 z 10 případů vytvoří jed, v ostatních případech jídlo. Vše vidíte na obrázku:
Na dalším obrázku vidíte obsluhu vytvoření nového jedu. Jedy budeme vytvářet s různou četností. Nejčastěji chceme vytvářet muchomůrku a nejméně často krabičku s jedem. Použijeme k tomu vícestupňové větvení příkazů . Větvícím výrazem bude náhodné celé číslo v rozsahu 0 až 5 vytvořené pomocí prvků celočíselná část , náhodné číslo a číslice 6 .
V první větvi vytvoříme lebku pro 2 případy z 6 (hodnoty 0 a 1), pravděpodobnost vzniku lebky bude tedy 33%. Ve druhé větvi vytvoříme krabičku s jedem s menší pravděpodobností - pro 1 případ z 6 (hodnota 2), pravděpodobnost vzniku je 17%. V ostatních případech vytvoříme muchomůrku - pro zbylé 3 případy z 6 (hodnoty 3, 4 a 5), pravděpodobnost 50%.
Obsluhu vytvoření jedu zakončíme příkazem pro zapnutí přepínače 2 . Jak si vzpomínáte, přepínač 1 jsme použili k indikaci, že na políčku je zeď. Přepínač 2 budeme používat k indikaci jedu na políčku. To nám později usnadní práci, nebudeme muset testovat všechny možné jedy, které v programu použijeme.
Obsluhu vytváření jídla zajistíme jinou metodou. Jak vidíte na dalším obrázku, obsluha je díky použití seznamu celkem jednoduchá.
Na začátku obsluhy náhodně vybereme stránku seznamu, ze které převezmeme předmět jídla. Index jídla nastavíme na náhodné celé číslo v rozsahu 0 až 4, což jsou indexy první až poslední stránky seznamu. Namísto přímého zadání čísla rozsahu náhodných hodnot použijeme prvek udávající počet stránek v seznamu . Díky tomu můžeme v budoucnu přidávat do seznamu další jídla, aniž bychom museli měnit obsluhu jídel v programu. Číslo jídla si pomocí prvku číselná hodnota 1 (rozsah 0 až 1023) uchováme v políčku pro příští použití. Dalším příkazem položíme předmět jídla na pozici Lucky . Posledním příkazem bude zapnutí přepínače 3 . Přepínač 3 použijeme k indikaci, že na políčku je jídlo.
Tím je obsluha vytváření nových věcí hotova a můžete ji vyzkoušet (nezapomeňte na obsluhu čekání na konci hlavní smyčky). Uprostřed plochy by se měla objevit hlava hada s otevírající se pusou a kolem vznikající nové věci. Program ukončíte kliknutím na křížek na horní liště okna vpravo.
Pokračujeme obsluhou ovládání hada. Doplňte na začátek hlavní smyčky programu (před obsluhu vytváření věcí) prvek vícestupňové větvení příkazů s názvem ovládání hada. Obsluhu vidíte na následujícím obrázku.
Větvící hodnotou bude funkce vstup klávesy (nečeká na stisk) . Klávesou vlevo otočíme Petříka (tedy hlavu hada) doleva a zapneme příznak, že had je v pohybu. Podobně obsloužíme i klávesy ostatních směrů. Jako poslední obsloužíme klávesu Esc a to tak, že příkazem konec funkce (ze skupiny řízení programu ) ukončíme funkci. Protože se jedná o hlavní funkci programu, ukončíme tím i celý program.
Program vyzkoušejte. Kurzorovými klávesami (šipkami) můžete otáčet hlavou hada do stran, klávesou Esc program ukončíte.
Naším dalším úkolem bude hada rozpohybovat. Rychlost pohybu hada zvolíme asi 2 kroky za sekundu. Abychom mohli lépe obsluhovat klávesnici a generování věcí, cykluje hlavní smyčka programu trochu rychleji (18 průchodů za sekundu). Proto použijeme čítač pro další krok, který zajistí posun hada při každém devátém průchodu cyklem.
Obsluhu pohybu hada vidíte na dalším obrázku. Umístěte ji za obsluhu ovládání hada, ale před obsluhu generování nových věcí. Na začátku obsluhy je prováděn test, zda je had v pohybu (při zahájení hry totiž stojí na místě až do stisku první klávesy směru). Je-li tomu tak, dekrementuje se (tj. sníží o 1) čítač pro další krok. Dosáhne-li nuly, může had popojít o krok vpřed. Nejdříve znovu nastavíme čítač pro další krok. Zvolili jsme číslo 9, které představuje 2 kroky za sekundu (základní časovou jednotkou počítače je 55 milisekund, za jednu sekundu tedy uplyne 18 časových jednotek).
Před obsluhou posunu hada otestujeme, zda není před hadem neprůchodná překážka. Za neprůchodnou překážku budeme považovat zeď, ale také samotného hada, tedy některý z jeho článků. K provedení testu použijeme Lucku. Nastavíme ji na pozici Petříka, otočíme v jeho směru a provedeme krok vpřed.
Jak si jistě vzpomínáte, zeď jsme označili přepínačem 1 . Abychom si to usnadnili, budeme tak označovat i políčko s článkem hada. Je-li přepínač zapnut, je před hadem zeď nebo článek hada a had umírá. Přehrajeme zvuk nárazu a provedeme animaci smrti hada. Budeme se jí zabývat až později. Jinak se had může posunout vpřed.
V případě posunu hada se nejdříve budeme zabývat Petříkem - hlavou hada. Zhruba uprostřed obsluhy posunu hada vidíte, že Petřík provede krok vpřed. Následující větvící konstrukce uschová na novém políčku číslo, udávající kterým směrem leželo minulé políčko. Toto číslo nám pomůže později při hledání cesty ke konci hada.
Číslo představující směr na minulé políčko uchováme v číselné proměnné 2 . Pro minulé políčko směrem vpravo použijeme číslo 0, pro směr nahoru 1, pro směr vlevo 2 a pro směr dolů 3. Případ pro minulý směr vlevo vidíte na obrázku, ostatní směry jsou obdobné.
Vraťme se na začátek obsluhy posunu hada o krok vpřed. Lucku jsme naposledy zanechali na příštím políčku, kde testovala stav přepínače 1. Teď ji otočíme zpět a posuneme o krok vpřed, tím ji navrátíme na stejnou pozici jako je hlava hada. Ještě můžeme doplnit přehrátí zvuku kroku hada.
Následuje cyklus zajišťující posun článků hada, jak vidíte na dalším obrázku. Počet průchodů cyklu je dán délkou hada. Na začátku je Lucka nastavena na pozici hlavy hada. Na každém políčku s článkem nebo hlavou hada je uchováno číslo udávající směr na minulé políčko. Číslo představuje počet kvadrantů (tj. čtvrtin otáčky), o kolik se musí Lucka otočit proti směru hodinových ručiček od nulového úhlu (nulový úhel odpovídá směru doprava).
Nejdříve se tedy Lucka otočí na minulé políčko. Následujícím příkazem přenese předmět z minulého políčka na políčko, na kterém stojí. Tím posune článek hada o krok vpřed. Dalším příkazem zapne přepínač 1 . Řekli jsme si, že přepínačem 1 budeme indikovat nejen zeď, ale i článek hada. Posledním příkazem popojde Lucka o krok vpřed, to znamená na další políčko hada směrem k jeho konci.
Po vykonání všech průchodů cyklem zůstane Lucka stát na políčku za novým koncem hada. To platí i pro délku 0, kdy se neprovede ani jeden průchod cyklem. Následuje posun hlavy hada o krok vpřed a úschova směru na minulé políčko, jak jsme si obsluhu popsali dříve. Vymažeme obsah políčka za koncem hada prázdným políčkem (provede Lucka) a vypneme příznak, že je na políčku článek hada. V případě nalezení jídla nebo jedu na políčko později doplníme nový článek hada.
Had je posunut. Teď si povšimneme obsahu políčka na nové pozici hlavy hada. Nejdříve vyzkoušíme, je-li na políčku jídlo. Jídlo jsme si označili přepínačem 3, budeme tedy testovat přepínač 3 . Obsluhu jídla vidíte zde na obrázku:
Je-li na políčku jídlo, vymažeme jídlo položením prázdného políčka a vypneme přepínač 3. V číselné proměnné políčka 1 máme uschováno číslo jídla ze seznamu jídel. Převezmeme tedy číselnou hodnotu 1 políčka a použijeme ji jako index jídla, abychom získali článek hada, který k nalezenému jídlu patří. Vezmeme ze seznamu článek hada a položíme ho na pozici s Luckou. Jak víme, Lucka zůstala stát na políčku za koncem hada, před chvílí jsme tam prozatímně položili prázdné políčko. Tím jsme vytvořili nový článek hada se spolknutým jídlem. Ještě zapneme přepínač 1 jako příznak článku hada a zvýšíme délku hada. Na závěr můžeme přehrát zvuk polknutí a zobrazit novou délku hada.
Obsluha nalezení jedu je podobná. Vidíte ji na obrázku níže. Jak víte, jed označujeme přepínačem 2. Zjistíme-li tedy testem přepínače 2 nalezení jedu, opět nejdříve vymažeme políčko položením prázdného předmětu a vypneme přepínač 2. Provedeme obsluhu podobně jako při běžném jídle. Nový článek hada použijeme vždy stejný, nezávislý na nalezeném jedu. Opět zapneme na pozici Lucky přepínač 1 jako indikátor článku hada, zvýšíme délku hada, přehrajeme zvuk polknutí a zobrazíme novou délku. Vše zakončíme smrtí hada.
Naším posledním úkolem bude vytvoření funkce pro obsluhu smrti hada. Obsah funkce vidíte na dalším obrázku.
Nejdříve je uchována dosažená délka hada jako nové maximální skóre. Po kratičké pauze se ozve zvuk zasípění. Smrt budeme indikovat postupným překreslením všech článků hada na články s lebkou. Po překreslení a krátké pauze články hada vymažeme (znázorníme tak odumírání hada). Opět následuje krátká pauza a zahájí se nová hra.
Po zahájení hry je důležité doplnit příkaz vyprázdnění zásobníku kláves. Často se stává, že hráč v zápalu hry mačká klávesy i během ukončování hry. Tak by si mohl nechtěně odstartovat další hru.
Následující obrázky ukazují obsluhu překreslení článků hada na smrt a vymazání článků hada. Opět využíváme uschované směry na předchozí políčko v číselné hodnotě 2 políčka. Provádíme přitom animaci otáčení hlavy hada (hadovi se motá hlava), v prvním případě proti směru hodinových ručiček, v druhém případě obráceně.
Teď již můžete program spustit a vyzkoušet. Přeji mnoho zábavy u vaší první opravdové hry.