Šiandien mes nagrinėsime „Tetris“ žaidimo vidų, parašytą po platforma arduino ir LED matrica.
Šio naminio produkto autorius yra AlexGyver, to paties pavadinimo „YouTube“ kanalo autorius. Sveiki atvykę į nuostabų kvadratinių taškų pasaulį.
Pradėkime nuo istorijos. Tetris yra žaidimas, kuriame figūros, susidedančios iš 4 kvadratų, krenta iš viršaus į apačią. Skirtingais deriniais šias figūras galima pasukti ir perkelti į kairę ir į dešinę. Žaidimo tikslas yra surinkti horizontalius lygius, kurie bus išvalyti ir už kuriuos tau bus skirti taškai. Praradimas laikomas tuo momentu, kai naujas skaičius niekur nekrinta. „Tetris“ išrado sovietų programuotojas Aleksejus Leonidovičius Pazhitnovas.
Originali „Pascal“ versija pasirodė 1984 m. Birželio 6 d. Nuo to laiko „Tetris“ nuėjo ilgą kelią ir buvo perkeltas į visas platformas, kuriose paprastai galima žaisti žaidimus, taip pat į įrenginius, kurie visai nėra skirti žaidimams, tokius kaip inžinerinė skaičiuoklė, osciloskopas ir, jūs netikite, lituoklis.
Pagal parduodamų komercinių versijų skaičių „Tetris“ yra pranašesnis už kitus žaidimus žmonijos istorijoje. Vienam „Game Boy“ buvo parduota 35 milijonai egzempliorių, jau nekalbant apie nešiojamąjį „Brick Game“, kurį beveik visi turėjo vienu metu.
Pradėsime tetris ant arduino ir spalvų matricą diegdami „ramentus“. Matricą sudaro trijų spalvų adresiniai šviesos diodai. Šio tipo matricos problema yra ta, kad ji yra per kieta. Kiekvieno taško spalva užkoduota 24 bitų, tai yra, 8 bitai kiekvienam komponentui: raudona, žalia ir mėlyna. Nėra tokio tipo duomenų apie arduino, yra šie duomenys - 32 bitai.
Visų šviesos diodų spalvos turėtų būti saugomos RAM, nes mes jas pakeisime. Ir kad 16-16 matricoje mes turime tiksliai 1 KB užimtos dinaminės atminties, o arduino nano turi tik 2 iš jų.
Pridėkite dar keletą bibliotekų ir pradėkite rašyti kodą, atmintis baigsis. Autorius iš esmės nenaudoja, pavyzdžiui, arduino mega, kur yra daugiau atminties. Tikslas yra sukurti žaidimą specialiai „arduino nano“, naudojant paprastus, standartinius ir gerai žinomus įrankius, tačiau tuo pačiu ir nestandartinius metodus bei „ramentus“ ir padedant jiems pasiekti optimaliausią kodą.
Pirmasis „ramentas“ bus atsisakymas atskirai išsaugoti atmintyje figūrų pozicijas ir apskritai viską, kas vyksta ekrane.Turime saugoti tiekiamo paveikslo taškų koordinates ir jau nukritusių figūrų taškų koordinates, tai yra, maksimaliai, mums reikia dar 1 masyvo, dvimatės 16 iš 16, ir tai yra net 256 baitai.
Jūs ir aš jau turime spalvų pynę visiems pikseliams, naudokime ją. Iš tikrųjų, be to, kad ant matricos galime uždėti spalvotą tašką, mes galime išmatuoti esamo taško šviesą taip, kad dirbtume su spalvomis.
„Tetris“ prasideda krintančiu bloku, kuris valdomas mygtukais ir turi 2 koordinates matricos koordinačių sistemoje. Tai labai paprasta, mes pastatome laikmatį, pagal kurį blokas kris. Tai yra autoriaus biblioteka, galite perskaityti svetainėje.
Norėdami apdoroti mygtukus, autorius taip pat naudojasi savo biblioteka. Mygtukų sujungimo schema yra juokingai paprasta: 4 mygtukai, 8 laidai.
Kiekviename laikmačio žingsnyje mes nupiešiame tašką pikseliu žemiau seno, o seną tašką nupiešiame juodai, tai yra, išjunkite šviesos diodą. Spustelėdami mygtuką, mes darome tą patį, bet su horizontalia koordinates. Na, dėl padorumo mes apribosime matricos dydį, kad taškas neviršytų lauko.
Žiūrėk, nieko sudėtinga. Bet tai neilgai, nes atėjo laikas atkreipti skaičius. Mes dirbsime taip: išlaikysime nuorodą į tiekimo tašką, apie kurį jau rašėme, vadinsime jį pagrindiniu tašku arba pagrindiniu bloku. Pagrindinis blokas juda matricos koordinačių sistemoje, mes jau tai padarėme. Visos „Tetris“ figūros susideda iš 4 blokų, todėl, beje, jis vadinamas Tetris.
Atitinkamai mums lieka baigti pridėti dar 3 blokus prie pagrindinio bloko. Parašykime jų koordinates pagrindinio bloko koordinačių sistemoje, kad pagrindinis blokas visada būtų žemiau. Tai labai paprasta, paimkite apverstos raidės T. skaičių. Pagrindinis blokas nuo apačios iki centro koordinatės sistemoje turi koordinates 0,0.
Viršutinis blokas yra 0,1, dešinysis - 1,1, o kairysis - 1,1.
Paimkite raidę G. Apatinis blokas yra 0,0, kitas 0,1, kitas 0,2 ir 1,2 raidės kraštas.
Šią koordinaciją į masyvą surašome tokia forma: {0,1, 0,2, 1,2} ir numetame masyvą į „flash“ atmintį, kad nešvaistytume dinaminės atminties. Kalbant apie figūrų sukimąsi. Neįmanoma pasukti figūrų. Labai sudėtinga paaiškinti mikrovaldikliui, kaip tai padaryti. Norėdami tai padaryti, turite nustatyti sukimosi centrą, kažkaip suskaidyti figūrą į dalis ir kiekvienai daliai ieškoti naujų koordinačių, atsižvelgiant į stiprią pikselę, kuri akivaizdžiai lems klaidas ir tai pasirodys nesąmonė. Problema išspręsta labai paprastai, atmintyje paliksime visas 4 visų figūrų ir visų pozicijas.
Tiesą sakant, dabar lieka atsitiktinai pasirinkti figūros numerį ir nubrėžti jį aplink krentantį bloką. Čia visiems 3 likusiems blokams mes paimame koordinates iš blykstės atminties, išverčiame jas į globalias matricos koordinates ir įjungiame šviesos diodus. Beje, spalva taip pat pasirenkama atsitiktinai iš 6 paprasčiausių ir ryškiausių rgb erdvės spalvų. Figūros sukimosi kampas raundo pradžioje taip pat nustatomas atsitiktinai. Kai paspausite mygtuką aukštyn, paimkite kitą koordinačių rinkinį, kad nupieštumėte ir pasuktumėte pagal laikrodžio rodyklę. Formos judėjimas veikia vienodai. Pirmiausia ištriname figūrą ankstesnėje padėtyje, tai yra, nupieškite ją juodai, tada naujoje padėtyje nupieškite dabartinę figūros spalvą. Vėl sukdami, mes ištriname senąją padėtį ir tiesiog nupiešiame naują.
Firmware galima atsisiųsti iš. Mes analizuosime tik esmę. Pradėkime nuo kairės ir dešinės sienų ir dugno tikrinimo. Su dugnu viskas labai paprasta, žiūrime į kiekvieną kritimo žingsnį, ar bazinis blokas yra pasiekęs 0 aukštį, tai nėra sunku, tačiau kiekvieną kartą paspausdami valdymo mygtuką turime pamatyti, ar kraštutinis figūros taškas liečia matricos šonines sienas.
Jei palietėte, nejudinkite figūros. Tas pats pasakytina apie figūrų sukimąsi. Pvz., Jei nauja figūros padėtis išsikiša už sienų, tada pasukti draudžiama, o kadangi visos mūsų figūros yra skirtingų formų, tada visi kraštutiniai blokai jiems yra skirtingi. Kiekvienai figūrai būtų galima dažyti atskirus kraštutinius blokus, kad būtų supaprastintas mikrovaldiklio darbas, tačiau tegul manoma, kad jie tai sugalvojo.
Viskas labai paprasta. Bet kita užduotis yra daug įdomesnė. Turime patikrinti, ar nėra susidūrimų su blokais, kurie jau yra žemiau.Jei turėtume masyvą, kuriame būtų visų lauko langelių būsena, būtų lengviau, tačiau juostos taškeliams naudosime spalvų gamą, taigi turėsime šauniausią „ramentą“. Kokia yra tikroji problema. Viskas atrodo paprasta, kris žalia figūra, o kiekvienas kritimo žingsnis, kiekvienas poslinkis į šoną ir kiekvienas bandymas pasukti turėtų patikrinti, ar figūra naujoje padėtyje remiasi jau gulinčiomis figūromis. Jei visiems blokams aplinkinė spalva yra lygi juodai arba lygi figūros spalvai, tuomet leidžiame judėti norima linkme. Tai veiks tol, kol žemiau mūsų esanti forma bus tokios pat spalvos kaip ir krentanti forma. Tai iš tikrųjų yra „ramentas“: nukritusią formą mes perdažysime kita spalva. Dažyti nepastebimai akims, bet pastebimai programai. Viskas, ką jums reikia padaryti, yra šiek tiek padidinti esamos formos spalvos ryškumą ir viskas.
Figūra nukrito ant dugno ar kitos figūros, jos ryškumas nepadidėjo pastebimai, o naujame ture krentančios figūros nebepainioja jos spalvos su savo, jos kris ant jos ir lygiai taip pat fiksuotos, šiek tiek pridedant ryškumą.
Beje, paspaudus mygtuką žemyn, figūra dideliu greičiu nusileidžia žemyn ir užima savo vietą.
Mūsų „Tetris“ paliekamas paskutinis prisilietimas, būtent horizontalių patikrinimas ir išvalymas užpildytais lygiais. Čia viskas paprasta. Pataisę figūrą dabartiniame apvalume, judame linijomis ir lyginame taškų spalvas su juoda. Jei visoje eilutėje nėra nė vieno juodo taško, tada mes išvalysime visą eilutę.
Aptiktos linijos užpildomos balta spalva, tada ryškumas palaipsniui sumažėja iki nulio ir gaunama animacija. Toliau visi taškai, pradedant nuo pirmosios užpildytos eilutės ir baigiant viršuje, paslenkami žemyn ir išvalytų eilučių skaičius. Šis procesas kartojamas, kol nėra baigtų lygių. Taip pat patikriname, ar pasiekėme viršūnę, o tai reiškia prarasti. Tokiu atveju rodoma sąskaita, lygi išvalytų lygių skaičiui.
Paskyra rodoma skaičiais, kurie saugomi atmintyje kaip skaičių ir nulių rinkinys, kuriais LED įjungiami arba išjungiami. Štai kaip atrodo „Tetris“, parašytas adresų matricoje. Ačiū už dėmesį. Greitai pasimatysime!
Vaizdo įrašas: