ARKANOID projekt do MMIA

Jan Cigánek a Pavel Pelán, UREL, FEEC, VUT Brno
xcigan02stud.feec.vutbr.cz
xpelan02stud.feec.vutbr.cz

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Literatura

Úvod

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.

Realizace

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.


Logo ústavu
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.
Logo ústavu
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ů.
Logo ústavu
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.

Logo ústavu
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".
Logo ústavu
Obr.5 Arkanoid - funkční hra



Závěr

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

Literatura

[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.