» elettronica » Arduino »Realizzare Tetris su Arduino

Fare Tetris su Arduino

saluti gli abitanti del nostro sito!
Oggi studieremo l'interno del gioco Tetris scritto sotto la piattaforma arduino e matrice LED.

L'autore di questo prodotto fatto in casa è AlexGyver, l'autore dell'omonimo canale YouTube. Benvenuti nel meraviglioso mondo dei pixel quadrati.

Cominciamo con la storia. Tetris è un gioco in cui le figure composte da 4 quadrati cadono dall'alto verso il basso. In diverse combinazioni, queste forme possono essere ruotate e spostate a sinistra e a destra. L'obiettivo del gioco è quello di raccogliere livelli orizzontali che vengono eliminati e punti assegnati. Perdere è considerato il momento in cui la nuova figura non ha un posto dove cadere. Tetris è stato inventato dal programmatore sovietico Alexei Leonidovich Pazhitnov.

La versione originale di Pascal apparve il 6 giugno 1984. Da allora, Tetris ha fatto molta strada ed è stato portato su tutte le piattaforme su cui è generalmente possibile giocare, così come su dispositivi non destinati ai giochi, ad esempio un calcolatore di ingegneria, un oscilloscopio e, non crederete, un saldatore.



Per il numero di versioni commerciali vendute, Tetris è superiore a qualsiasi altro gioco nella storia dell'umanità. Per un solo Game Boy, furono vendute 35 milioni di copie, per non parlare del Brick Game portatile, che quasi tutti avevano contemporaneamente.
Inizieremo l'implementazione di tetris su arduino e una matrice di colori con l'analisi delle "stampelle". La matrice è composta da LED di indirizzo a tre colori. Il problema con questo tipo di matrice è che è troppo bello. Il colore di ogni pixel è codificato con 24 bit, ovvero 8 bit per ogni componente: rosso, verde e blu. Non esiste un tale tipo di dati su arduino, c'è il seguente - 32 bit.

I colori di tutti i LED dovrebbero essere memorizzati nella RAM, poiché li cambieremo. Inoltre, per una matrice 16 per 16, abbiamo esattamente 1 KB di memoria dinamica occupata e arduino nano ne ha solo 2.

Aggiungi qualche altra libreria e inizia a scrivere codice, la memoria finirà. L'autore fondamentalmente non usa, ad esempio, Arduino Mega, dove c'è più memoria. L'obiettivo è rendere il gioco su arduino nano, utilizzando strumenti semplici, standard e ben noti, ma allo stesso tempo approcci e "stampelle" non standard e con il loro aiuto ottenere il codice più ottimale.

La prima "stampella" sarà il rifiuto di memorizzare separatamente nella memoria le posizioni delle figure e in generale tutto ciò che sta accadendo sullo schermo.Abbiamo bisogno di memorizzare le coordinate dei punti della figura di alimentazione e le coordinate dei punti delle figure già scartate, ovvero, come massimo, abbiamo bisogno di un altro 1 array, bidimensionale 16 per 16, e questo è fino a 256 byte.

Tu ed io abbiamo già una gamma di colori per tutti i pixel, usiamola. In effetti, oltre al fatto che possiamo mettere un punto colorato sulla matrice, possiamo misurare la luce di un punto esistente in modo da lavorare con i colori.

Tetris inizia con un blocco in caduta, che è controllato da pulsanti e ha 2 coordinate nel sistema di coordinate della matrice. È molto semplice, costruiamo un timer, in base al quale il blocco cadrà. Questa è la libreria dell'autore, puoi leggere sul sito.

Per elaborare i pulsanti, l'autore utilizza anche la sua libreria. Lo schema di connessione dei pulsanti è ridicolmente semplice: 4 pulsanti, 8 fili.

Ad ogni passo del timer, disegniamo un punto un pixel sotto quello vecchio e disegniamo il vecchio punto in nero, cioè spegniamo il LED. Facendo clic sul pulsante, facciamo lo stesso, ma con una coordinata orizzontale. Bene, per decenza, limiteremo la dimensione della matrice in modo che il punto non vada oltre il campo.

Vedi, niente di complicato. Ma questo non è da molto perché è giunto il momento di disegnare figure. Lavoreremo come segue: manterremo il riferimento al punto di fornitura, che abbiamo già scritto, lo chiameremo il punto principale o il blocco principale. Il blocco principale si sposta nel sistema di coordinate della matrice, l'abbiamo già fatto. Tutte le figure di Tetris sono composte da 4 blocchi, motivo per cui, a proposito, si chiama Tetris.

Di conseguenza, rimane per noi finire di aggiungere altri 3 blocchi al blocco principale. Scriviamo le loro coordinate nel sistema di coordinate del blocco principale, in modo che il blocco principale sia sempre sotto. È molto semplice, prendi la figura della lettera invertita T. Il blocco principale dal basso al centro ha coordinate 0.0 nel suo sistema di coordinate.

Il blocco superiore è 0,1, la destra è 1,1 e la sinistra è -1,1.

Prendi la lettera G. Il blocco inferiore è 0,0, il prossimo 0,1, il successivo 0,2 e il bordo della lettera 1,2.

Scriviamo queste coordinate nell'array nella seguente forma: {0.1, 0.2, 1.2} e rilasciamo l'array nella memoria flash in modo da non sprecare memoria dinamica. Per quanto riguarda la rotazione delle figure. È impossibile ruotare le figure. È banale, è molto difficile spiegare al microcontrollore come farlo. Per fare questo, è necessario impostare il centro di rotazione, in qualche modo scomporre la figura in parti e cercare nuove coordinate per ciascuna parte, tenendo conto della forte pixelizzazione, che ovviamente porterà a errori e si rivelerà senza senso. Il problema è risolto in modo molto semplice, terremo in memoria tutte e 4 le posizioni per tutte le figure e tutti.

In realtà, ora rimane selezionare casualmente il numero della figura e disegnarlo attorno al blocco che cade. Qui, per tutti e 3 i blocchi rimanenti, prendiamo le coordinate dalla memoria flash, le traduciamo nelle coordinate globali della matrice e accendiamo i LED. A proposito, il colore viene anche scelto casualmente tra i 6 colori più semplici e luminosi dello spazio rgb. Anche l'angolo di rotazione della figura all'inizio del round viene impostato in modo casuale e quando si preme il pulsante in alto, basta prendere il set successivo di coordinate per disegnare e ruotarlo in senso orario. Lo spostamento di una forma funziona allo stesso modo. Innanzitutto, cancelliamo la figura nella posizione precedente, ovvero la disegniamo in nero, quindi nella nuova posizione disegniamo il colore corrente della figura. Quando si gira, di nuovo, cancelliamo la vecchia posizione e ne disegniamo una nuova.

Il firmware può essere scaricato all'indirizzo. Analizzeremo solo l'essenza. Cominciamo controllando le pareti sinistra e destra e il fondo. Tutto è molto semplice con il fondo, osserviamo ogni passo della caduta, l'unità di base ha raggiunto un'altezza di 0, questo non è difficile, ma ogni volta che premiamo il pulsante di controllo, dobbiamo vedere se viene toccato il punto estremo della forma delle pareti laterali della matrice.

Se toccato, non spostare la figura. Lo stesso vale per la rotazione delle figure. Ad esempio, se la nuova posizione della figura si estende oltre le pareti, la rotazione è vietata e poiché tutte le forme che abbiamo sono di forme diverse, i blocchi estremi per loro sono tutti diversi. Sarebbe possibile dipingere singoli blocchi estremi per ogni figura per semplificare il lavoro del microcontrollore, ma si consideri che lo hanno inventato per questo.

È tutto molto semplice. Ma il prossimo compito è molto più interessante. Dobbiamo verificare la presenza di collisioni con blocchi già presenti sotto.Se avessimo un array che contenesse lo stato di tutte le celle nel campo, sarebbe più semplice, ma useremo un array di colori per i pixel del nastro, quindi avremo la "stampella" più bella. Qual è il problema reale. Tutto sembra essere semplice, una figura verde cadrà e ogni passo della caduta, ogni spostamento su un lato e ogni tentativo di girare dovrebbe verificare se la figura nella nuova posizione poggia su figure già distese. Se per tutti i blocchi il colore circostante è uguale al nero o uguale al colore della figura, allora consentiamo il movimento nella direzione desiderata. Questo funzionerà fino a quando la forma sotto di noi sarà dello stesso colore della forma che cade. Questa è in realtà la "stampella": ridipingeremo la forma caduta in un colore diverso. Ridipingere impercettibilmente per gli occhi, ma evidente per il programma. Tutto quello che devi fare è aumentare leggermente la luminosità del colore corrente della forma e questo è tutto.


La figura è caduta sul fondo o in un'altra, la sua luminosità non è aumentata in modo evidente e, nel nuovo round, le figure che cadono non confonderanno più il suo colore con il proprio, cadranno su di esso e si fisseranno allo stesso modo, aggiungendo leggermente luminosità.

A proposito, quando si preme il pulsante verso il basso, la figura si precipita ad alta velocità e prende il suo posto.

Il nostro Tetris è lasciato con il tocco finale, vale a dire controllare e cancellare i livelli riempiti in orizzontale. Qui è tutto semplice. Dopo aver fissato la figura nel round corrente, ci spostiamo lungo le linee e confrontiamo i colori dei pixel con il nero. Se non c'è un singolo pixel nero nell'intera linea, elimineremo l'intera linea.


Le linee rilevate vengono riempite di bianco, quindi la luminosità scende gradualmente a zero e l'animazione viene ottenuta. Inoltre, tutti i pixel, a partire dalla prima linea riempita verso l'alto, vengono spostati verso il basso e il numero di linee che sono state cancellate. Questo processo viene ripetuto fino a quando non ci sono livelli completati. Controlliamo anche se abbiamo raggiunto la cima, il che significa perdere. In questo caso, viene visualizzato un account pari al numero di livelli cancellati.

L'account viene visualizzato in numeri, che sono memorizzati nella memoria come un insieme di uno e zeri, mediante i quali i LED vengono quindi accesi o spenti. Ecco come appare Tetris scritto nella matrice degli indirizzi. Grazie per l'attenzione. A presto!

video:
10
10
10

Aggiungi un commento

    • sorrideresorrisiXaxabeneDONTKNOWyahoonea
      capozeroimbrogliaresìSì-sìaggressivosegreto
      scusaballaredance2dance3perdonoaiutobevande
      arrestoamicibuonogoodgoodfischiodeliquiolinguetta
      fumobattimanicraydeclarederisoriodon-t_mentionscaricare
      caloreadiratolaugh1mdaincontromoskingnegativo
      not_ipopcornpunireleggerespaventarespaventacerca
      schernirethank_youquestoto_clueumnikacutoconcordare
      cattivobeeeblack_eyeblum3arrossirevanterianoia
      censuratospiritosagginesecret2minacciarevittoriayusun_bespectacled
      ShokRespektlolPrevedbenvenutoKrutoyya_za
      ya_dobryiaiutantene_huliganne_othodiFludbandovicino

Ti consigliamo di leggere:

Passalo per lo smartphone ...