Dnes budeme studovat vnitřky hry Tetris napsané pod platformou arduino a matice LED.
Autorem tohoto domácího produktu je AlexGyver, autor stejnojmenného kanálu YouTube. Vítejte v nádherném světě čtvercových pixelů.
Začněme s příběhem. Tetris je hra, ve které postavy sestávající ze 4 čtverců padají shora dolů. V různých kombinacích lze tyto tvary otáčet a pohybovat doleva a doprava. Cílem hry je sbírat vodorovné úrovně, které jsou vymazány a body vám budou přiděleny. Ztráta je považována za okamžik, kdy nová postava nemá kam spadnout. Tetris byl vynalezen sovětským programátorem Alexejem Leonidovičem Pazhitnovem.
Původní verze Pascalu se objevila 6. června 1984. Od té doby Tetris prošel dlouhou cestu a byl přenesen na všechny platformy, na kterých je obecně možné hrát hry, a také na zařízení, která nejsou určena pro hry vůbec, jako je například technická kalkulačka, osciloskop a nebudete věřit páječce.
Podle počtu prodaných komerčních verzí je Tetris lepší než jakákoli jiná hra v historii lidstva. Pouze pro jednoho herního chlapce bylo prodáno 35 milionů kopií, nemluvě o přenosné zděné hře, kterou měli téměř všichni najednou.
Začneme implementací tetrisu na arduino a barevné matice s analýzou „berlí“. Matice se skládá z tříbarevných adresových LED. Problém s tímto typem matice je v tom, že je příliš cool. Barva každého pixelu je kódována 24 bity, tj. 8 bity pro každou složku: červenou, zelenou a modrou. Na arduino neexistuje žádný takový typ dat, je to následující - 32 bitů.
Barvy všech LED by měly být uloženy v RAM, protože je změníme. A pro matici 16 x 16 máme přesně 1 KB obsazené dynamické paměti a arduino nano má pouze 2 z nich.
Přidejte několik dalších knihoven a začněte psát kód, paměť skončí. Autor v zásadě nepoužívá například arduino mega, kde je více paměti. Cílem je vytvořit hru speciálně na arduino nano pomocí jednoduchých, standardních a známých nástrojů, ale zároveň nestandardních přístupů a „berlí“ a jejich pomocí dosáhnout nejoptimálnějšího kódu.
První „berlou“ bude odmítnutí odděleně ukládat do paměti pozice čísel a obecně vše, co se děje na obrazovce.Potřebujeme uložit souřadnice bodů podávané postavy a souřadnice bodů již vynechaných čísel, to znamená, že jako maximum potřebujeme další 1 pole, dvourozměrné 16 x 16, a to je až 256 bajtů.
Ty a já už máme řadu barev pro všechny pixely, pojďme je použít. Opravdu, kromě toho, že můžeme na matici umístit barevný bod, můžeme také změřit světlo existujícího bodu, takže pracujeme s barvami.
Tetris začíná padajícím blokem, který je ovládán tlačítky a má 2 souřadnice v maticovém souřadném systému. Je to velmi jednoduché, stavíme časovač, podle kterého blok padne. Toto je autorova knihovna, kterou si můžete přečíst na webu.
Ke zpracování tlačítek autor používá také svou knihovnu. Schéma zapojení tlačítek je směšně jednoduché: 4 tlačítka, 8 vodičů.
V každém kroku časovače nakreslíme bod pod pixelem jeden pixel a starý bod nakreslíme černě, tj. Vypneme LED. Kliknutím na tlačítko uděláme to samé, ale s vodorovnou souřadnicí. Pro slušnost omezíme velikost matice tak, aby bod nepřekročil pole.
Vidíš, nic komplikovaného. Ale to netrvá dlouho, protože nadešel čas na kreslení čísel. Budeme pracovat následovně: uchováme odkaz na dodací místo, které jsme již napsali, nazveme jej hlavním bodem nebo hlavním blokem. Hlavní blok se pohybuje v maticovém souřadném systému, už jsme to udělali. Všechny postavy Tetrisu se skládají ze 4 bloků, a proto se mimochodem nazývá Tetris.
Podle toho tedy zbývá dokončit přidávání dalších 3 bloků do hlavního bloku. Napíšeme jejich souřadnice v souřadném systému hlavního bloku tak, aby hlavní blok byl vždy pod. Je to velmi jednoduché, vezměte obrázek obráceného písmene T. Hlavní blok odspodu ke středu má souřadnice ve svém souřadném systému.
Horní blok je 0,1, vpravo 1,1 a vlevo -1,1.
Vezměte písmeno G. Dolní blok je 0,0, dalších 0,1, dalších 0,2 a okraje dopisu 1.2.
Tuto koordinaci zapisujeme do pole v následující podobě: {0,1, 0,2, 1,2} a přetahujeme pole do flash paměti, aby nedošlo k plýtvání dynamickou pamětí. Pokud jde o rotaci čísel. Není možné otáčet čísla. Je to drsné, že je velmi obtížné vysvětlit mikrokontroléru, jak to udělat. Chcete-li to provést, musíte nastavit střed otáčení, nějak rozložit obrázek na části a hledat nové souřadnice pro každou část, s přihlédnutím k silné pixelaci, což zjevně povede k chybám a ukáže se nesmysl. Problém je vyřešen velmi jednoduše, uchováme v paměti všechny 4 pozice pro všechny postavy a všechny.
Ve skutečnosti nyní zbývá náhodně vybrat číslo obrázku a nakreslit ho kolem padajícího bloku. Zde pro všechny 3 zbývající bloky bereme souřadnice z flash paměti, převádíme je do globálních souřadnic matice a rozsvítíme LED diody. Mimochodem, barva je také vybrána náhodně z 6 nejjednodušších a nejjasnějších barev prostoru rgb. Úhel natočení obrázku na začátku kola je také nastaven náhodně a když stisknete tlačítko nahoru, vezměte další sadu souřadnic a nakreslete jej a otočte ve směru hodinových ručiček. Pohyb tvaru funguje stejně. Nejprve vymažeme obrázek na předchozí pozici, tj. Nakreslí ho černě, pak v nové poloze nakreslí aktuální barvu obrázku. Při otáčení opět smažeme staré místo a jen nakreslíme nové.
Firmware si můžete stáhnout na adrese. Budeme analyzovat pouze podstatu. Začněme kontrolou levé a pravé stěny a dna. Vše je velmi jednoduché se spodkem, podíváme se na každý krok pádu, má základní jednotka výšku 0, není to obtížné, ale pokaždé, když stiskneme ovládací tlačítko, musíme zjistit, zda se dotkl krajní bod tvaru bočních stěn matice.
Pokud se dotknete, nepohybujte postavou. Totéž platí pro rotaci čísel. Například, pokud nová poloha obrázku přesahuje zdi, pak je rotace zakázána a protože všechny postavy, které máme, mají různé tvary, jsou extrémní bloky pro ně různé. Bylo by možné namalovat jednotlivé extrémní bloky pro každou postavu, aby se zjednodušila práce mikrokontroléru, ale nechte se považovat za to, že pro ni vymysleli.
Všechno je velmi jednoduché. Ale další úkol je mnohem zajímavější. Musíme zkontrolovat kolize s bloky již ležícími níže.Kdybychom měli pole, které obsahovalo stav všech buněk v poli, bylo by to snazší, ale použijeme pole barev pro pixely pásky, takže budeme mít nejchladnější berlu. Jaký je skutečný problém? Všechno se zdá být jednoduché, zelená postava padne a každý krok pádu, každý posun na stranu a každý pokus o otočení by měl zkontrolovat, zda postava v nové poloze spočívá na již ležících postavách. Pokud je pro všechny bloky okolní barva rovna černé nebo rovna barvě obrázku, povolíme pohyb v požadovaném směru. To bude fungovat, dokud tvar pod námi nebude mít stejnou barvu jako padající tvar. To je vlastně „berle“: padlý tvar překreslíme jinou barvou. Nepostřehnutelný pro oči, ale viditelný pro program. Vše, co musíte udělat, je mírně zvýšit jas aktuální barvy tvaru a to je vše.
Postava padla na dno nebo na jinou postavu, její jas se neznatelně nezvýšil, a v novém kole padající postavy již nebudou zaměňovat svoji barvu s vlastní, padnou na ni a budou stejně pevné, mírně přidávají jas.
Mimochodem, když stisknete tlačítko dolů, postava spěchá vysokou rychlostí a zaujímá své místo.
Náš Tetris je ponechán s konečným dotykem, a to horizontální kontrolou a vymazáním naplněných úrovní. Všechno je zde jednoduché. Po opravě postavy v aktuálním kole se pohybujeme podél čar a porovnáváme barvy pixelů s černou. Pokud na celé čáře není jediný černý pixel, vyčistíme celou čáru.
Zjištěné čáry jsou vyplněny bílou barvou, potom jas postupně klesá na nulu a získá se animace. Dále jsou všechny pixely, počínaje od první plné čáry nahoru, posunuty dolů a počet řádků, které byly vymazány. Tento proces se opakuje, dokud neexistují žádné dokončené úrovně. Také zkontrolujeme, zda jsme dosáhli vrcholu, což znamená ztrátu. V tomto případě se zobrazí účet rovný počtu vymazaných úrovní.
Účet je zobrazen v číslech, která jsou uložena v paměti jako sada jedniček a nul, podle kterých se pak LED diody zapnou nebo vypnou. Vypadá to, jak vypadá Tetris v matici adres. Děkuji za pozornost. Uvidíme se brzy!
Video: