Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
2014:led-tetris [2015/01/17 21:56] Matej Hojdík |
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). |
---- | ---- | ||
Řádek 98: | Řá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 106: | Řá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 143: | Řádek 144: | ||
---- | ---- | ||
+ | === 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 ===== | ===== Video ===== | ||
+ | {{youtube>I4FozX_6QaM?medium}} | ||
---- | ---- | ||
Řádek 150: | Řádek 171: | ||
===== Záver ===== | ===== 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. |