//----------------------------Biblioteca----------------------------
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//-------------------------Digitos-Especiais------------------------
byte Digitos[] =
{
//asteroide
B00000,
B01110,
B10111,
B01110,
B11011,
B01110,
B00000,
B00000,
//coração
B00000,
B01010,
B10101,
B10001,
B01010,
B00100,
B00000,
B00000,
//dinossauro a lazer frame 1
B00111,
B10111,
B10110,
B11111,
B01110,
B01000,
B01100,
B00000,
//dinossauro a lazer frame 2
B00111,
B10111,
B10110,
B11111,
B01110,
B00010,
B00011,
B00000,
};
//----------------------------Definições----------------------------
int vel = 50;
int Ax = 16, Ay = 0; // posição do asteroride
int Dy = 1, Dx = 0; // posição do dinossauro
bool game1 = 1, game2 = 0; // jogo - game over
int over1 = 0, start1 = 0, start2 = 0;
bool over2 = 0;
int T1;
int T2;
int enterbot = 2;
//--------------------------funções-do-jogo-------------------------
void asteroide(int x, int y)
{
lcd.setCursor(x,y);
lcd.write(byte(0));
lcd.setCursor(x + 1,y);// função para apagar o asteroide anterior
lcd.print(" ");
}
void movimentoA() // velocidade?
{
if(game1 && game2)
{
if(Ax != -1)
{
if(T1 - T2 > vel)
{
T2 = T1;
Ax --;
asteroide(Ax,Ay);
delay(vel);
}
}
else
{
Ax = 13;
Ay = random(2);
}
}
}
void dinossauro(int x, int y) // animação do dinossauro
{
lcd.setCursor(x,y);
lcd.write(byte(2));
delay(vel);
lcd.setCursor(x,y);
lcd.write(byte(3));
delay(vel);
}
void pulo()
{
if(game1 && game2)
{
if(!digitalRead(enterbot))
{
Dy = 0;
lcd.setCursor(Dx,1);
lcd.print(" ");
dinossauro(Dx,Dy);
}
else
{
Dy = 1;
lcd.setCursor(Dx,0);
lcd.print(" ");
dinossauro(Dx,Dy);
}
}
}
void game_over()
{
if(Ax == Dy && Ay == Dy && game1)// durante o jogo, se a posição do asteroride
//for igual a posição do dinossauro
{
game1 = false;// game1 -> game2
}
game_over_tela();
}
void reset()
{
if(!digitalRead(enterbot) && game1 == false) // caso aperte o bot + esteja na tela de morte
{
lcd.clear();
game1 = true;
Ax = 13;
}
}
//-------------------------funções-de-tela--------------------------
void game_over_tela()
{
if (game1 == 0 && over2 == 0)
{
lcd.clear();
lcd.setCursor(19,0); // posição onde o "game over" ira surgir
lcd.print("Game Over");
while(over1 < 16)// scroll geral do print desta tela
{
lcd.scrollDisplayLeft();
over1 ++;
delay(150);
}
// ?
lcd.setCursor(0,0);
lcd.print(" ");
//^^^^^^^^^^^^^^
over2 = 1;
Serial.println(over2);
}
else
if(over2 == 1)
{ // fica piscando
lcd.setCursor(16,1);
lcd.print("Start para reset");
delay(100);
lcd.setCursor(16,1);
lcd.print(" ");
delay(100);
}
reset();
}
void start()
{
if(!digitalRead(enterbot) == 1 && game2 == 0)
{
while(start1 < 16) // numero posições que ira mover ate o start atingir o 16
{
lcd.scrollDisplayLeft();
delay(150);
start1 ++;
}
lcd.clear();
start2 = 1;
game2 = 1;
}
else
if(start2 == 0)
{
lcd.setCursor(0,0);
lcd.print("Google Dino");
lcd.setCursor(0,1);
lcd.print("Start Game");
delay(100);
lcd.setCursor(0,1);
lcd.print(" ");
delay(100);
}
}
//------------------------------Setup-------------------------------
void setup()
{
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.clear();
for(int i = 0; i < 4; i ++)
{
lcd.createChar(i,&Digitos[i * 8]);
}
pinMode(enterbot, INPUT_PULLUP);
}
//-------------------------------Loop-------------------------------
void loop()
{
T1 = millis();
start();
game_over();
pulo();
movimentoA();
}