Space Run-gioco con arduino e lcd

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();
}

usa il tag code :slight_smile:

Risolto, grazie mille doppiozero!!

l'ho provato (senza il buzzer) :slight_smile: fico!

io all'interno del loop metterei un millis() invece del delay. Per mantenere la reattività del pulsante anche quando si aumenta il tempo di scorrimento :wink:

Grazie mille! Sono felice che ti piaccia :smiley:
Ps. Seguirò il tuo consiglio!

ti faccio un'altra osservazione: ho visto che usi un float per il punteggio ma poi lo stampi come int, probabilmente ti è sfuggito :wink:

ok basta giocare, adesso vado a letto :grin:

Uso un float per incrementare di 0,2 ad ogni loop. Al game over lo arrotondo convertendolo in intero.
Faccio questo per non aumentare troppo lo score ad ogni ciclo, evitando punteggi esorbitanti XD
Se usassi un intero, non potrei farlo ma dovrei aumentare il punteggio di 1 a ciclo.

Notte e grazie per aver provato e suggerito, lo apprezzo molto!