» Electronics » Arduino »Paggawa ng Tetris sa Arduino

Paggawa ng Tetris sa Arduino

Pagbati ang mga naninirahan sa aming site!
Ngayon ay pag-aralan natin ang mga insides ng larong Tetris na nakasulat sa ilalim ng platform arduino at LED matrix.

Ang may-akda ng produktong homemade na ito ay si AlexGyver, ang may-akda ng YouTube channel ng parehong pangalan. Maligayang pagdating sa kahanga-hangang mundo ng mga pixel na parisukat.

Magsimula tayo sa kwento. Ang Tetris ay isang laro kung saan ang mga numero na binubuo ng 4 na mga parisukat na mahulog mula sa itaas hanggang sa ibaba. Sa iba't ibang mga kumbinasyon, ang mga hugis na ito ay maaaring paikutin at ilipat ang kaliwa at kanan. Ang layunin ng laro ay upang mangolekta ng mga pahalang na antas na na-clear at ang mga puntos ay iginawad sa iyo. Ang pagkawala ay itinuturing na sandali kapag ang bagong figure ay wala saanman mahulog. Ang Tetris ay imbento ng programista ng Sobyet na si Alexei Leonidovich Pazhitnov.

Ang orihinal na bersyon ng Pascal ay lumitaw noong Hunyo 6, 1984. Simula noon, ang Tetris ay matagal nang nakarating at naipakita sa lahat ng mga platform kung saan sa pangkalahatan posible na maglaro ng mga laro, pati na rin sa mga aparato na hindi inilaan para sa mga laro, halimbawa, tulad ng isang calculator ng engineering, osiloskop at, hindi ka maniniwala, isang paghihinang bakal.



Sa pamamagitan ng bilang ng mga komersyal na bersyon na nabili, ang Tetris ay higit sa lahat sa iba pang mga laro sa kasaysayan ng sangkatauhan. Para lamang sa isang Game Boy, 35 milyong kopya ang naibenta, hindi sa banggitin ang portable na Brick Game, na halos lahat ay sa isang pagkakataon.
Sisimulan natin ang pagpapatupad ng tetris sa arduino at isang color matrix na may pagsusuri ng "crutches". Ang matrix ay binubuo ng mga three-color address LEDs. Ang problema sa ganitong uri ng matrix ay sobrang cool na. Ang kulay ng bawat pixel ay naka-encode na may 24 bits, iyon ay, 8 bits para sa bawat sangkap: pula, berde at asul. Walang ganoong uri ng data sa arduino, mayroong sumusunod - 32 piraso.

Ang mga kulay ng lahat ng mga LED ay dapat na naka-imbak sa RAM, dahil mababago natin ang mga ito. At bilang karagdagan, para sa isang 16 sa pamamagitan ng 16 na matrix, mayroon kaming eksaktong 1 KB na nasasakop ng dynamic na memorya, at ang arduino nano ay mayroon lamang 2 sa kanila.

Magdagdag ng ilang higit pang mga aklatan at simulang magsulat ng code, magtatapos ang memorya. Ang may-akda ay hindi gumagamit, halimbawa, arduino mega, kung saan mayroong higit pang memorya. Ang layunin ay upang gawin ang laro sa arduino nano, gamit ang simple, pamantayan at kilalang mga tool, ngunit sa parehong oras na hindi karaniwang pamantayan at "crutches" at sa kanilang tulong na makamit ang pinaka-optimal na code.

Ang unang "crutch" ay ang pagtanggi na hiwalay na mag-imbak sa memorya ng mga posisyon ng mga numero at sa pangkalahatan lahat ng nangyayari sa screen.Kailangan nating mag-imbak ng mga coordinate ng mga puntos ng figure sa pagpapakain at ang mga coordinate ng mga puntos ng mga nahulog na mga numero, iyon ay, bilang isang maximum, kailangan namin ng isa pang array, two-dimensional 16 sa pamamagitan ng 16, at ito ay kasing dami ng 256 bait.

Mayroon ka na at mayroon akong isang hanay ng mga kulay para sa lahat ng mga pixel, gamitin natin ito. Sa katunayan, bilang karagdagan sa katotohanan na maaari naming maglagay ng isang may kulay na tuldok sa matrix, masusukat namin ang ilaw ng isang umiiral na punto upang gumana kami sa mga kulay.

Ang Tetris ay nagsisimula sa isang bumabagsak na bloke, na kinokontrol ng mga pindutan at may 2 coordinates sa sistema ng coordinate ng matrix. Napakasimpleng ito, nagtatayo kami ng isang timer, ayon sa kung saan mahuhulog ang bloke. Ito ang library ng may-akda, maaari mong basahin sa site.

Upang maproseso ang mga pindutan, gumagamit din ang may-akda ng kanyang aklatan. Ang scheme ng koneksyon ng mga pindutan ay nakakatawa simple: 4 na pindutan, 8 mga wire.

Ang bawat hakbang ng timer, gumuhit kami ng isang punto ng isang pixel sa ibaba ng una, at iguhit ang lumang punto sa itim, iyon ay, patayin ang LED. Sa pamamagitan ng pag-click sa pindutan, ginagawa namin ang pareho, ngunit may isang pahalang na coordinate. Well, para sa pagiging disente, lalimitahan namin ang laki ng matrix upang ang punto ay hindi lalampas sa larangan.

Kita n'yo, walang kumplikado. Ngunit ito ay hindi para sa katagal dahil ang oras ay dumating upang gumuhit ng mga numero. Kami ay gagana tulad ng sumusunod: panatilihin namin ang sanggunian sa supply point, na nasulat na namin, tatawagin namin ito ang pangunahing punto o ang pangunahing bloke. Ang pangunahing bloke ay gumagalaw sa sistema ng coordinate ng matrix, nagawa na namin ito. Ang lahat ng mga numero ng Tetris ay binubuo ng 4 na mga bloke, kung kaya't, sa pamamagitan ng paraan, ito ay tinatawag na Tetris.

Alinsunod dito, nananatili para sa amin upang matapos ang pagdaragdag ng 3 higit pang mga bloke sa pangunahing bloke. Isulat natin ang kanilang mga coordinate sa coordinate system ng pangunahing bloke, upang ang pangunahing bloke ay palaging nasa ibaba. Ito ay napaka-simple, kunin ang figure ng baligtad na titik T. Ang pangunahing bloke mula sa ibaba hanggang sa sentro ay may coordinate 0.0 sa sistema ng coordinate nito.

Ang itaas na bloke ay 0.1, ang kanan ay 1.1 at ang kaliwa ay -1.1.

Kunin ang titik G. Ang ibabang bloke ay 0.0, ang susunod na 0.1, ang susunod na 0.2, at ang gilid ng titik na 1.2.

Isinulat namin ang mga coordinate na ito sa array sa mga sumusunod na form: {0.1, 0.2, 1.2} at ibinaba ang array sa flash memory upang hindi mag-aksaya ng mga dynamic na memorya. Tulad ng para sa pag-ikot ng mga figure. Imposibleng iikot ang mga numero. Ito ay corny napakahirap ipaliwanag sa microcontroller kung paano ito gagawin. Upang gawin ito, kailangan mong itakda ang sentro ng pag-ikot, kahit papaano mabulok ang figure sa mga bahagi at maghanap ng mga bagong coordinate para sa bawat bahagi, isinasaalang-alang ang malakas na pixelation, na malinaw na hahantong sa mga pagkakamali at ito ay magiging kalokohan. Ang problema ay malulutas nang napaka-simple, panatilihin namin sa memorya ng lahat ng 4 na posisyon para sa lahat ng mga numero at lahat.

Sa totoo lang, nananatili itong random na piliin ang numero ng figure at iguhit ito sa bumabagsak na bloke. Dito, para sa lahat ng 3 natitirang mga bloke, kukuha kami ng mga coordinate mula sa memorya ng flash, isalin ang mga ito sa pandaigdigang mga coordinate ng matrix, at i-on ang mga LED. Sa pamamagitan ng paraan, ang kulay ay pinili din nang sapalaran mula sa 6 pinaka-simple at maliwanag na kulay ng puwang ng rgb. Ang anggulo ng pag-ikot ng figure sa simula ng pag-ikot ay naka-set din nang random, at kapag pinindot mo ang pindutan up, kunin lamang ang susunod na hanay ng mga coordinate upang iguhit at paikutin ito nang sunud-sunod. Ang paglipat ng isang hugis ay gumagana sa lahat ng pareho. Una, burahin namin ang figure sa nakaraang posisyon, iyon ay, iguhit ito ng itim, pagkatapos ay sa bagong posisyon iguhit ang kasalukuyang kulay ng figure. Kapag lumiliko, muli, tinanggal namin ang lumang posisyon at gumuhit lamang ng bago.

Maaaring mai-download ang firmware sa. Susuriin lamang namin ang kakanyahan. Magsimula tayo sa pamamagitan ng pagsuri sa kaliwa at kanang mga pader at sa ibaba. Ang lahat ay napaka-simple sa ilalim, tiningnan namin ang bawat hakbang ng taglagas, ay naabot ang base unit na may taas na 0, hindi ito mahirap, ngunit sa tuwing pinipindot namin ang pindutan ng control, kailangan nating makita kung ang matinding punto ng hugis ng mga dingding ng gilid ng matrix ay naantig.

Kung hinawakan, huwag ilipat ang pigura. Ang parehong napupunta para sa pag-ikot ng mga numero. Halimbawa, kung ang bagong posisyon ng pigura ay umaabot sa kabila ng mga pader, ipinagbabawal ang pag-ikot, at dahil ang lahat ng mga hugis na mayroon kami ay may iba't ibang mga hugis, kung gayon ang matinding mga bloke para sa kanila ay magkakaiba. Posible upang ipinta ang mga indibidwal na sobrang mga bloke para sa bawat figure upang gawing simple ang gawain ng microcontroller, ngunit hayaan itong isaalang-alang na naimbento nila ito para sa ito.

Ang lahat ay napaka-simple. Ngunit ang susunod na gawain ay mas kawili-wili. Kailangan nating suriin para sa mga banggaan na may mga bloke na nakahiga sa ibaba.Kung mayroon kaming isang hanay na naglalaman ng estado ng lahat ng mga cell sa patlang, magiging mas madali ito, ngunit gagamitin namin ang isang hanay ng mga kulay para sa mga pixel ng tape, kaya magkakaroon kami ng pinalamig na "saklay". Ano ang aktwal na problema. Ang lahat ay tila simple, ang isang berdeng pigura ay mahuhulog, at bawat hakbang ng taglagas, bawat shift sa gilid at bawat pagtatangka na lumiko ay dapat suriin kung ang figure sa bagong posisyon ay nakasalalay sa mga nakahiga na mga numero. Kung para sa lahat ng mga bloke ang nakapalibot na kulay ay katumbas ng itim o katumbas ng kulay ng figure, pagkatapos ay pinapayagan namin ang paggalaw sa nais na direksyon. Ito ay gagana hanggang sa ang hugis sa ibaba sa amin ay magkaparehong kulay ng bumabagsak na hugis. Iyon talaga ang "saklay": susunurin natin ang nahulog na hugis sa ibang kulay. Ipagpatuloy muli ang hindi nakikita para sa mga mata, ngunit kapansin-pansin para sa programa. Ang kailangan mo lang gawin ay bahagyang madagdagan ang ningning ng kasalukuyang kulay ng hugis at iyon ang lahat.


Ang figure ay nahulog sa ilalim o ibang figure, ang ningning nito ay hindi tumaas ng kapansin-pansin, at sa bagong pag-ikot ang mga bumabagsak na numero ay hindi na malito ang kulay nito sa kanilang sarili, mahuhulog ito at tulad ng naayos, bahagyang pagdaragdag ng ningning.

Sa pamamagitan ng paraan, kapag pinindot mo ang pindutan, bumababa ang figure sa isang mataas na bilis at kinuha ang lugar nito.

Ang aming Tetris ay naiwan kasama ang pangwakas na ugnay, lalo na ang pagsuri at paglilinis ng mga napuno na antas nang pahalang. Ang lahat ay simple dito. Matapos ayusin ang figure sa kasalukuyang pag-ikot, lumipat kami sa mga linya at inihambing ang mga kulay ng mga piksel na may itim. Kung walang isang solong itim na pixel sa buong linya, pagkatapos ay tatanggalin namin ang buong linya.


Ang mga nakita na linya ay napuno ng puti, pagkatapos ang ilaw ay unti-unting bumababa sa zero at nakuha ang animation. Karagdagan, ang lahat ng mga pixel, na nagsisimula mula sa unang napuno na linya hanggang sa tuktok, ay inilipat sa pamamagitan ng at ang bilang ng mga linya na na-clear. Ang prosesong ito ay paulit-ulit hanggang sa walang mga nakumpletong antas. Sinuri din namin kung naabot na namin ang tuktok, na nangangahulugang mawala. Sa kasong ito, ang isang account na katumbas ng bilang ng mga na-clear na antas ay ipinapakita.

Ang account ay ipinapakita sa mga numero, na naka-imbak sa memorya bilang isang set ng mga bago at zero, kung saan ang mga LED ay pagkatapos ay naka-on o naka-off. Ito ang naisulat ni Tetris sa address matrix. Salamat sa iyong pansin. Makita ka agad!

Video:
10
10
10

Magdagdag ng isang puna

    • ngitinakangitixaxaok langhindi alamyahoonea
      bosskumamottangaoooo-ooagresibolihim
      sorrysayawsayaw2sayaw3kapatawarantumulonginumin
      humintomga kaibiganmabutigoodgoodsipolswoondila
      usokpumapalakpakkrayolaipahayagnakakainisdon-t_mentionpag-download
      initnakakainistumawa1mdapagpupulongnakikipag-usapnegatibo
      hindi_ipopcornparusahanbasahintakottakotpaghahanap
      panunuyasalamat_youitoto_clueumniktalamaksumang-ayon
      masamabeeeblack_eyeblum3namulamagyabanginip
      censoredkaaya-ayalihim2nagbabantatagumpayyusun_bespectacled
      shokrespektlolnagustuhanmaligayang pagdatingkrutoyya_za
      ya_dobryikatulongne_huliganne_othodimapusokpagbabawalmalapit

Pinapayuhan ka naming basahin:

Ipasa ito para sa smartphone ...