O Placarduino está ficando muito bom. Os jogadores já podem se identificar e contar seus pontos, mas chegou a hora do game over: é o fim de jogo para o Placarduino. Ou seja, um botão para finalizar o jogo e o vencedor comemorar!
Há muito tempo eu já estava pensando em como sinalizar o final de uma partida no Placarduino. Porém, cada tipo de jogo possui regras diferentes, então seria complicado colocar a lógica de fim de jogo no código. Então, a solução mais simples é utilizar um botão que pode ser pressionado a qualquer momento, indicando que a partida acabou e que o jogador que estiver com mais pontos no momento é o vencedor. E, claro, no fim do jogo também tem a comemoração do vencedor.
O material utilizado:
- 1 push button
- 1 LED (eu utilizei um de cor verde)
- 1 resistor de 300 Ω (para o LED)
- 1 resistor de 10 kΩ
- Alguns cabos jumper
O uso do LED é opcional, mas foi um teste que eu fiz e achei o resultado interessante, então eu mantive no projeto.
Ligação do LED comemorativo
Para ligar o LED no circuito, além do LED são necessários um resistor e um cabo jumper. E nada de código. Vamos “roubar” a energia do buzzer para acender o LED de acordo com a música, ligando-os em paralelo conforme o diagrama:
E é só isso mesmo! Agora, sempre que o buzzer tocar um som, o LED irá acompanhar e ficar piscando:
Adicionando o botão para terminar o jogo
O novo botão foi adicionado ao circuito da mesma forma que todos os outros, com um resistor de pull-down. Esse novo botão foi ligado no pino digital 8 do Arduino. O resultado final é mostrado na imagem abaixo (o que foi adicionado está destacado com a elipse vermelha).
E é só isso mesmo! Só falta o código…
Para verificar o pressionamento do botão, será utilizada a biblioteca RisingEdgeButton criada anteriormente. E para evitar que o jogo continue depois do apito final, será utilizada uma flag booleana.
// Linhas adicionadas ao Placarduino.ino nos locais adequados #include "RisingEdgeButton.h" #define PIN_BTN_GAME_OVER 8 RisingEdgeButton gameOverButton(PIN_BTN_GAME_OVER); bool isGameOver = false;
Dentro do loop()
, é evitado que o jogo continue depois do fim (fica na tela de fim de jogo até reiniciar o Arduino) e verificado o pressionamento do botão. Ao pressionar o botão, é chamada outra função para tratar o fim de jogo:
void loop() { if (isGameOver) { return; } readPlayerCard(); checkButtons(); if (gameOverButton.pressed()) { gameOver(); } }
A função gameOver()
começa alterando a flag de final de jogo e limpando o display LCD para exibir uma nova mensagem. Em seguida, é verificada a pontuação dos dois jogadores para identificar se existe ou vencedor ou se o jogo terminou empatado:
void gameOver() { bool hasWinner = false; const char *winnerName; size_t winnerNameLength; isGameOver = true; lcd.clear(); if (player1.getScore() > player2.getScore()) { winnerName = player1.getName(); hasWinner = true; } else if (player2.getScore() > player1.getScore()) { winnerName = player2.getName(); hasWinner = true; } // continua...
Em seguida é exibida a mensagem do fim de jogo. Caso o jogo termine empatado, é exibido apenas a mensagem “EMPATE” centralizada (confesso que não dediquei muito tempo para essa parte de empate).
Já em caso de vitória de algum jogador, é exibido um “emoji” de comemoração \o/, além do nome do jogador e a indicação de que ele “GANHOU!”.
// ... continuação if (!hasWinner) { lcd.setCursor(7, 1); lcd.print("EMPATE"); } else { // \o/ lcd.setCursor(1, 1); lcd.write(255); lcd.setCursor(1, 2); lcd.write(255); lcd.setCursor(2, 3); lcd.write(255); lcd.setCursor(3, 2); lcd.write(0); lcd.setCursor(4, 2); lcd.write(4); lcd.setCursor(5, 2); lcd.write(1); lcd.setCursor(3, 3); lcd.write(2); lcd.setCursor(4, 3); lcd.write(5); lcd.setCursor(5, 3); lcd.write(3); lcd.setCursor(7, 1); lcd.write(255); lcd.setCursor(7, 2); lcd.write(255); lcd.setCursor(6, 3); lcd.write(255); winnerNameLength = strnlen(winnerName, PlayerControl::MAX_NAME_LENGTH); lcd.setCursor(9 + (11 - winnerNameLength) / 2, 1); lcd.print(winnerName); lcd.setCursor(11, 2); lcd.print("GANHOU!"); musicPlayer.victory(); } }
E para fechar com chave de ouro, o MusicPlayer
toca um tema da vitória (bem simples, mas tá valendo)!
void MusicPlayer::victory() { this->playNote(NOTE_C6, 140); this->playNote(NOTE_D6, 140); this->playNote(NOTE_E6, 140); this->playNote(NOTE_G6, 260); this->pause(140); this->playNote(NOTE_E6, 140); this->playNote(NOTE_G6, 550); }
Finalizando
E isso é tudo por enquanto. Como sempre, você pode conferir o código-fonte e o arquivo do Fritzing no repositório do GitHub:
- Versão deste post: https://github.com/eduardoweiland/placarduino/tree/v2.1
- Versão mais atualizada: https://github.com/eduardoweiland/placarduino
Bons jogos e até a próxima! \o/