» Eletrônicos » Arduino »Criando Tetris no Arduino

Fazendo Tetris no Arduino

Saudações os habitantes do nosso site!
Hoje vamos estudar o interior do jogo Tetris escrito sob a plataforma arduino e matriz de LED.

O autor deste produto caseiro é AlexGyver, o autor do canal do YouTube com o mesmo nome. Bem-vindo ao maravilhoso mundo dos pixels quadrados.

Vamos começar com a história. Tetris é um jogo no qual figuras compostas por 4 quadrados caem de cima para baixo. Em diferentes combinações, essas formas podem ser giradas e movidas para a esquerda e para a direita. O objetivo do jogo é coletar níveis horizontais limpos e pontos atribuídos a você. Perder é considerado o momento em que a nova figura não tem para onde cair. Tetris foi inventado pelo programador soviético Alexei Leonidovich Pazhitnov.

A versão original de Pascal apareceu em 6 de junho de 1984. Desde então, o Tetris percorreu um longo caminho e foi portado para todas as plataformas nas quais geralmente é possível jogar, bem como para dispositivos não destinados a jogos, como uma calculadora de engenharia, um osciloscópio e, você não acredita, um ferro de solda.



Pelo número de versões comerciais vendidas, Tetris é superior a qualquer outro jogo na história da humanidade. Por apenas um Game Boy, 35 milhões de cópias foram vendidas, sem mencionar o portátil Brick Game, que quase todos tinham ao mesmo tempo.
Iniciaremos a implementação do tetris no arduino e uma matriz de cores com a análise de "muletas". A matriz consiste em LEDs de endereço de três cores. O problema com esse tipo de matriz é que é muito legal. A cor de cada pixel é codificada com 24 bits, ou seja, 8 bits para cada componente: vermelho, verde e azul. Não existe esse tipo de dado no arduino, existe o seguinte - 32 bits.

As cores de todos os LEDs devem ser armazenadas na RAM, conforme as mudaremos. Além disso, para uma matriz de 16 por 16, temos exatamente 1 KB de memória dinâmica ocupada e o arduino nano possui apenas 2 deles.

Adicione mais algumas bibliotecas e comece a escrever código, a memória terminará. O autor basicamente não usa, por exemplo, o arduino mega, onde há mais memória. O objetivo é criar o jogo especificamente no arduino nano, usando ferramentas simples, padrão e conhecidas, mas ao mesmo tempo abordagens e “muletas” não padronizadas e com a ajuda deles para obter o código mais ideal.

A primeira "muleta" será a recusa de armazenar separadamente na memória as posições das figuras e, em geral, tudo o que está acontecendo na tela.Precisamos armazenar as coordenadas dos pontos da figura de alimentação e as coordenadas dos pontos das figuras já descartadas, ou seja, no máximo, precisamos de outra matriz 1, bidimensional 16 por 16, e isso é até 256 bytes.

Você e eu já temos uma matriz de cores para todos os pixels, vamos usá-lo. De fato, além do fato de podermos colocar um ponto colorido na matriz, podemos medir a luz de um ponto existente para trabalhar com cores.

O Tetris começa com um bloco em queda, que é controlado por botões e possui 2 coordenadas no sistema de coordenadas da matriz. É muito simples, construímos um temporizador, segundo o qual o bloco cairá. Esta é a biblioteca do autor, você pode ler no site.

Para processar botões, o autor também usa sua biblioteca. O esquema de conexão dos botões é ridiculamente simples: 4 botões, 8 fios.

A cada passo do cronômetro, desenhamos um ponto um pixel abaixo do antigo e desenhamos o ponto antigo em preto, ou seja, desligamos o LED. Ao clicar no botão, fazemos o mesmo, mas com uma coordenada horizontal. Bem, por decência, limitaremos o tamanho da matriz para que o ponto não ultrapasse o campo.

Veja, nada complicado. Mas isso não é por muito tempo, porque chegou a hora de desenhar figuras. Vamos trabalhar da seguinte forma: manteremos a referência ao ponto de suprimento, que já escrevemos, chamaremos de ponto principal ou bloco principal. O bloco principal se move no sistema de coordenadas da matriz, já fizemos isso. Todas as figuras de Tetris consistem em 4 blocos, razão pela qual, a propósito, é chamado de Tetris.

Por conseguinte, resta concluir a adição de mais 3 blocos ao bloco principal. Vamos escrever suas coordenadas no sistema de coordenadas do bloco principal, para que o bloco principal esteja sempre abaixo. É muito simples, pegue a figura da letra invertida T. O bloco principal de baixo para o centro tem coordenadas 0,0 no seu sistema de coordenadas.

O bloco superior é 0,1, o direito é 1,1 e o esquerdo é -1,1.

Pegue a letra G. O bloco inferior é 0,0, o próximo 0,1, o próximo 0,2 e a borda da letra 1,2.

Escrevemos essas coordenadas na matriz da seguinte forma: {0.1, 0.2, 1.2} e colocamos a matriz na memória flash para não desperdiçar memória dinâmica. Quanto à rotação das figuras. É impossível girar as figuras. É brega, é muito difícil explicar ao microcontrolador como fazer isso. Para fazer isso, você precisa definir o centro de rotação, de alguma forma decompor a figura em partes e procurar novas coordenadas para cada parte, levando em consideração uma forte pixelização, o que obviamente levará a erros e resultará absurdo. O problema é resolvido com muita simplicidade, manteremos na memória todas as 4 posições para todas as figuras e tudo.

Atualmente, resta selecionar aleatoriamente o número da figura e desenhá-lo em torno do bloco em queda. Aqui, para os três blocos restantes, pegamos as coordenadas da memória flash, as traduzimos para as coordenadas globais da matriz e acendemos os LEDs. A propósito, a cor também é escolhida aleatoriamente entre as 6 cores mais simples e brilhantes do espaço rgb. O ângulo de rotação da figura no início da rodada também é definido aleatoriamente e, quando você pressiona o botão para cima, basta pegar o próximo conjunto de coordenadas para desenhar e girar no sentido horário. Mover uma forma funciona da mesma forma. Primeiro, apagamos a figura na posição anterior, ou seja, desenhamos em preto e, em seguida, na nova posição, desenhamos a cor atual da figura. Ao girar novamente, apagamos a posição antiga e apenas desenhamos uma nova.

O firmware pode ser baixado em. Analisaremos apenas a essência. Vamos começar verificando as paredes esquerda e direita e a parte inferior. Tudo é muito simples com o fundo, olhamos para todas as etapas do outono, a unidade base atingiu uma altura de 0, isso não é difícil, mas toda vez que pressionamos o botão de controle, precisamos ver se o ponto extremo da forma das paredes laterais da matriz tocou.

Se tocado, não mova a figura. O mesmo vale para a rotação das figuras. Por exemplo, se a nova posição da figura se estende além das paredes, a rotação é proibida e, como todas as formas que temos são de formas diferentes, os blocos extremos para elas são todos diferentes. Seria possível pintar blocos extremos individuais para cada figura, a fim de simplificar o trabalho do microcontrolador, mas seja considerado que eles o inventaram para isso.

Tudo é muito simples. Mas a próxima tarefa é muito mais interessante. Precisamos verificar colisões com blocos já localizados abaixo.Se tivéssemos uma matriz que contivesse o estado de todas as células no campo, seria mais fácil, mas usaremos uma matriz de cores para os pixels da fita, para que tenhamos a “muleta” mais legal. Qual é o problema real? Tudo parece simples, uma figura verde cairá, e cada passo da queda, todo deslocamento para o lado e toda tentativa de virar deve verificar se a figura na nova posição se apóia nas figuras que já estão mentindo. Se para todos os blocos a cor circundante for igual a preto ou igual à cor da figura, permitiremos o movimento na direção desejada. Isso funcionará até que a forma abaixo de nós tenha a mesma cor da forma em queda. Essa é realmente a "muleta": repintaremos a forma caída em uma cor diferente. Repintar imperceptivelmente para os olhos, mas perceptível para o programa. Tudo o que você precisa fazer é aumentar levemente o brilho da cor atual da forma e isso é tudo.


A figura caiu no fundo ou em outra figura, seu brilho não aumentou notavelmente e, na nova rodada, as figuras em queda não confundirão mais sua cor com a sua, elas cairão nela e da mesma forma fixa, adicionando um pouco de brilho.

A propósito, quando você pressiona o botão, a figura desce a alta velocidade e toma o seu lugar.

Nosso Tetris fica com o toque final, ou seja, verificar e limpar os níveis preenchidos horizontalmente. Tudo é simples aqui. Depois de fixar a figura na rodada atual, passamos pelas linhas e comparamos as cores dos pixels com o preto. Se não houver um único pixel preto na linha inteira, limparemos a linha inteira.


As linhas detectadas são preenchidas com branco, então o brilho cai gradualmente para zero e a animação é obtida. Além disso, todos os pixels, começando da primeira linha preenchida para cima, são deslocados para baixo e o número de linhas que foram limpas. Este processo é repetido até que não haja níveis concluídos. Também verificamos se alcançamos o topo, o que significa perder. Nesse caso, uma conta igual ao número de níveis limpos é exibida.

A conta é exibida em números, que são armazenados na memória como um conjunto de zeros e zeros, pelos quais os LEDs são ligados ou desligados. É assim que o Tetris escrito na matriz de endereços se parece. Obrigado pela atenção. Até breve!

Vídeo:
10
10
10

Adicionar um comentário

    • sorrirsorrisosxaxaoknão seiyahoonea
      chefearranhartolosimsim simagressivosegredo
      desculpedançardance2dance3perdãoajudabebidas
      pararamigosbomgoodgoodapitodesmaiarlíngua
      fumaçapalmascraydeclararirônicodon-t_mentionbaixar
      calorirritantelaugh1mdareuniãomoskingnegativo
      not_ipipocapunirlerassustarsustospesquisar
      provocarthank_youistoto_clueumnikagudoconcordar
      malbeeeblack_eyeblum3corargabar-setédio
      censuradobrincadeirasecret2ameaçarvitóriayusun_bespectacled
      sacudirrespektlolpreviubem vindoKrutoyya_za
      ya_dobryiajudantene_huliganne_othodifludproibirfechar

Aconselhamos que você leia:

Entregue-o para o smartphone ...