Danas ćemo proučavati unutrašnjost igre Tetris napisane ispod platforme Arduino i LED matrica.
Autor ovog domaćeg proizvoda je AlexGyver, autor istoimenog YouTube kanala. Dobrodošli u čudesni svijet kvadratnih piksela.
Krenimo s pričom. Tetris je igra u kojoj figure od 4 kvadrata padaju od vrha do dna. Ti se oblici mogu zakretati i pomicati ulijevo i udesno u različitim kombinacijama. Cilj igre je prikupiti vodoravne razine koje su očišćene i bodovi se dodjeljuju vama. Gubitkom se smatra trenutak kada novi lik nema kamo pasti. Tetris je izumio sovjetski programer Aleksej Leonidovich Pazhitnov.
Izvorna Pascal verzija pojavila se 6. lipnja 1984. godine. Od tada, Tetris je prošao dug put i prebačen je na sve platforme na kojima je općenito moguće igrati igre, kao i na uređaje koji uopće nisu namijenjeni igrama, na primjer, kao što su inženjerski kalkulator, osciloskop i, nećete vjerovati, lemljenje.
Po broju prodanih komercijalnih verzija, Tetris je superiorniji od bilo koje druge igre u povijesti čovječanstva. Za samo jednog Game Boysa prodano je 35 milijuna primjeraka, a da ne spominjemo prijenosni Brick Game koji su odjednom imali gotovo svi.
Započet ćemo primjenu tetrisa na arduinu i matrice boja analizom „štaka“. Matrica se sastoji od trobojnih LED indikatora. Problem s ovom vrstom matrice je što je previše cool. Boja svakog piksela kodirana je s 24 bita, to jest 8 bita za svaku komponentu: crvena, zelena i plava. Nema podataka o vrsti arduina, postoji sljedeće - 32 bita.
Boje svih LED dioda trebaju biti pohranjene u RAM-u, jer ćemo ih promijeniti. Uz to, za matricu od 16 do 16 imamo točno 1 KB zauzete dinamičke memorije, a arduino nano ih ima samo 2.
Dodajte još nekoliko knjižnica i počnite pisati kôd, memorija će završiti. Autor u osnovi ne koristi, na primjer, arduino mega, gdje ima više memorije. Cilj je napraviti igru na arduino nano-u, koristeći jednostavne, standardne i dobro poznate alate, ali istovremeno nestandardne pristupe i „štake“ i uz njihovu pomoć postižu najoptimalniji kod.
Prva „drolja“ bit će odbijanje odvojeno pohranjivanja u memoriju položaja figura i općenito svega što se događa na ekranu.Moramo pohraniti koordinate točaka dovodne figure i koordinate točaka već spuštenih figura, to jest, maksimalno, treba nam još 1 niz, dvodimenzionalni 16 do 16, a to je čak 256 bajta.
Ti i ja već imamo niz boja za sve piksele, iskoristimo ga. Doista, osim što na matricu možemo staviti obojenu točku, možemo izmjeriti i svjetlost postojeće točke tako da radimo s bojama.
Tetris započinje padajućim blokom koji se kontrolira tipkama i ima 2 koordinate u matričnom koordinatnom sustavu. Vrlo je jednostavno, gradimo tajmer prema kojem će blok pasti. Ovo je autorska knjižnica koju možete čitati na web mjestu.
Za obradu gumba autor koristi i svoju biblioteku. Shema spajanja tipki je smiješno jednostavna: 4 gumba, 8 žica.
Svakim korakom timera nacrtamo točku piksela ispod stare, a staru točku crtamo crnom bojom, odnosno isključimo LED. Klikom na gumb radimo isto, ali s horizontalnom koordinatom. Pa, za pristojnost, ograničit ćemo veličinu matrice, tako da točka ne prelazi polje.
Vidite, ništa komplicirano. Ali to nije dugo jer je došlo vrijeme za izvlačenje brojki. Radit ćemo na sljedeći način: zadržat ćemo vezivanje za opskrbnu točku, o čemu smo već pisali, nazvat ćemo ga glavnom točkom ili glavnim blokom. Glavni se blok kreće u koordinatnom sustavu matrice, to smo već učinili. Sve figure Tetrisa sastoje se od 4 bloka, zbog čega se, usput, i naziva Tetris.
U skladu s tim, ostaje nam dovršiti dodavanje još 3 bloka glavnom bloku. Napišemo njihove koordinate u koordinatni sustav glavnog bloka, tako da je glavni blok uvijek ispod. Vrlo je jednostavno, uzmite lik preokrenutog slova T. Glavni blok od dna do središta ima koordinate 0,0 u svom koordinatnom sustavu.
Gornji blok je 0,1, desni 1,1, a lijevi -1,1.
Uzmite slovo G. Donji blok je 0,0, sljedeći 0,1, sljedeći 0,2, a rub slova 1,2.
Ove koordinate upisujemo u niz u sljedećem obliku: {0.1, 0.2, 1.2} i ispustimo niz u flash memoriju kako ne bismo trošili dinamičku memoriju. Što se tiče rotacije figura. Nemoguće je rotirati figure. Lažno je, vrlo je teško objasniti mikrokontroleru kako to učiniti. Da biste to učinili, morate postaviti središte rotacije, nekako dekomponirati lik na dijelove i potražiti nove koordinate za svaki dio, uzimajući u obzir snažnu pikselu, što će očito dovesti do pogreške i ispostavit će se besmislice. Problem je riješen vrlo jednostavno, zadržat ćemo u sjećanju sva 4 položaja za sve figure i sve.
Zapravo sada ostaje nasumično odabrati broj figure i nacrtati je oko padajućeg bloka. Evo, za sva tri preostala bloka, uzmemo koordinate iz flash memorije, prevedemo ih u globalne koordinate matrice i uključimo LED. Uzgred, boja se također bira nasumično iz 6 najjednostavnijih i najsvjetlijih boja prostora u rgb-u. Kut zakretanja figure na početku kruga je također postavljen nasumično, a kad pritisnete tipku prema gore, samo uzmite sljedeći skup koordinata kako biste je nacrtali i zakrenite u smjeru kazaljke na satu. Pomicanje oblika djeluje isto. Prvo obrišemo lik na prethodnom položaju, tj. Crtamo je crnom bojom, a zatim u novom položaju nacrtamo trenutnu boju figure. Prilikom okretanja ponovo brišemo stari položaj i samo nacrtamo novi.
Alat za firmver možete preuzeti na. Analizirat ćemo samo suštinu. Započnimo provjerom lijevog i desnog zida i dna. S dnom je sve vrlo jednostavno, gledamo svaki korak pada, je li osnovna jedinica dosegla visinu od 0, to nije teško, ali svaki put kada pritisnemo upravljačku tipku, trebamo vidjeti je li se dodirnula ekstremna točka oblika bočnih zidova matrice.
Ako dodirnete, nemojte pomicati lik. Isto vrijedi i za rotaciju figura. Na primjer, ako se novi položaj figure proteže izvan zidova, tada je zakretanje zabranjeno, a budući da su sve figure koje imamo su različitih oblika, tada su krajnji blokovi za njih različiti. Bilo bi moguće oslikati pojedinačne ekstremne blokove za svaku figuru kako bi se pojednostavio rad mikrokontrolera, ali neka se uzme u obzir da su to izmislili za to.
Sve je vrlo jednostavno. Ali sljedeći je zadatak mnogo zanimljiviji. Moramo provjeriti ima li sudara s blokovima koji već leže ispod.Da smo imali niz koji sadrži stanje svih ćelija u polju, bilo bi lakše, ali upotrijebit ćemo niz boja za piksele vrpce, tako da ćemo imati najslađu „krčmu“. Koji je stvarni problem. Čini se da je sve jednostavno, zelena figura će pasti, a svaki korak pada, svaki pomak u stranu i svaki pokušaj okretanja trebaju provjeriti da li lik u novom položaju počiva na već ležećim figurama. Ako je za sve blokove okolna boja jednaka crnoj ili jednaka boji figure, tada dopuštamo kretanje u željenom smjeru. To će raditi sve dok oblik ispod nas ne postane iste boje kao padajući oblik. To je zapravo "škrga": obojiti ćemo oboreni oblik u drugu boju. Zamijetite neprimjetno za oči, ali uočljivo za program. Sve što trebate učiniti je malo povećati svjetlinu trenutne boje oblika i to je sve.
Lik je pao na dno ili neku drugu figuru, njegova svjetlina nije se vidno povećala, a u novom krugu padajuće figure više neće zbuniti njegovu boju s vlastitom, padat će na nju i fiksirati se na isti način, pomalo dodajući svjetlinu.
Usput, kad pritisnete tipku prema dolje, lik se velikom brzinom juri prema dolje i zauzima svoje mjesto.
Našem Tetrisu preostaje završni dodir, naime provjeravanje i očišćenje napunjenih nivoa vodoravno. Ovdje je sve jednostavno. Nakon što popravimo lik u trenutnom krugu, pomičemo se duž linija i usporedimo boje piksela s crnom. Ako u cijeloj liniji ne postoji nijedan crni piksel, tada ćemo očistiti cijelu liniju.
Otkriveni vodovi se napune bijelom bojom, a zatim svjetlina postupno opada na nulu i dobiva se animacija. Nadalje, svi pikseli, počevši od prvog ispunjenog retka prema vrhu, pomiču se prema dolje i brišu se broj linija. Taj se postupak ponavlja sve dok nema završene razine. Provjeravamo i jesmo li stigli do vrha, što znači gubitak. U ovom se slučaju prikazuje račun jednak broju izbrisanih razina.
Račun je prikazan brojevima koji su pohranjeni u memoriji kao skup broja i nula, prema kojima se LED zatim uključuju ili isključuju. Ovako izgleda Tetris napisan u adresnoj matrici. Hvala na pažnji. Vidimo se uskoro!
video: