Pokúsime sa naprogramovať hru Piškvorky. Najprv začneme jednoduchšou hrou Tic-Tac-Toe. Pomocníkov, ktorých v nej vytvoríme, budeme môcť použiť aj v Piškvorkách.
Tic-Tac-Toe
- Tic-Tac-Toe sa hrá na hracom pláne rozmerov 3×3. Obrázok vľavo
- Hráči striedavo kreslia krúžky a krížiky.
- Komu sa podarí vytvoriť tri rovnaké symboly vodorovne, zvislo alebo po uhlopriečkach vyhrá. Na obrázku vpravo, vyhral hráč, ktorý kreslil krúžky.
- Ak sú všetky políčka obsadené a nik nevytvoril trojicu rovnakých symbolov, hra končí remízou.
- Ďalšiu hru začína druhý hráč
Program budeme tvoriť tak, že jednotlivé činnosti pridelíme samostatným pomocníkom.
Pomocník Plán
Pomocník Plán nakreslí hrací plán. Hrací plán je tvorený dvoma vodorovnými a dvoma zvyslími úsečkami. Zvolíme si veľkosť hracieho políčka, z jeho rozmerov vyplynú súradnice nakreslených úsečiek. Zvoľme si veľkosť políčka 30 a hracie pole posuňme od okrajov pracovnej plochy Baltíka tiež o 30. Bod so súradnicami 0,0 je v Baltíku vľavo hore.
Súradnice prvej vodorovnej úsečky budú: x1 – 30, y1 – 60, x2 – 120, y2 – 60.
Druhá úsečka je s prvou rovnobežná, súradnice x sa nezmenia, y sa posunú o veľkosť hracieho políčka, teda sa zväčšia na 90.
Na zvislé úsečky sa môžeme dívať ako na obraz vodorovných úsečiek, ktorý vznikne ich otočením o 90 stupňov. Potom si súradnice x a y vymenia miesto. Skopírujeme preto príkazy pre vykreslenie vodorovných úsečiek a vymeníme príslušné dvojice súradníc x a y.
Pomocník Plán je potom:
Kliknutím na obrázok sa obrázok zobrazí v plnej veľkosti.
Ťah hráča sa na obrazovke prejaví vykreslením krúžku alebo krížika. Budeme preto potrebovať dvoch pomocníkov: Krúžok a Krížik.
Pomocník Krúžok
Parametrami pomocníkov Krúžok a Krížik budú súradnice x a y, ktoré predstavujú stred kruhu alebo priesečník uhlopriečky štvorca. Nakreselenie krúžku je jednoduchšie, stačí použiť príkaz pre nakreslenie kružnice.
Pomocník Krížik
Krížk bude mať tie isté súradnice pre úsečku idúcu zľava doprava a zhora dole. Pre druhú úsečku platí, že súradnice x sú rovnaké, kým súradnice y si vymenia miesta. Dostávame:
Pomocník Ťah
Ťah hráč vykoná tak, že kurzorom myši sa postaví na políčko, kam chce nakresliť svoju značku a klikne ľavým tlačítkom myši.. Potrebujeme pomocníka Ťah, ktorý
- čaká na stlačenie tlačítka myši
- zistí na akých súradniciach sa myš nachádzala, keď bolo stlačené tlačítko myši
- zavolá pomocníka Krúžok alebo Krížik, ktorému odovzdá tieto súradnice a pomocník nakreslí symbol hráča.
Nultá verzia pomocníka Ťah by mohla vyzerať takto:
Baltík čaká na akciu používateľa, zistí súradnice, ktoré mal kurzor myši, keď bolo stlačené ľavé tlačítko a nakreslí krúžok (nerozlišuje, ktorý hráč je na ťahu).
Urobil som deväť ťahov a dostal som nasledujúci obrázok. Vidíme, že musíme ošetriť dve veci:
- Baltík musí vedieť, kto je na ťahu.
- Značky musíme vycentrovať, lebo ak používateľ neklikne presne do stredu, tak sú krúžky rozhodené (pri reálnej hre s perom a papierom by sme dostávali podobné útvary).
Ošetrenie toho, kto je na ťahu
Zadefinujeme si premennú hráč, na začiatku ju nastavíme na 1,
- po každom ťahu ju zväčšíme o jedna.
- ak bude väčšia ako 2, nastavíme ju na jedna.
- ak bude mať premenná hráč hodnotu 1 nakreslíme krúžok, ak bude mať hodnotu 2, nakreslíme krížik
Vycentrovanie značiek
Hracie políčka majú veľkosť strany 30 a od okrajov sme celé hracie pole posunuli o 30. Preto by sa zmena súradníc, kam bude značka vykreslená, mala meniť s krokom 30, 30 – 59 by malo byť 30, 60-89 ->60, 90-119 ->90. Môžeme využiť to, že Baltík celé čísla delí celočíselne, teda 30:30 aj 59:30 vyhodnotí ako 1. Požadovanú hodnotu potom dostaneme tak, že súradnicu predelíme a vynásobime číslom 30.
Pomocník Ťah verzia 0.1 bude potom vyzerať takto:
Keď som odohral jednu partiu, výsledkom bol obrázok vpravo. Vidíme, že už je to takmer dokonalé, ale značky sú usporiadané, no nie sú vycentrované.
Keď k súradniciam x aj y pripočítame 8, dostávame obrázok vľavo. Symboly sú pekne v strede, ale vidíme dve ďalšie chyby.
- Hráč môže urobiť ťah aj mimo hracieho poľa.
- Hoci jeden z hráčov vyhral, program pokračuje ďalej. Baltík nevyhodnotí výhru, prehru a remízu.
Ošetrenie ťahov mimo hracie pole
Musíme pridať podmienku, že ťah musí byť vykonaný iba v priestore hracieho poľa, tento priestor je ohraničený súradnicami x a y v rozmedzí od 30 do 119. Čiže ťah hráča má byť ignorovaný, ak omylom či schválne klikne mimo vyhradenú oblasť. Musíme pridať doplňujúce podmienky. Pomocník Ťah 0.2 potom vyzerá takto:
Po teste tejto verzie programu sme už boli takmer spokojní, až na nevyhodnocovanie výsledkov. Keď jeden z hráčov omylom klikol na políčko, kde už bola značka súpera, prípadne klikol na vlastné políčko, tak v jednom prípade na tom istom políčku boli obe značky, v druhom prípade sa napohľad nič nestalo, lebo sa vykreslila značka na tom istom mieste, ale hráč prišiel o ťah. Obrázok vľavo. Potrebujeme pridať test, či hracie pole, kam chceme nakresliť značku nie je obsadené. Ak políčko je voľné, bude mať hodnotu nula, ak je obsadené, obsahuje číslo hráča, ktorý ho obsadil. Pre každé políčko by sme potrebovali jednu premennú. Keďže tieto premenné sa viažu na hracie pole, ktoré má rozmery 3×3 , bolo by dobré, ak by existovali viacrozmerné premenné, premenné, ktoré obsahujú naraz viacero hodnôt pričom k jednotlivým premenným možno pristupovať cez indexy či súradnice. Takéto premenné sa nazývajú polia.
Keď chceme pracovať s premennou pole, musíme najprv určiť rozmery poľa. V našom prípade má hracie pole rozmery 3×3. Baltíku to povieme príkazom obrázok vpravo.
Políčko vľavo hore má index 1,1 a vpravo dole index 3,3. Je to podobné, ako keď lúštime krížovku, len v krížovkách bývajú indexy označené písmenom a číslom. Teraz, než urobíme ťah, testujeme, či políčko je voľné, ak je, políčko okrem označenia značkou obsadíme, naplníme ho číslom hráča.
Program, ktorý robí vyššie uvedené nájdete tu.
Poslednou vecou, ktorú musíme spraviť je test, či ťah nebol víťazný. Po vykonaní ťahu zistíme, či niektorý riadok, stĺpec alebo uhlopriečka neobsahuje tri rovnaké značky.
Pomocník Vyhodnoť
Riadok 1 otestujeme takto: pole[1,1]=hrac and pole[2,1]=hrac and pole[3,1]= hrac. Ostatné riadky tak isto, len druhý index zväčšíme na 2 a potom na 3.
Stĺpec 1 otestujeme takto: pole[1,1]=hrac and pole[1,2]=hrac and pole[1,3]=hrac. Ostatné riadky rovnako, zväčšujeme prvý index.
Uhlopriečka zhora nadol: pole[1,1]=hrac and pole[2,2]=hrac and pole[3,3]=hrac
Uhropriecka zdola nahor: pole[1,3]=hrac and pole[2,2]=hrac and pole[3,1]=hrac.
Stačí, aby bola splnená jedna z vyššie uvedených podmienok, aby hráč vyhral. Ak nevyhral a ešte nebolo vykonaných 9 ťahov, na ťahu je druhý hráč. Ak bolo 9 ťahov, vypíše sa remíza. Ak vyhral, vypíše sa Vyhral hráč číslo hráč.
Záver?
Program je v podstate hotový. Čo na ňom možno zlepšiť?
- Obvykle, keď odohráme jednu partiu a sme ju vyhrali, mal by mať súper právo na odvetu, takže po skončení partie máme dve možnosti. Program znova spustiť alebo sa spýtať Prajete si odvetu? Ak odpoviete Áno, obrazovka sa vyčistí a znova sa vykreslí prázdny hrací plán.
- Baltík by mohol evidovať celkové skóre, hralo by sa napríklad, kým niekto nezíska tri body – výhra 1 bod, remíza 0,5 bodu.
- Tiež sa môžete pohrať s grafickou úpravou, nastaviť farby, hrúbky čiar, …
- Po spustení programu by sa program mohol spýtať na mená hráčov a vypisovať či je na ťahu Miško alebo Anička a že vyhral Miško, či vyhrala Anička.
- Ak by som nemal pri počítači kamaráta, s ktorým sa túto hru hrám, mohli by sme naučiť samotného Baltíka, aby hral Tic-Tac-Toe proti nám?
Z uvedených námetov vidno, že program nikdy nie je „dokonalý“, stále možno vymyslieť niečo, čím ho možno doplniť, vylepšiť. Postupovali sme metódou postupných krokov. Cestou sme nachádzali a opravovali chyby. Chyba v programe nie je tragédia, ale cesta k dokonalosti. Keď už program pokladáme za hotový, dáme ho niekomu otestovať a ten obvykle nájde nejaké ďalšie chyby, či aspoň navrhne nejaké vylepšenia.