//https://maxpromer.github.io/LCD-Character-Creator/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#define CIMA2 7
#define BAIXO2 6
#define CIMA1 9
#define BAIXO1 8
#define XMAX 79
#define YMAX 12
#define COL 5
#define LIN 8
#define INICIAR 0
#define JOGANDO 1
#define SCORE 2
#define CHECANDO 3
byte tiro1[]={
B00000,
B00000,
B00000,
B00000,
B01110,
B00000,
B00000,
B00000};
byte tiro2[]={
B00000,
B00000,
B00000,
B00000,
B01110,
B00000,
B00000,
B00000};
byte xwing[] = {
B00000,
B01100,
B11000,
B01111,
B01111,
B11000,
B01100,
B00000};
byte tie[] = {
B00000,
B11111,
B00100,
B01110,
B01110,
B00100,
B11111,
B00000};
//bola
int tiro1X=1,tiro1Y=0;//posição x,y da bola
int tiro2X=13,tiro2Y=0;
//xwing
int xwingY = 0;
int pontos1 = 0;
//tie
int tieY = 0;
int pontos2 = 0;
int estado = 0;
int tempo = 300;
int rodadas = 0;
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(CIMA1,INPUT);
pinMode(BAIXO1,INPUT);
pinMode(CIMA2,INPUT);
pinMode(BAIXO2,INPUT);
}
//funcoes tiro
void MoverTiro()
{
lcd.createChar(1, tiro1);
lcd.setCursor(tiro1X, tiro1Y);
lcd.write(1);
lcd.createChar(1, tiro2);
lcd.setCursor(tiro2X, tiro2Y);
lcd.write(1);
delay(tempo);
}
int Mover()
{
//tiros
lcd.setCursor(tiro1X - 1, tiro1Y);
lcd.print(' ');
lcd.setCursor(tiro2X + 1, tiro2Y);
lcd.print(' ');
tiro1X += 1;
tiro2X -= 1;
//naves
lcd.clear();
lcd.createChar(3, xwing);
lcd.setCursor(0, xwingY);
lcd.write(3);
lcd.createChar(4, tie);
lcd.setCursor(15, tieY);
lcd.write(4);
delay(tempo);
}
int Checar()
{
if (tiro1X == 15)
{
if (tieY == tiro1Y)
{
Serial.print("aaaaaaaa");
pontos1 += 1;
tiro1X = 2;
tiro1Y = xwingY;
tiro2X = 13;
tiro2Y = tieY;
rodadas = 0;
tempo = 300;
return SCORE;
}
tiro1X = 2;
tiro1Y = xwingY;
}
if (tiro2X == 0)
{
if (xwingY == tiro2Y)
{
Serial.print("bbbbbbbbb");
pontos2 += 1;
tiro1X = 2;
tiro1Y = xwingY;
tiro2X = 13;
tiro2Y = tieY;
rodadas = 0;
tempo = 300;
return SCORE;
}
tiro2X = 13;
tiro2Y = tieY;
rodadas += 1;
tempo = tempo / rodadas;
}
else
{
return JOGANDO;
}
}
void LerBotoes()
{
if (digitalRead(CIMA1) == HIGH)
{
xwingY = 0;
}
if (digitalRead(BAIXO1) == HIGH)
{
xwingY = 1;
}
if (digitalRead(CIMA2) == HIGH)
{
tieY = 0;
}
if (digitalRead(BAIXO2) == HIGH)
{
tieY = 1;
}
}
int Iniciar()
{
lcd.setCursor(0, 0);
lcd.print("APERTE UM BOTAO");
delay(1000);
if (digitalRead(CIMA1))
{
lcd.clear();
return JOGANDO;
}
else
{
return INICIAR;
}
}
int Jogar()
{
LerBotoes();
Mover();
MoverTiro();
return CHECANDO;
}
int Exibindo()
{
lcd.clear();
lcd.print("JOGADOR 1: ");
lcd.print(pontos1);
lcd.setCursor(0, 1);
lcd.print("JOGADOR 2: ");
lcd.print(pontos2);
tiro1X = 2;
tiro2X = 13;
if(pontos1 == 5)
{
lcd.clear();
lcd.print("JOGADOR 1 VENCEU");
exit(1);
}
if(pontos2 == 5)
{
lcd.clear();
lcd.print("JOGADOR 2 VENCEU");
exit(1);
}
delay(4000);
return JOGANDO;
}
void loop()
{
switch(estado)
{
case INICIAR:
estado=Iniciar();
break;
case JOGANDO:
estado=Jogar();
break;
case SCORE:
estado=Exibindo();
break;
case CHECANDO:
estado=Checar();
break;
}
}