Individální projekty MPOA

Mikroprocesory s architekturou ARM

Uživatelské nástroje

Nástroje pro tento web


2014:led-tetris

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revize Předchozí verze
Následující verze
Předchozí verze
2014:led-tetris [2015/01/17 21:15]
Matej Hojdík [Firmware]
2014:led-tetris [2015/01/18 22:07] (aktuální)
Matej Hojdík [Záver]
Řádek 1: Řádek 1:
 ====== Tetris na RGB LED matici ====== ====== Tetris na RGB LED matici ======
 ===== Zadanie: ===== ===== Zadanie: =====
-Realizujte pomocí FRDM-KL25Z a RGB LED matice 8×8 hru Tetris ovládanou akcelerometrem. Při realizaci využijte barevnost matice (např. každá kostka bude mít jinou barvu).+Realizujte pomocí FRDM-KL25Z a RG LED matice 8×8 hru Tetris ovládanou akcelerometrem. Při realizaci využijte barevnost matice (např. každá kostka bude mít jinou barvu). 
 + 
 +---- 
 ===== TETRIS ===== ===== TETRIS =====
 Čo to ten tetris vlastne je: (naozaj sa mi stalo, že to niekto nevedel) Čo to ten tetris vlastne je: (naozaj sa mi stalo, že to niekto nevedel)
 {{youtube>​9Fv5cuYZFC0?​medium}} {{youtube>​9Fv5cuYZFC0?​medium}}
 +
 +----
 +
 ===== Hardware ===== ===== Hardware =====
 Okrem FRDM-KL25Z (ktorej popis sem nebudem dávať, pretože google má doma teraz už skoro každý) a RG LED matice 8x8, ktorá má tak trochu neznáme zapojenie, ale chovanie sa po pripojení k napájaniu dá relatívne jednoducho zistiť (o čo sa postaral Tomáš Jankech), som vytvoril redukciu medzi túto maticu a KL25Z ([[2014:​led-8x8-adapter|Redukcia matice 8x8 pre KL25Z]]). Okrem FRDM-KL25Z (ktorej popis sem nebudem dávať, pretože google má doma teraz už skoro každý) a RG LED matice 8x8, ktorá má tak trochu neznáme zapojenie, ale chovanie sa po pripojení k napájaniu dá relatívne jednoducho zistiť (o čo sa postaral Tomáš Jankech), som vytvoril redukciu medzi túto maticu a KL25Z ([[2014:​led-8x8-adapter|Redukcia matice 8x8 pre KL25Z]]).
Řádek 92: Řádek 98:
 Každý nový segment sa vždy objaví na súradnici y=0, x=6. Každý nový segment sa vždy objaví na súradnici y=0, x=6.
  
-Od tejto súradnice sa skontroluje,​ či sa neprekryje nový segment s vysvietenou časťou (čiže predchádzajúce segmenty, prípadne ich zvyšky). Ak dojde ku kolízií pole ''​int dispArray[8][16]''​ sa vynuluje a začína nová hra. Ak nenastane kolízia, segment sa na určitu dobu zapíše to tohoto poľa a tým sa vysvieti.+Od tejto súradnice sa v dvoch for cykloch (riadok, stĺpec) ​skontroluje,​ či sa neprekryje nový segment s vysvietenou časťou (čiže predchádzajúce segmenty, prípadne ich zvyšky). Ak dojde ku kolízií pole ''​int dispArray[8][16]''​ sa vynuluje a začína nová hra. Ak nenastane kolízia, segment sa na určitu dobu zapíše to tohoto poľa a tým sa vysvieti.
  
-V tomto momente sa začína inkrementovať premenná counter. Vždy keď je counter násobkom 4000, testuje sa návratová hodnota z funkcie pre obsluhu akcelerometra. Podľa návratovej hodnoty z funkcie obsluhujúcej akcelerometer sa rozhodne:+V tomto momente sa začína inkrementovať premenná counter. Vždy keď je counter násobkom 4000, testuje sa návratová hodnota z funkcie pre obsluhu akcelerometra, pričom plne dostačujúce sú hodnoty z osí x a y. Podľa návratovej hodnoty z funkcie obsluhujúcej akcelerometer sa rozhodne:
   * či sa má segment pohnúť v pravo - realizované náklonom dosky do prava   * či sa má segment pohnúť v pravo - realizované náklonom dosky do prava
   * či sa má segment pohnúť v ľavo - realizované náklonom dosky do ľava   * či sa má segment pohnúť v ľavo - realizované náklonom dosky do ľava
Řádek 100: Řádek 106:
   * či má segment rotovať - náklon od seba   * či má segment rotovať - náklon od seba
 Ak vyhovie niektorá z podmnienok, vymaže sa segment z poľa, odtestuje sa či segment po zmene súradníc, prípadne po orotovaní nezmizne z poľa, pripadne sa neprekryje s vysvietenou časťou. Ak je všetko v poriadku zmenia sa súradnice/​rotuje sa a segment sa znova zapiše do poľa. To neplatí ale pre klesanie na dol. Ak vyhovie niektorá z podmnienok, vymaže sa segment z poľa, odtestuje sa či segment po zmene súradníc, prípadne po orotovaní nezmizne z poľa, pripadne sa neprekryje s vysvietenou časťou. Ak je všetko v poriadku zmenia sa súradnice/​rotuje sa a segment sa znova zapiše do poľa. To neplatí ale pre klesanie na dol.
 +Rotácia berie ako východzí bod súradnice x, y. Od tohto bodu sa do matice vpíše nový rotovaný segment, ak sa splnia podmienky a nedôjde ku kolízií/​vybehnutí z poľa. ​
  
-Pri klesaní nadol sa totižto ​do counter nahrá hodnota 400001. To z dôvodu, že ak counter == 400001, inkrementuje sa súradnica y, skontroluje sa, či nedojde ku kolízií s vysvietenou časťou alebo segment nevypadne z poľa. Taktiež dochádza k vymazaniu a zápisu segmentu do poľa. ​+Pri klesaní nadol sa do counter nahrá hodnota 400001 ​(hodnota daná pozorovaním - subjektívne dobrá hrateľnosť pri optimálnej obtiažnosti). To z dôvodu, že ak counter == 400001, inkrementuje sa súradnica y, skontroluje sa, či nedojde ku kolízií s vysvietenou časťou alebo segment nevypadne z poľa. Taktiež dochádza k vymazaniu a zápisu segmentu do poľa. ​
 V tejto časti sa teda rozhoduje o tom či: V tejto časti sa teda rozhoduje o tom či:
   * segment sa posunie o riadok nižšie a funkcia je v cykle znova volaná   * segment sa posunie o riadok nižšie a funkcia je v cykle znova volaná
Řádek 136: Řádek 143:
 </​code>​ </​code>​
  
 +----
 +=== Zoznam všetkých funkcií ===
 +podrobnejšie sú tieto funkcie, tak ako celý firmware popísané[[http://​developer.mbed.org/​users/​lamaking/​code/​Tet_-r-is/​|tu]]
 +<code cpp>
 +// prototypy funkcii
 +short RandSegment(void); ​                                           //funkcia nahodne vybera novy segment pomocou citania A/D vstupu
 +void SegmentInit(void); ​                                            //​prida jednotlivym segmentom informacie o ich vlastnostiach - pocet riadkov, stlpcov, rotovany segment, priradi pole s vlastnostou farby
 +void SegmentCopy(struct segments *psgm, int segmentIn[2][4]); ​      //v SegmentInit skopiruje vytvorene pole segmentu do pola v strukture (struct segments)
 +void MoveDown(int array[8][16],​ int line); ​                         //posun pola smerom dole po odstranení zaplneneho riadku
 +void LineCheck(void); ​                                              //​funkcia kontroluje zaplneny riadok
 +void SegmentMove(struct segments *psgm); ​                           //funkcia sa stara o pohyby segmentu
 +void WriteClrSeg(int wrtEnab, struct segments *psgm); ​              //​zmazanie alebo zapis segmentu pri pohybe maticou
 +int DecLvl(void); ​                                                  //​obsluha akcelerometra ​ (preco prave Dec som zabudol)
 +void LineAdd(int line); ​                                            //​adresacia riadkov
 +void Display(void); ​                                                //​rozsvecovanie farieb v riadkoch podla hlavnej matice
 +void OutPortInit(void); ​                                            //​nastavenie portov do pociatocneho stavu - vypnutie/​zhasnutie
 +</​code>​
 +
 +----
 +
 +
 +===== Video =====
 +{{youtube>​I4FozX_6QaM?​medium}}
 +
 +----
 +
 +===== Záver =====
 +
 +Zadaním bolo realizovať hru Tetris pomocou FRDM-KL25Z a RG LED matice 8x8 s využitím farebnosti matice. Ovládanie bolo realizované pomocou akcelerometra.
 +
 +Zadanie sa podarilo splniť v plnom rozsahu. Program bol odladený od drobných chýb takže hra je plne hrateľná, odskúšaná a relatívne náročná na ovládanie, čo jej prídáva na atraktivite. Drobnosti ako skóre, zvyšovanie rýchlosti po dosiahnutí určitej úrovne a podobne neboli pridané. Jednak je matica relatívne malá, takže už po pár segmentoch môže byť pole plne obsadené a ovládanie je už beztak dostatočne náročné, takže nízke skóre skôr odradí. Zato je hra vybavená random generátorom,​ takže je o to viac zaujímavejšia.
 +
 +Malou nevýhodou je, že ak je pri pohybe s doskou jemne buchnuté, môže akcelerometer zaznamenať vyššiu hodnotu v niektorej osi (viz video 0:20), najpravdepodobnejšie v tej, kde je najväčší náklon. Riešenie je jednoduché:​ stačí mať hru vždy vo vzduchu.
2014/led-tetris.1421525708.txt.gz · Poslední úprava: 2015/01/17 21:15 autor: Matej Hojdík