ARKANOID projekt do MMIA
Jan Cigánek a Pavel Pelán, UREL, FEEC, VUT Brno
xcigan02
stud.feec.vutbr.cz
xpelan02
stud.feec.vutbr.cz
Obsah:
- Úvod
- Realizace
- Závěr
- Literatura
Arkanaoid je jedna z prvních PC her z 90 let, která prošla řadou modifikací, ať už z nostalgie, či pro svoji
jednoduchost. My jsme se tuto hru pokusili ve zjednodušené verzi naprogramovat s využitím mikrokontroleru
ATmega16 se zobrazením pomocí displeje LED 8x8.
I když je hra Arkanoid celosvětově známá, popíšeme si pro úplnost její princip. Základ tvoří hrací pole různých velikostí,
na kterém jsou v horních řádcích umístěny statické body a ve spod je možné horizontálně posouvat odraznou deskou. Jedna z možných variant je ukázána na obr.1.
V tomto prostoru se pohybuje balón, který se odráží jak od desky, tak od stěn, případně od zmíněných statických bodů, které však zmizí.
Úkolem hry je vymazat všechny statické body dříve než míček dopadne na dno.
Obr.1 Arkanoid
Celý náš projekt vychází z možností mikrokontroleru ATmega16 [1] a diodového panelu 8x8 bodů.
Přitom se využívá vývojové desky Development Board ATmega16 [2].
Diodový panel 8x8 jak je uvedeno na obr.2 využívá tři porty. PORTC pro svícení červenou barvou, PORTA pro svícení zelenou barvou
a PORTB[0-2] pro adresování jednotlivých řádků. Led diody svítí vždy při logické 0.
Obr.2 Diodový panel 8x8
Algoritmus námi vytvořené hry Arkanoid je postaven na smyčce, která skončí pokud pohybující se bod (míček) dopadne na spodní řádek.
Na obr.3 je zobrazeno vytvořené hrací prostředí pro uvedený diodový panel, kde je míček zobrazen zeleným bodem.
V programu jsou vytvořeny celkem čtyři globální proměnné určeny k indikaci míčku.
Dvě proměnné udávají aktuální pozici míčku ve vertikálním a horizontálním směru.
Další dvě proměnné určují zda se míček pohybuje doprava nebo doleva a nahoru nebo dolů.
Obr.3 Arkanoid - začátek hry
Při běhu hry se v uvedené smyčce volají postupně dvě funkce. První s názvem "show" pro vykreslování na displej
a druhá pojmenovaná "check" sloužící k vyhodnocování a kontrole polohy míčku.
Samotný posun míčku je proveden pomocí přerušení čítače/časovače, kde se inkrementují nebo dekrementují výše uvedené globální proměnné.
FUNKCE "SHOW"
V paměti mikrokontroleru je vytvořené proměnné pole velikosti 8x8. Toto pole znázorňuje hrací pole vykreslované na displeji, viz obr.3, mimo zeleného bodu.
Jak obrázek ukazuje důležité jsou první dva řádky a poslední řádek. Přitom pohyb posledního řádku je ovládán pomocí dvou tlačítek a reakce na stisk tlačítka je hlídaná ve funkci "check".
zjednodušená ukázka vykreslení pole:
void show()
{
  int i;                                          //lokální proměnná pro indexaci
  PORTB = 0;                             //nastavení spodního řádku na diodovém panelu
  PORTC = letadlo;                  //rozsvícení spodního řádku s posuvnou odraznou deskou
  delay_ms(1);                          //zpoždění v ms
  for(i=1;i<8;i++)                   //cyklus pro výpis zbytku pole
  {
     PORTB=i;                            //multiplexace řádků na diodovém panelu
    PORTC = poleint[7-i];       //výpis ostatních řádků na displej
    delay_ms(1);
  }
}
FUNKCE "CHECK"
Funkce "check" je nejobsáhlejší funkcí projektu. Dochází v ní k vyhodnocení úspěchu hry spolu s kontrolou pozice míčku v poli a pohybem odrazné desky.
Tato funkce v největší míře využívá bitové operace k vyhodnocení stavu hry. Níže je uvedena jednoduchá ukázka použití bitových operací v projektu, která však vystihuje základní podstatu celé funkce.
ukázka bitové operace pro odraz a odstranění statického bodu v předposledním nejvýšším řádku displeje:
if(balonV ==6 && vertical == 0)      //pokud je balon v předposledním řádku a zároveň jeho směr jde nahoru
{
  int odraz = ~balon & ~poleint[1];    //proměnná odraz uchová výsledek bitové operace AND příslušného řádku a pozice balonu (negace viz.schéma obr.2 - svítí log.0)
  if(odraz > 0)                                      //pokud je výsledek větší než nula je v panelu přítomen statický bod
{
poleint[1] =~poleint[1] & balon;       //vymazání příslušného statického bodu
poleint[1]= ~poleint[1];
vertical = 1;                                        //změna směru pohybu balonu dolů
  }
}
OBSLUHA PŘERUŠENÍ OD ČÍTAČE/ČASOVAČE
Podrobnou práci s čítačem/časovačem a obsluhu přerušení je možné nalézt v [1].
V tomto projektu využijeme jen povolení přerušení čítač/časovač1 a nastavení předděličky, která bude určovat rychlost hry.
Do obsluhy přerušení jsme se snažili umístit co nejmenší část kódu. Dochází v ní k inkrementaci nebo dekrementaci globálních proměnných pro pozici balónu, které se následně vykreslují ve funkci "show".
Použitím displeje 8x8 se objevil problém, viz. obr.4, kde daná geometrie odrazů neumožní
vybrat určité cihly a vznikne šachovnice.
Obr.4 Arkanoid - šachovnicový problém
Tento problém jsme odstranili tím, že při dopadu míčku na kraj lodě
se míček posune dvakrát. Při dopadu na střed jen jednou. Tím je zajištěno, že míček může projít všechny body na displeji.
Algoritmus jsem opět provedli pomocí bitových operací a zařadili ho do funkce "check".
Obr.5 Arkanoid - funkční hra
Hra je plně funkční, i když LED displej výrazně omezuje další možnosti hry. Při stisknutí tlačítek na pohyb lodě dochází
k poklesu napětí na diodách a displej svítí méně jasně. Protože se jedná o demonstrativní ukázku,
nepředpokládá se vylepšování hry, které by spočívalo v dokonalejší kopii původní hry (více levelů, atd.). Dalším vylepšením může být
např. úvodní intro do hry a outro při skončení hry pomocí plovoucího textu na displeji (v našem případě řešeno pouze staticky). Program do mikrokontroléru je ve složce AVR
[1] Atmel Corporation. 8-bit Microcontroller ATmega16.[online].2008 - [cit.20.května2009]. Dostupné na WWW: http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf
[2] FRÝZA, T.; FEDRA, Z.; ŠEBESTA, J. Mikroprocesorová technika. Laboratorní cvičení. Skriptum, REL 07-049. Brno: FEKT, VUT v Brně, 2007.