//BATALHA NAVAL
//Como jogar:
//Primeiro, você escolhe uma linha digitando um número de 1 a 8 no teclado numérico (1 a 8)
//Em seguida, você seleciona a coluna digitando outro número no teclado
//Se houver um navio na coordenada digitada, um led acionará e a pontuação será incrementada
//Depois de achor todos os navios você ganha
//Basta digitar um numero de 1 a 8 no teclado para escolher a linha da nova partida
//A variável "numDeNavios" determina quantos navios você quer na matriz
#include <LedControl.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <stdlib.h>
// Define os pinos do MAX7219 para o módulo LED 8x8
#define MAX7219_DIN 51
#define MAX7219_CLK 52
#define MAX7219_CS 53
LedControl lc = LedControl(MAX7219_DIN, MAX7219_CLK, MAX7219_CS, 1);
// Define os pinos do keypad 4x4
const byte rows = 4;
const byte columns = 4;
char keys[ROWS][COLUMNS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {49, 48, 47, 46};
byte columnPins[COLUMNS] = {45, 44, 43, 42};
Keypad keypad = Keypad(makeKeymap(teclas), rowPins, columnPins, ROWS, COLUMNS);
// Define o pino do display LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Matriz que representa a grade do jogo
int grid[8][8];
// Variáveis para controlar o estado do jogo
int score = 0;
int selectedRow = 0;
int selectedColumn = 0;
int counter = 1;
int numOfShips = 1;
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 8);
lc.clearDisplay(0);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("BATTLESHIP");
// Inicializa a matriz de grade do jogo com zeros
for (int row = 0; row < 8; row++) {
for (int column = 0; column < 8; column++) {
grid[row][column] = 0;
}
}
// Gera navios aleatórios na grade
for (int i = 0; i < numOfShips; i++) {
int shipRow = random(8);
int shipColumn = random(8);
if (grid[shipRow][shipColumn] == 0) {
grid[shipRow][shipColumn] = 1;
}
else {
i--;
}
}
}
void loop() {
char key = keypad.getKey();
if (key) {
if (key >= '1' && key <= '8' && counter % 2 == 1) {
linhaSelecionada = key - '0' - 1;
lcd.setCursor(0, 1);
lcd.print("Linha: ");
lcd.print(linhaSelecionada + 1);
contador++;
} else if (key >= '1' && key <= '8' && contador % 2 == 0) {
int colunaSelecionada = key - '0' - 1;
lcd.setCursor(8, 1);
lcd.print("Coluna:");
lcd.print(colunaSelecionada + 1);
contador++;
int valorCelula = grade[linhaSelecionada][colunaSelecionada];
if (valorCelula == 1) {
lc.setLed(0, linhaSelecionada, colunaSelecionada, true);
grade[linhaSelecionada][colunaSelecionada] = -2; // Navio atingido
pontuacao++;
}
}
// Atualiza a pontuação no display LCD
lcd.setCursor(0, 0);
lcd.print("Pontuacao: ");
lcd.print(pontuacao);
if (pontuacao == numDeNavios) {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Temos um ");
lcd.setCursor(3, 1);
lcd.print("VENCEDOR!!");
contador = 1;
pontuacao = 0;
for (int piscadas = 0; piscadas < 4; piscadas++) {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
lc.setLed(0, i, j, true);
}
}
delay(500);
lc.clearDisplay(0);
delay(500);
}
delay(3000);
lcd.clear();
lc.clearDisplay(0);
for (int linha = 0; linha < 8; linha++) {
for (int coluna = 0; coluna < 8; coluna++) {
grade[linha][coluna] = 0;
}
}
for (int i = 0; i < numDeNavios; i++) {
int linhaNavio = random(8);
int colunaNavio = random(8);
if (grade[linhaNavio][colunaNavio] == 0) {
grade[linhaNavio][colunaNavio] = 1;
}
else {
i--;
}
}
}
}
}