Código
- código do jogo de asteróides
código do jogo de asteróides Arduino
/ ********************************************** ********** * Este é um jogo simples usando o MAX72XX LED-Matrix. * Você é uma nave estelar e deve evitar o contato com * os asteróides que caem. * * (c) 2018 por Joshua Weßner * * * ************************************* ****************** /// LedControl de Eberhard Fahle // veja:http://wayoda.github.io/LedControl/#include "LedControl.h" / * Agora precisamos de um LedControl para trabalhar. ***** Esses números de pinos provavelmente não funcionarão com o seu hardware ***** o pino 12 está conectado ao DataIn, o pino 11 está conectado ao CLK, o pino 10 está conectado a LOAD Temos apenas um único MAX72XX. * / LedControl lc =LedControl (12,11,10,1); / ******************************** ****************************** * Variáveis globais * / / * atraso entre as atualizações do display * / unsigned long delaytime =1000; / * para exibir a pontuação * / String scoreString; int score; int centenas; String scoreStr; String scoreArr [] ={"", "", ""}; / * micro interruptores para controle * / int pinLeft =2; int pinRight =3; botão longo sem sinal volátilPressed; int buttonDelay =150; // manipula o contato bouncevolatile bool gameOver =false; / * "ritmo" do jogo, em milissegundos * / int tick; int tickCounter =1; / * timestamp * / unsigned long now; / * display * / int ship; / * Posição inicial do navio * / colunas inteiras [] ={0,0,0,0,0,0,0,0}; // 8 colunas, cada int é a linha 1-8.int randomInt; / ********************************* ****************************** * setup * / void setup () {/ * Initializing * / gameOver =false; centenas =0; scoreArr [0] =""; scoreArr [1] =""; scoreArr [2] =""; pontuação =0; tick =300; tickCounter =1; navio =3; agora =milis (); buttonPressed =milis (); randomSeed (analogRead (15)); // melhores números aleatórios para (int i =0; i <8; i ++) colunas [i] =0; // Depuração // Serial.begin (9600); // Serial.print (colunas [0]); / * O MAX72XX está no modo de economia de energia na inicialização, temos que fazer uma chamada de ativação * / lc.shutdown (0, false); / * Defina o brilho para valores médios * / lc.setIntensity (0,1); / * e limpar a exibição * / lc.clearDisplay (0); pinMode (pinLeft, INPUT_PULLUP); pinMode (pinRight, INPUT_PULLUP); / * botão de anexação pressionado para interromper * / attachInterrupt (digitalPinToInterrupt (pinLeft), left, FALLING); attachInterrupt (digitalPinToInterrupt (pinRight), direita, FALLING); } / ************************************************ ************** * manipular botão esquerdo pressionado * / void left () {if (millis () - buttonPressed> buttonDelay) // manipular switch contact bounce {if (ship! =0) enviar--; else ship =7; lc.clearDisplay (0); buttonPressed =milis (); } // após o término do jogo, pressionar o botão reiniciará o jogo if (gameOver ==true) {gameOver =false; configurar(); }} / *********************************************** **** ) ship ++; else ship =0; lc.clearDisplay (0); buttonPressed =milis (); } // após o término do jogo, pressionar o botão reiniciará o jogo if (gameOver ==true) {gameOver =false; configurar(); }} / *********************************************** **************** * loop * / void loop () {if (millis () - agora> tick) {// fazer cada tick // pontuação é:quantos ticks você sobreviveu pontuação ++; agora =milis (); if (tickCounter ==1) {// a cada 4 tique // torna o jogo mais rápido ao longo do tempo tick =tick / 1.02; // escolher aleatoriamente a coluna randomInt =random (0, 8); // se não houver asteróide na coluna, crie um na linha 1. if (colunas [randomInt] ==0) {colunas [randomInt] =1; }} if (tickCounter! =4) tickCounter ++; senão tickCounter =1; // fazer para cada coluna para (int i =0; i <8; i ++) {if (colunas [i] ==10) // excluir asteróides quando fora de exibição colunas [i] =0; if (colunas [i]! =0) // faz com que asteróides caiam colunas [i] ++; } lc.clearDisplay (0); } / * escrever para exibir * / // enviar lc.setLed (0, 7, enviar, verdadeiro); // asteróides para (int i =0; i <8; i ++) {if (colunas [i]> 0) lc.setLed (0, colunas [i] -2, i, verdadeiro); lc.setLed (0, colunas [i] -3, i, verdadeiro); } // detecta a colisão do navio com o asteróide if (colunas [navio] ==10 ou colunas [navio] ==9) {lc.clearDisplay (0); // anima a explosão para (int i =0; i <4; i ++) {lc.setLed (0,7, navio + i, verdadeiro); lc.setLed (0,7, ship-i, verdadeiro); lc.setLed (0,7-i, navio + i, verdadeiro); lc.setLed (0,7-i, ship-i, verdadeiro); lc.setLed (0,7-1,5 * i, navio, verdadeiro); // som da explosão sem sinal por muito tempo =millis (); int randomSound =1000; while (millis () - tempo <=250) {randomSound--; tom (9, aleatório (randomSound, 1000)); // altera os parâmetros de random () para sons diferentes} lc.clearDisplay (0); noTone (9); } atraso (500); / * exibir pontuação * / scoreStr =String (pontuação); // obtém dígitos únicos de score int scoreArr [0] =scoreStr.charAt (0); scoreArr [1] =scoreStr.charAt (1); scoreArr [2] =scoreStr.charAt (2); // a matriz só pode exibir até 2 dígitos (até 99) if (score <100) {for (int i =0; i <2; i ++) {if (scoreArr [i] =="0") draw0 ( 1 + i * 4); if (scoreArr [i] =="1") draw1 (1 + i * 4); if (scoreArr [i] =="2") draw2 (1 + i * 4); if (scoreArr [i] =="3") draw3 (1 + i * 4); if (scoreArr [i] =="4") draw4 (1 + i * 4); if (scoreArr [i] =="5") draw5 (1 + i * 4); if (scoreArr [i] =="6") draw6 (1 + i * 4); if (scoreArr [i] =="7") draw7 (1 + i * 4); if (scoreArr [i] =="8") draw8 (1 + i * 4); if (scoreArr [i] =="9") draw9 (1 + i * 4); }} // se a pontuação for> 100, exibir apenas os dois últimos dígitos da pontuação else {for (int i =1; i <3; i ++) {if (scoreArr [i] =="0") draw0 (1+ ( i-1) * 4); if (scoreArr [i] =="1") draw1 (1+ (i-1) * 4); if (scoreArr [i] =="2") draw2 (1+ (i-1) * 4); if (scoreArr [i] =="3") draw3 (1+ (i-1) * 4); if (scoreArr [i] =="4") draw4 (1+ (i-1) * 4); if (scoreArr [i] =="5") draw5 (1+ (i-1) * 4); if (scoreArr [i] =="6") draw6 (1+ (i-1) * 4); if (scoreArr [i] =="7") draw7 (1+ (i-1) * 4); if (scoreArr [i] =="8") draw8 (1+ (i-1) * 4); if (scoreArr [i] =="9") draw9 (1+ (i-1) * 4); } // primeiro dígito da pontuação ("centenas") é exibido como pontos:Um ponto para cada cem. para (int i =1; i <10; i ++) {if (scoreArr [0] ==String (i)) centenas =i; } para (int i =1; i <=centenas; i ++) {lc.setLed (0,0, i-1, verdadeiro); lc.setLed (0,1, i-1, verdadeiro); atraso (200); }} gameOver =true; while (gameOver ==true) {// não faz nada além de esperar pelo botão pressionado}}} ///////////////////////////////// Draw pontuação dígitos /////////////////////////////////////////// void draw1 (posição int) { lc.setColumn (posição 0,0 +, B00001000); lc.setColumn (0,1 + posição, B00011111); } void draw2 (posição interna) {lc.setColumn (posição 0,0 +, B00010111); lc.setColumn (0,1 + posição, B00010101); lc.setColumn (0,2 + posição, B00011101); } void draw3 (posição interna) {lc.setColumn (posição 0,0 +, B00010001); lc.setColumn (0,1 + posição, B00010101); lc.setColumn (0,2 + posição, B00011111); } void draw4 (posição interna) {lc.setColumn (posição 0,0 +, B00011100); lc.setColumn (0,1 + posição, B00000100); lc.setColumn (0,2 + posição, B00011111); } void draw5 (posição interna) {lc.setColumn (posição 0,0 +, B00011101); lc.setColumn (0,1 + posição, B00010101); lc.setColumn (0,2 + posição, B00010111); } void draw6 (posição interna) {lc.setColumn (posição 0,0 +, B00011111); lc.setColumn (0,1 + posição, B00010101); lc.setColumn (0,2 + posição, B00010111); } void draw7 (posição interna) {lc.setColumn (posição 0,0 +, B00010000); lc.setColumn (0,1 + posição, B00010011); lc.setColumn (0,2 + posição, B00011100); } void draw8 (posição interna) {lc.setColumn (posição 0,0 +, B00011111); lc.setColumn (0,1 + posição, B00010101); lc.setColumn (0,2 + posição, B00011111); } void draw9 (posição interna) {lc.setColumn (posição 0,0 +, B00011101); lc.setColumn (0,1 + posição, B00010101); lc.setColumn (0,2 + posição, B00011111); } void draw0 (posição interna) {lc.setColumn (posição 0,0 +, B00011111); lc.setColumn (0,1 + posição, B00010001); lc.setColumn (0,2 + posição, B00011111); }