// BASE DO JOGO DO CHROME DINO
// Programado por Luis Eduardo
// inspirado em:
//[1] https://devpost.com/software/arduino-chrome-dino
//[2] https://create.arduino.cc/projecthub/Unsigned_Arduino/the-chrome-dino-game-on-an-lcd-shield-883afb
// Incluindo a biblioteca do LCD
#include <LiquidCrystal.h>
#include "bitmaps.h"
// Configurando o LCD
LiquidCrystal lcd(12,11,5,4,3,2);
// configurando id dos caracteres especiais
#define lcd_limpo 32
#define lcd_dino 0
#define lcd_cacto 1
#define lcd_passaro 2
#define lcd_bloco 3
// inicia a arena como limpa
byte arena[16] = {
lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo,
lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo, lcd_limpo
};
// configura a area do pulo como limpo (não pulando)
byte pulo = lcd_limpo;
// inicia os pontos em zero
int pontos = 0;
bool pode_pontuar = false;
unsigned long tempoAnterior = 0;
unsigned long tempoAnteriorLED = 0;
unsigned long tempoPulo = 0;
const int puloTamanho = 500;
// quando que o dino tá seguro?
// eu coloquei pra quando a ele ta pulando ou não bateu em nada
#define estaSeguro arena[1] == lcd_limpo || arena[1] == lcd_dino
const byte dificuldade = 15;
int velocidade = 300;
void setup() {
lcd.begin(16, 2);
Serial.begin(9600);
lcd.createChar(lcd_dino, dino);
lcd.createChar(lcd_cacto, cacto);
lcd.createChar(lcd_passaro, passaro);
lcd.createChar(lcd_bloco, bloco);
pinMode(A2, INPUT); // botão como entrada
pinMode(LED_BUILTIN, OUTPUT); // led interno como saida
randomSeed(A1);
lcd.clear();
mostrar_tela_inicial();
// esperando apertar o botão para começar
while (!digitalRead(A2));
delay(100);
lcd.clear(); // limpando lcd
}
void loop() {
unsigned long tempoAtualLED = millis();
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= velocidade) {
tempoAnterior = tempoAtual;
// calcula e coloca cacto/passaro
if (random(dificuldade) == 0) {
arena[15] = lcd_cacto;
} else if (random(dificuldade) == 1) {
arena[15] = lcd_passaro;
} else {
arena[15] = lcd_limpo;
}
// faz a arena se mexer pra direita
for (int i = 0; i <= 15; i++) {
arena[i] = arena[i + 1];
}
// soma um ponto
if (pode_pontuar == true) {
pontos++;
}
}
desenharBarreira();
// se botão foi apertado
if (digitalRead(A2)) {
// verifica se o dino bateu em algo
if (arena[1] != lcd_limpo && (arena[1] != lcd_cacto || arena[1] != lcd_passaro)) {
arena[1] = lcd_limpo;
}
pulo = lcd_dino;
pode_pontuar = false;
tempoPulo = millis();
}
if (millis() - tempoPulo >= puloTamanho) {
if (estaSeguro) {
arena[1] = lcd_dino;
pulo = lcd_limpo;
pode_pontuar = true;
} else {
mostrar_tela_fim_de_jogo();
}
}
atualizarLCD();
printpontos();
if (millis() - tempoAnteriorLED >= 500) {
tempoAnteriorLED = tempoAtualLED;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}