Untitled

                Never    
C
       
/*
 * ##### jogo da Nave com 2 LCDs 16x2 ######
 * 
 *LiquidCrystal_I2C - biblioteca e tutorial: 
 *http://blog.eletrogate.com/guia-completo-do-display-lcd-arduino/
 *Tutorial 2 lcds:
 *https://www.arduinoecia.com.br/2018/02/como-conectar-dois-displays-lcd-i2c-arduino.html
 *jogo original: 
 *https://youtu.be/iDEIYxBwatM
 *
 *Alterções e ajustes Flavio R.O. dos Santos
 *Caicó-RN, 09 de maio de 2019
*/

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AxisJoystick.h>

#define SW_PIN 2
#define VRX_PIN A0
#define VRY_PIN A1

Joystick* joystick;
LiquidCrystal_I2C lcd(0x27,16,2);
LiquidCrystal_I2C lcd2(0x3f,16,2);

//usando MILLIS 
unsigned long previousMillis = 0; //
const long interval = 200; //velocidade do jogo

//variaveis do jogo
int pxnave,pynave,pxaste,pyaste,pxenergia,pyenergia,pxtiro,pytiro;
bool game,vtiro,vpilha;
int pontos;
double venergia;
int vtela;
int maxpontos=1000;

byte nave[8]={B11000,B01100,B01110,B01111,B01111,B01110,B01100,B11000};
byte asteroide[8]={B00000,B00100,B01110,B10111,B11101,B01110,B00100,B00000};
byte explosao[8]={B10001,B10101,B01010,B10100,B00101,B01010,B10101,B10001};
byte energia[8]={B01110,B11011,B10001,B10101,B10101,B10101,B10001,B11111};
byte tiro[8]={B00000,B00000,B00000,B00111,B00111,B00000,B00000,B00000};

//variaveis do joystick
int line[3] = {0,1,2},line_bk[3], index, menu_number = 1;
boolean enter_flag = 0, sub_menu = 0;

void setup() {
	joystick = new AxisJoystick(SW_PIN, VRX_PIN, VRY_PIN);
	lcd.init(); // inicializa the lcd 
	lcd.backlight(); //acender o LED
	lcd2.init(); // inicializa the lcd 
	lcd2.backlight();
	lcd2.begin (16,4);// iniciando com mais linhas pra não sobrescrever o texto

	pxnave = pynave = pyaste = pontos = pxenergia = pyenergia = pytiro = 0;
	pxtiro = -1;
	pxaste = 15;
	venergia = 100;
	vtela = 0;
	lcd.createChar(1,nave);
	lcd.createChar(2,asteroide);
	lcd.createChar(3,explosao);
	lcd.createChar(4,energia);
	lcd.createChar(5,tiro);
	lcd.clear();
	lcd2.clear();
	game = false;
	vtiro = vpilha = false;
}

void loop(){
  unsigned long currentMillis = millis();
  
	if(game){
		if(currentMillis - previousMillis >= interval){
			Joystick::Move move = joystick->singleRead();  
			if(!(move == Joystick::Move::PRESS)) enter_flag = 0x01;
			
			previousMillis = currentMillis;
			venergia -= 0.25;
			lcd.clear();
			//lcd2.clear();
			if(venergia <= 0){
				game = 0;
				desenhaExplosaoNave(pxnave,pyaste);
				vtela = 2;
        
			}
			painel();
			if(move == Joystick::Move::RIGHT){ //move nave pra cima
				pynave = 0;
			}
			if(move == Joystick::Move::LEFT){ //move nave pra baixo
				pynave = 1;
			}
			if((move == Joystick::Move::PRESS) && enter_flag){ // tiro
				enter_flag = 0x00; 
				pxtiro = 1;
				vtiro = true;
				pytiro = pynave;
			}
			pxaste -= 1;
			desenhaNave(pxnave,pynave);
			desenhaAsteroide(pxaste,pyaste);
			if(vtiro){
				desenhaTiro(pxtiro,pytiro);
				pxtiro += 1;
			}
			if(pxaste < 0){
				pxaste = 15;
				pyaste = random(0,2);
			}
			if(pxtiro > 16){
				vtiro = false;
				pxtiro = -1;
			}
			if(((pxtiro == pxaste + 1)&&(pytiro == pyaste))||((pxtiro == pxaste)&&(pytiro == pyaste))){
				vtiro = false;
				pxtiro = -1;
				desenhaExplosaoAsteroide(pxaste,pyaste);
				pyaste = random(0,2);
				pxaste = 15;
				pontos += 2;
				if(pontos >= maxpontos){
					game = 0;
					vtela = 1;
				}
			}
			if(((pxnave == pxaste)&&(pynave == pyaste))){
				game = 0;
				desenhaExplosaoNave(pxnave,pyaste);
				vtela = 2;
			}
			if(!vpilha){
				if(random(0,60) > 58){
					pxenergia = 15;
					vpilha = true;
					pyenergia = random(0,2);
				}
			} else {
				pxenergia -= 1;
				desenhaEnergia(pxenergia, pyenergia);
				if(((pxnave == pxenergia + 1)&&(pynave == pyenergia))||(( pxnave == pxenergia)&&(pynave == pyenergia))){
					vpilha = false;
					pxenergia = -1;
					venergia = 100;
				}
			}        
     } //fim do millis
    } else { // fim do if(game)
    tela(vtela);    
  }
}
void desenhaNave(int px, int py){
  lcd.setCursor(px,py); lcd.write(1);
}
void desenhaAsteroide(int px, int py){
  lcd.setCursor(px,py); lcd.write(2);
}
void desenhaEnergia(int px, int py){
  lcd.setCursor(px,py); lcd.write(4);
}
void desenhaTiro(int px, int py){
  lcd.setCursor(px,py); lcd.write(5);
}
void desenhaExplosaoNave(int px, int py){
  lcd.clear(); lcd.setCursor(px,py);
  lcd.write(3); delay(500);
  lcd.clear();
}
void desenhaExplosaoAsteroide(int px, int py){
  lcd.setCursor(px,py); lcd.write(3);
  delay(500); lcd.clear();
}
void reset(){
	pontos = 0;
	venergia = 100;
	game = true;
	vtela = 0;
}
void painel(void){
	lcd2.setCursor(10,0);
	lcd2.print(pontos);
	lcd2.setCursor(0,0);
	lcd2.print("Pontos:");
	lcd2.setCursor(10,1);
	lcd2.print(venergia);
	lcd2.setCursor(0,1);
	lcd2.print("Energia:");
}
void tela(int cond){  //0=TelaInicial | 1=Ganhou | 2=Perdeu
	Joystick::Move move = joystick -> singleRead();
	if(!(move == Joystick::Move::PRESS)) enter_flag = 0x01;

	if(cond < 1){
		if(!sub_menu){
			//lcd2.clear();
			lcd2.setCursor(0,0);
			lcd2.print(">");
      lcd2.setCursor(0,1);
      lcd2.print(" ");
			lcd2.setCursor(1,line[0]);
			lcd2.print("1)Iniciar Jogo  ");
			lcd2.setCursor(1,line[1]);
			lcd2.print("2)Como jogar    ");
			lcd2.setCursor(1,line[2]);
			lcd2.print("3)Sair          ");        
		}  
		readButts();  
	} else {
		String txt = {(cond > 1 ? "   GAME OVER    " : "PARABÉNS")};

    lcd2.setCursor(0,0);
    lcd2.print(txt); //game over ou parabéns
		lcd2.setCursor(0,1);
		lcd2.print("Pontos:         ");
		lcd2.setCursor(10,1);
		lcd2.print(pontos);
				
		lcd.setCursor(0,0);
    lcd.print("                ");//lcd.clear();
		lcd.setCursor(0,1);
		lcd.print(" Pressione tiro ");

		if((move == Joystick::Move::PRESS) && enter_flag){
			enter_flag = 0x00;
			sub_menu = !sub_menu;
			vtela=0;
			tela(vtela);
		}
	}
}

void readButts(){
	Joystick::Move move = joystick->singleRead();

	if(!(move == Joystick::Move::PRESS)) enter_flag = 0x01;

	if(move == Joystick::Move::LEFT){
		list_menuDw();
		menu_number += 1;
		if(menu_number > 3) menu_number = 1;
	}
	if((move == Joystick::Move::PRESS) && enter_flag){
		enter_flag = 0x00; 
		sub_menu = !sub_menu;
		menu_select();    
	} 
} //fim readButts

void list_menuDw(){
	for(int i=2; i>-1; i--){
		index = i-1;
		line_bk[i] = line[i];     
		if(index < 0) line[i] = line_bk[i+2];     
		else line[i] = line[i-1];
	}
} //fim list_menu

void menu_select(){
    lcd2.clear();
    switch(menu_number){
       case 1: 
			reset(); 
			break;
       case 2: 
			lcd2.setCursor(1,0);
			lcd2.print("2-Instrucoes");
			lcd2.setCursor(0,1);
			lcd2.print("       2         "); 
			break;
       case 3: 
			lcd2.setCursor(1,0);
			lcd2.print("3-Sair");
			lcd2.setCursor(0,1);
			lcd2.print("      3          "); 
			break;            
    } //fim switch 
} //fim menu_select

Raw Text