Giochiamo a Tris con Arduino

Arduino

Il numero di progetti che si possono realizzare con le piattaforme Arduino è diventato ormai pressoché infinito grazie alle innumerevoli shield e sensori che sono stati sviluppati per interfacciarsi con i diversi modelli delle schede Arduino. In questo articolo andremo a realizzare uno dei giochi più diffusi tra i bambini: il gioco del TRIS detto anche TIC TAC TOE. Chi non ci ha mai giocato? Bastava un foglio di carta e una penna per sfidare i propri amici a chi era il più bravo. Andremo a realizzare questo semplice gioco creando un’interfaccia grafica e uno schermo touch per giocare con chi vogliamo.

Introduzione

Chi non ha mai giocato a TRIS? Il gioco è semplicissimo: su una griglia 3x3 dobbiamo mettere in fila 3 simboli uguali: la X o la O. Per giocarci basta carta e penna, ma qui sulla community di Elettronica Open Source andremo a realizzarne una versione digitale con un tutorial passo-passo e sfruttando un display TFT touch e la board Arduino Uno.

Dunque il materiale occorrente per questo progetto è il seguente:

  1. Board Arduino UNO Rev3 o compatibile (a dirla tutta nel mio parco schede ho provato con soddisfazione anche una ELEGOO UNO rev3)
  2. Display OPEN-SMART 3.2: è uno di quelli che si trovano sui siti cinesi e costa meno di 10€. Ce ne sono in commercio molti che differiscono per produttore e per dimensioni. Potete scegliere quello che più vi piace, dovendo però riadattare le librerie da utilizzare con il software.

La shield OPEN-SMART 3.2 per Arduino presenta sul lato top il display TFT con touch (come si vede in Figura 1) e sul lato bottom (Figura 2) gli integrati di gestione dello stesso (ad opera dell’integrato ILI9327). Inoltre, sul bottom vediamo la presenza di uno slot per microSD e di un sensore di temperatura.

Progetti

Figura 1: Shield OPEN-SMART 3.2 lato top

 

Progetti Arduino

Figura 2: Shield OPEN-SMART 3.2 lato bottom

Il principio di funzionamento dello schermo touchscreen è il seguente:

  • La parte display è divisa in pixels con una risoluzione di 240px sull’asse x e 400px sull’asse y. L’origine degli assi è nel primo punto (punto 0,0) in alto a sinistra.
  • La parte touchscreen funziona attraverso due pin analogici che si muovono tra 0 e 1024: il primo associato all’asse x e il secondo associato all’asse y. Per l’asse x i valori più piccoli sono sul lato destro mentre quelli più grandi sulla sinistra, mentre per l’asse y i valori più piccoli sono in basso mentre quelli più grandi in alto. Essendo i valori analogici che dipendono di fatto anche dalle resistenze in gioco (di fatto la resistenza è quella propria dello schermo touch che andrebbe misurata e tarata) i valori possono essere leggermente diversi e non vedremo mai lo 0 o il 1024 nella scala.

Per la corretta gestione dell’hardware ho adoperato le librerie fornite direttamente dal produttore dell’OPEN-SMART che si basano su librerie Adafruit GFX e TFT-LCD. Purtroppo credo che queste librerie siano state leggermente modificate per il corretto funzionamento, in quanto installando le librerie originali Adafruit GFX il display non visualizzava nulla. Inoltre, con l’ausilio del programma di esempio del touchscreen di queste librerie ho realizzato una mappatura dei punti touch di interesse per il gioco che saranno riportati in seguito.

La struttura dell’interfaccia grafica (GUI)

La GUI (Graphic User Interface) è stata realizzata in maniera semplice ed immediata facendo ricorso alle funzioni di base della libreria per il disegno di figure geometriche quali rettangoli, linee e cerchi. Prima di tutto ho posizionato un quadrato 210 punti x 210 punti, all’interno del quale ho tracciato le due linee verticali e le due linee orizzontali per realizzare la griglia 3x3. Ogni quadrato avrà dunque le dimensioni 70x70 e il centro di questi quadrati sarà utilizzato per posizionare il simbolo durante il gioco. In basso alla griglia ho riportato un ulteriore quadrato per indicare il simbolo del turno di gioco mentre, in alto alla griglia è riportato un pulsante di start solo quando è necessario.

Progetti

Figura 3: Screen del Gioco del Tris

La logica di funzionamento

Per il gioco del TRIS, la logica di funzionamento è qualcosa di estremamente semplice che possiamo rappresentare con il diagramma di flusso riportato in Figura 4:

  • Scelta del simbolo che inizia (RANDOM X or O): questa funzione è stata realizzata ricorrendo alla funzione random(0,100) e facendone il modulo 2, ossia decidendo il numero pari o dispari.
  • Attesa della mossa nel turno di gioco (WAIT AZIONE): è stato realizzato attraverso una funzione che valuta i punti toccati sullo schermo e li assegna ad uno dei 9 spazi disponibili all’interno della griglia, se non ancora utilizzato.
  • Verifica di un vincitore (CHECK WIN): ad ogni turno viene effettuata la verifica del vincitore. Di seguito riporterò la strategia che ho utilizzato per effettuare queste verifiche.
  • Controllo della fine del gioco: il gioco finisce se c’è un vincitore o se la griglia è stata completata (ho semplicemente inserito un contatore di turno fino a 9).
  • Il gioco finirà con un vincitore o con la parità.
Progetti

Figura 4: Diagramma di flusso del gioco

Gli algoritmi di controllo del gioco si basano semplicemente su una matrice 3x3, che in C si definisce semplicemente come un array con doppia dimensione.

int matrice [3][3];

Per chi è meno esperto di programmazione, gli array sono dei vettori di n elementi (dimensione) a cui possiamo accedere attraverso l'indirizzo che va dalla posizione 0 alla posizione “n-1”. Dunque, nel nostro caso avremo un array di 2 dimensioni, ognuna delle quali composta da 3 elementi (dunque un array 3x3). Le celle di questo array 3x3 potranno essere raggiunte con gli indirizzi 0,0; 0,1; 0,2; 1,0...e via dicendo. Le celle di questa matrice assumeranno concettualmente solo 3 diversi valori: 0, +1 e -1. In particolare, al valore 0 ho associato l’assenza di informazione ossia la cella vuota, al valore +1 la presenza del simbolo “X” e, dualmente, al valore -1 è associata la presenza del simbolo “O”. Questa scelta si ripercuote sulla gestione successiva della funzione di verifica del vincitore. Questa funzione effettua semplicemente 8 somme indipendenti delle caselle (le 3 linee orizzontali, le 3 verticali e le due diagonali). Se almeno una somma è +3 oppure -3 allora il gioco termina con un vincitore, altrimenti prosegue fino a quando non compare una somma pari a +3/-3 oppure il contatore del turno raggiunge 9 (griglia completa).

L’architettura del programma

Il programma, di cui vi allego anche il codice sorgente nel successivo paragrafo, è stato realizzato attraverso una scomposizione in macro-funzioni come segue:

    • void setup(void): viene chiamata l’inizializzazione del display TFT, della Seriale e la prima pagina grafica da visualizzare.
    • void start_screen(): all’interno di questa funzione è implementata la prima interfaccia grafica che mostra una griglia 3x3 con dei pallini colorati al centro e il pulsante di start in alto. Realizzare accuratamente questa pagina grafica è stato utile anche per ottimizzare le posizioni degli oggetti come i punti centrali di ogni singolo spazio della griglia che servirà per le funzioni successive.
    • void CampoVuoto(): viene invocata ad ogni inizio partita per realizzare la struttura del campo. L’implementazione di questa funzione è molto simile alla precedente funzione in quanto condivide gran parte del codice tranne il disegno dei pallini colorati. Si può decisamente ottimizzare il codice realizzando funzioni atomiche da poter riutilizzare ma per il momento è stato più semplice realizzarlo e debuggarlo in questo modo.
    • void wait_start(): la funzione è in attesa che i punti restituiti dal touch corrispondano alla posizione del tasto di “START”. Inolte, è possibile conoscere i valori x e y del touch durante il tocco direttamente all’interno della console seriale grazie alla seguente istruzione:

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2964 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend