Ciao a tutti!
Ho da poco acquistato un Arduino uno rev 3 e, dopo aver realizzato vari piccoli progettini, oggi ho voluto sperimentare un pò con lo schermo lcd(un classico 16x2).
Ho realizzato un piccolo gioco che consiste nell'evitare degli asteroidi, muovendo un astronave su e giu' tramite un pulsante.
Ecco lo schema e perdonate la confusione:

Ecco invece il codice che ho scritto.
Premessa:io programmo in python 3, non sono un esperto del c++. Se c'è qualcosa che per voi poteva essere fatta e scritta meglio, vi prego di condividere il vostro parere
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
long randN;
// Creo la variabile che conterrà la posizione y dell'astronave
int y_pos;
// Creo 2 stringhe che conterranno i caratteri da stampare sullo schermo. Parliamo di tre soli caratteri:spazio(' '),asterisco('*') e maggiore('>')
String r1;
String r2;
// Assegno il pin 8 alla variabile pin_comando. Sarà il pin di input per il nostro pulsante
int pin_comando=8;
// Variabile che contiene il pin di Output del buzzer
int suono=9;
// Variabile per il punteggio; ho scelto un float per impostare un aumento di score di 0.2 ad ogni loop
float score=0;
void setup() {
// Inizializzo i pin del pulsante e del buzzer e lo schermo lcd
pinMode(pin_comando,INPUT);
pinMode(suono,OUTPUT);
lcd.begin(16,2);
// Qui assegno i valori 0 a y_pos e score. Inoltre assegno due stringhe a r1 e r2(16 caratteri in tutto,compresa l'astronave)
r1="> ";
r2=" ";
y_pos=0;
score=0;
// Creo una piccola schermata iniziale con jingle; dopo 3 secondi pulisco lo schermo.
lcd.setCursor(0,0);
lcd.print("# Space Run! #");
lcd.setCursor(0,1);
lcd.print("forum.arduino.cc");
tone(suono,2000);
delay(200);
tone(suono,2100);
delay(200);
tone(suono,2200);
delay(200);
tone(suono,2500);
delay(200);
tone(suono,2400,600);
delay(3000);
lcd.clear();
}
void loop() {
//Questa variabile conterra il valore letto dal pin_comando
int evento_comando=digitalRead(pin_comando);
// Valuto se si è verificata una situazione di game over; in caso positivo,richiamo la relativa funzione
// Se la posizione dell'astronave è uguale alla stessa riga in cui si trova l'asteroide in prima posizione della stringa(stringa[0]), allora è game over
if (r1[0]=='*' && y_pos==0) {
over();
}
else if (r2[0]=='*' && y_pos==1) {
over();
}
//Imposto i comandi: se il pulsante è premuto, l'astronave va giù finchè non è rilasciato
if (evento_comando==HIGH) {
r1[0]=' ';
r2[0]='>';
y_pos=1;
}
else {
r2[0]=' ';
r1[0]='>';
y_pos=0;
}
//Stampo le due stringhe r1 e r2
lcd.setCursor(0,0);
lcd.print(r1);
lcd.setCursor(0,1);
lcd.print(r2);
//Per ogni elemento nelle liste,se il suddetto è uguale a '*', lo sostituisco con ' '
//Inoltre sostituisco l'elemento precedente con '*'
for (int i=0;i<=15;i++) {
if (r1[i]=='*') {
r1[i]=' ';
r1[i-1]='*';
}
}
for (int i=0;i<=15;i++) {
if (r2[i]=='*') {
r2[i]=' ';
r2[i-1]='*';
}
}
// Creo un numero casuale per decidere su quale riga inserire un asteroide. Poi inserisco un asterisco nell'ultima posizione della stringa(stringa[15]), ma solo se nella posizione
// precedente della stringa opposta è presente uno spazio; in questo modo evito di creare situazioni forzate di game over dove il giocatore è bloccato
// Nota che aumentando il range di numeri casuali, diminuiscono gli asteroidi e aumenta la facilità
randN=random(0,5);
if (randN==0 && r2[14]==' ') {
r1[15]='*';
}
else if (randN==1 && r1[14]==' ') {
r2[15]='*';
}
// Aumento lo score.
score=score+0.2;
// Imposto il ritardo ovvero la velocità di gioco. Se aumentata,il gioco diventa più facile
delay(130);
}
void over() {
// Pulisco lo schermo e stampo la scritta di game over e lo score(convertito in intero). Riproduco anche il jingle di game over
lcd.clear();
lcd.setCursor(0,0);
lcd.print("# Game Over! #");
lcd.setCursor(4,1);
lcd.print("Score:");
lcd.print(int(score));
tone(suono,2000);
delay(500);
tone(suono,2500);
delay(500);
tone(suono,2600);
delay(500);
tone(suono,2300);
delay(500);
tone(suono,2250,700);
delay(3000);
// Ripulisco le stringhe, il punteggio e la posizione dell'astronave; infine rimando al loop
r1="> ";
r2=" ";
y_pos=0;
score=0;
loop();
}