Данас ћемо проучавати унутрашњости игре Тетрис написане испод платформе ардуино и ЛЕД матрицу.
Аутор овог домаћег производа је АлекГивер, аутор истоименог ИоуТубе канала. Добродошли у чудесни свет квадратних пиксела.
Кренимо од приче. Тетрис је игра у којој фигуре од 4 квадрата падају од врха до дна. У различитим комбинацијама, ови се облици могу закретати и померати улево и удесно. Циљ игре је прикупити хоризонталне нивое који су очишћени и бодови се додељују вама. Губитком се сматра тренутак када нови лик нема камо пасти. Тетрис је изумио совјетски програмер Алексеј Леонидович Пажитнов.
Оригинална Пасцал верзија појавила се 6. јуна 1984. године. Од тада, Тетрис је прошао дуг пут и пренесен је на све платформе на којима је генерално могуће играти игре, као и на уређаје који уопште нису намењени играма, као што су инжењерски калкулатор, осцилоскоп и, нећете веровати, лемљење.
По броју продатих комерцијалних верзија, Тетрис је супериорнији од било које друге игре у историји човечанства. За само једног Гаме Бои-а продато је 35 милиона примјерака, а да не спомињемо преносиву Брицк Гаме коју су готово сви имали одједном.
Започећемо имплементацију тетриса на ардуину и матрице боја анализом „штака“. Матрица се састоји од тробојних ЛЕД индикатора. Проблем ове матрице је што је превише цоол. Боја сваког пиксела кодирана је са 24 бита, односно, 8 бита за сваку компоненту: црвена, зелена и плава. Нема података о ардуину, постоји 32 бита.
Боје свих ЛЕД-ова треба да се чувају у РАМ-у, јер ћемо их променити. Поред тога, за матрицу од 16 до 16 имамо тачно 1 КБ заузете динамичке меморије, а ардуино нано их има само 2.
Додајте још неколико библиотека и почните писати код, меморија ће се завршити. Аутор у основи не користи, на пример, ардуино мега, где има више меморије. Циљ је да се игра на ардуино нано, користећи једноставне, стандардне и добро познате алате, али истовремено нестандардне приступе и „штаке“ и уз њихову помоћ постигну најоптималнији код.
Прва „дроља“ биће одбијање да се одвојено смеште у меморији положаји фигура и уопште свега што се дешава на екрану.Морамо да похранимо координате тачака доводне фигуре и координате тачака већ испуштених фигура, односно, максимално, потребна нам је још једна низ, дводимензионална 16 до 16, а то је чак 256 бајтова.
Ти и ја већ имамо низ боја за све пикселе, искористимо га. Заиста, поред чињенице да на матрицу можемо ставити обојену тачку, можемо измерити и светлост постојеће тачке тако да радимо са бојама.
Тетрис започиње падајућим блоком који се контролише помоћу тастера и има 2 координате у матричном координатном систему. Врло је једноставно, правимо тајмер према коме ће блок пасти. Ово је ауторска библиотека коју можете да читате на веб локацији.
За обраду тастера аутор такође користи своју библиотеку. Шема спајања тастера је смешно једноставна: 4 дугмета, 8 жица.
Сваким кораком тајмера нацртамо тачку пиксела испод старог, а стару тачку цртамо црном бојом, односно искључимо ЛЕД. Кликом на дугме радимо исто, али са хоризонталном координатом. Па, за пристојност, ограничићемо величину матрице тако да тачка не пређе поље.
Видите, ништа компликовано. Али то није дуго јер је дошло време за извлачење бројки. Радићемо на следећи начин: задржаћемо референцу на место снабдевања, о чему смо већ писали, назваћемо је главна тачка или главни блок. Главни блок се помера у матричном координатном систему, то смо већ урадили. Све фигуре Тетриса састоје се од 4 блока, због чега се, успут, и назива Тетрис.
Према томе, остаје нам да завршимо додавање још 3 блока главном блоку. Запишемо њихове координате у координатни систем главног блока, тако да је главни блок увек испод. Врло је једноставно, узмите лик преокренутог слова Т. Главни блок од дна ка центру има координате 0,0 у свом координатном систему.
Горњи блок је 0,1, десни је 1,1, а леви -1,1.
Узмите слово Г. Доњи блок је 0,0, следећи 0,1, следећи 0,2 и ивица слова 1,2.
Ове координате уписујемо у низ у следећем облику: {0.1, 0.2, 1.2} и пуштамо низ у флеш меморију како не бисмо трошили динамичку меморију. Што се тиче ротације фигура. Немогуће је ротирати фигуре. Лажно је, врло је тешко објаснити микроконтролеру како се то ради. Да бисте то учинили, морате поставити центар ротације, некако декомпонирати лик на делове и потражити нове координате за сваки део, узимајући у обзир снажну пикселу, што ће очигледно довести до грешака и испоставиће се бесмислице. Проблем је ријешен врло једноставно, остат ћемо у сјећању сва 4 положаја за све фигуре и све.
Заправо, сада остаје да насумично одаберемо бројку и нацртамо је око падајућег блока. Овде за сва три преостала блока узимамо координате из флеш меморије, преводи их у глобалне координате матрике и укључујемо ЛЕД-ове. Узгред, боја се такође бира насумично из 6 најједноставнијих и најсветијих боја простора у ргб-у. Угао ротације фигуре на почетку круга је такође постављен насумично, а када притиснете тастер нагоре, само узмите следећи сет координата да бисте га нацртали и закрените у смеру казаљке на сату. Помицање облика дјелује исто. Прво обришемо лик на претходном положају, тј. Цртамо је црном бојом, а затим у новом положају цртамо тренутну боју фигуре. Када окрећемо, поново бришемо стари положај и само нацртамо нови.
Фирмваре можете преузети на. Анализираћемо само суштину. Започнимо провјером лијевог и десног зида и дна. Са дном је све врло једноставно, гледамо сваки корак пада, је ли основна јединица достигла висину од 0, то није тешко, али сваки пут када притиснемо контролно дугме, морамо видети да ли се додирнула екстремна тачка облика бочних зидова матрице.
Ако додирнете, не померајте фигуру. Исто важи и за ротацију фигура. На пример, ако се нови положај фигуре протеже изван зидова, ротација је забрањена, а пошто су сви облици различитих облика, тада су екстремни блокови за њих различити. Било би могуће осликати појединачне екстремне блокове за сваку фигуру како би се поједноставио рад микроконтролера, али нека се узме у обзир да су га измислили за то.
Све је врло једноставно. Али следећи задатак је много занимљивији. Морамо проверити да ли постоје судари са блоковима који већ леже испод.Да смо имали низ који садржи стање свих ћелија на терену, било би лакше, али користићемо низ боја за пикселе траке, тако да ћемо имати најслађу „крчму“. Који је стварни проблем. Чини се да је све једноставно, зелена фигура ће пасти, а сваки корак пада, сваки помак у страну и сваки покушај окретања треба проверити да ли лик у новом положају почива на већ лежећим фигурама. Ако је за све блокове околна боја једнака црној или једнака боји фигуре, тада допуштамо кретање у жељеном правцу. То ће радити све док облик испод нас не постане исте боје као падајући облик. То је заправо „шљага“: обојити ћемо оборени облик у другу боју. Поново очистите неприметно за очи, али приметно за програм. Све што требате учинити је мало повећати свјетлину тренутне боје облика и то је све.
Лик је пао на дно или неку другу фигуру, његова светлина није се примјетно повећала, а у новом кругу падајуће фигуре више неће бркати своју боју са својом, падаће на њу и једнако фиксно, помало додајући светлину.
Успут, када притиснете дугме доле, лик се великом брзином креће према доле и заузима своје место.
Нашем Тетрису остаје крајњи додир, наиме проверавање и брисање напуњених нивоа водоравно. Овде је све једноставно. Након што поправимо лик у тренутном кругу, крећемо се дуж линија и упоређујемо боје пиксела са црном. Ако у целој линији не постоји ниједан црни пиксел, очистићемо целу линију.
Откривене линије су испуњене бијелом бојом, затим свјетлина постепено опада на нулу и добија се анимација. Даље, сви пиксели, почевши од прве испуњене линије до врха, померају се према доле и бришу се број линија. Овај се поступак понавља све док нема комплетираних нивоа. Проверавамо и да ли смо стигли до врха, што значи да губимо. У овом случају се приказује рачун једнак броју очишћених нивоа.
Рачун је приказан у бројевима који се чувају у меморији као скуп броја и нула, помоћу којих се ЛЕД затим укључују или искључују. Овако изгледа Тетрис написан у адресној матрици. Хвала на пажњи. Видимо се ускоро!
Видео: