Código
O código Arduino
#include #define PIN_BUTTON 2 # define PIN_AUTOPLAY 1 # define PIN_BUZZER 8 # define PIN_READWRITE 10 # define PIN_CONTRAST 12 # define SPRITE_RUN1 1 # define SPRITE_RUN2 2 # define SPRITE_JUMP_PER_JUPRITE 3 '# define SPRITE_JUMP_PRITE 3'. // Use o '.' caractere para a cabeça # define SPRITE_JUMP_LOWER 4 # define SPRITE_TERRAIN_EMPTY '' // Usa o caractere '' # define SPRITE_TERRAIN_SOLID 5 # define SPRITE_TERRAIN_SOLID_RIGHT 6 # define SPRITE_TERRAIN_SOLID_LEFT 7 # define a posição horizontal de HERO_HORIZONTAL # 16_PORIZONTAL # Define a posição horizontal de HERO_HORIZONTAL # 16_PORIZONTAL 1 // define TERIORIZON_HOSRATION__LEFT 1 // define a posição horizontal de TERIORIZONTAL #_POSRATION 1 //_POSRATION_LEFT 1 // define a posição horizontal de HEROTHINHORIZONTAL #_POSITIW 1 // define Terra / Iniciando um salto # define HERO_POSITION_JUMP_2 4 // No meio do caminho # define HERO_POSITION_JUMP_3 5 // O salto está na linha superior # define HERO_POSITION_JUMP_4 6 // O salto está na linha superior # define HERO_POSITION_JUMP_5 7 // O salto está na linha superior # define HERO_POSITION_6 8 // O salto está na linha superior # define HERO_POSITION_JUMP_7 9 // No meio do caminho # define HERO_POSITION_JUMP_8 10 // Prestes a pousar # define HERO_POSITION_RUN_UPPER_1 11 // O herói está executando na linha superior (pose 1) #define HERO_POSITION_RUN_UPPER_2 12 // (pose 2) LiquidCrystal lcd (11, 9, 6, 5, 4, 3); static char terrainUpper [TERRAIN_WIDTH + 1]; static char terrainLower [TERRAIN_WIDTH + 1]; estático bool buttonPushed =false; void initializeGraphics () {gráficos de byte estático [] ={// Executar posição 1 B01100, B01100, B00000, B01110, B11100, B01100, B11010, B10011, // Executar posição 2 B01100, B01100, B00000, B01100, B01100, B01100, B01100, B01110, // Jump B01100, B01100, B00000, B11110, B01101, B11111, B10000, B00000, // Jump Lower B11110, B01101, B11000, B11001 , B00000, B00000, // Ground B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, // Ground right B00011, B00011, B00011, B00011, B00011, B00011, B00011, B00011, // Ground left B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000,}; int i; // Pule usando o caractere 0, isso permite que lcd.print () seja usado para // desenhar rapidamente vários caracteres para (i =0; i <7; ++ i) {lcd.createChar (i + 1, &graphics [i * 8]); } para (i =0; i 9999)? 5:(pontuação> 999)? 4:(pontuação> 99)? 3:(pontuação> 9)? 2:1; // Desenhe a cena terrenoinUpper [TERRAIN_WIDTH] ='\ 0'; terrainLower [TERRAIN_WIDTH] ='\ 0'; char temp =terrenoUpper [16 dígitos]; terrainUpper [16 dígitos] ='\ 0'; lcd.setCursor (0,0); lcd.print (terrainUpper); terreno Superior [16 dígitos] =temp; lcd.setCursor (0,1); lcd.print (terrainLower); lcd.setCursor (16 - dígitos, 0); lcd.print (pontuação); terrainUpper [HERO_HORIZONTAL_POSITION] =upperSave; terrainLower [HERO_HORIZONTAL_POSITION] =lowerSave; return collide;} // Manipula o pressionamento do botão como uma interrupção, evite buttonPush () {buttonPushed =true;} void setup () {pinMode (PIN_READWRITE, OUTPUT); digitalWrite (PIN_READWRITE, LOW); pinMode (PIN_CONTRAST, OUTPUT); digitalWrite (PIN_CONTRAST, LOW); pinMode (PIN_BUTTON, INPUT); digitalWrite (PIN_BUTTON, HIGH); pinMode (PIN_AUTOPLAY, OUTPUT); digitalWrite (PIN_AUTOPLAY, HIGH); pinMode (PIN_BUZZER, OUTPUT); // inicializa o pino da campainha como uma saída digitalWrite (PIN_BUZZER, LOW); // O pino digital 2 mapeia para interromper 0 attachInterrupt (0 / * PIN_BUTTON * /, buttonPush, FALLING); initializeGraphics (); lcd.begin (16, 2);} void loop () {byte estático heroPos =HERO_POSITION_RUN_LOWER_1; byte estático newTerrainType =TERRAIN_EMPTY; byte estático newTerrainDuration =1; reprodução estática do bool =falso; piscar bool estático =falso; distância interna sem sinal estática =0; if (! playing) {drawHero ((pisca)? HERO_POSITION_OFF:heroPos, terrainUpper, terrainLower, distance>> 3); if (pisca) {lcd.setCursor (0,0); lcd.print ("Pressione Iniciar"); } atraso (250); piscar =! piscar; if (buttonPushed) {initializeGraphics (); heroPos =HERO_POSITION_RUN_LOWER_1; jogando =verdadeiro; buttonPushed =false; distância =0; } Retorna; } // Deslocar o terreno para a esquerda advanceTerrain (terrainLower, newTerrainType ==TERRAIN_LOWER_BLOCK? SPRITE_TERRAIN_SOLID:SPRITE_TERRAIN_EMPTY); advanceTerrain (terrainUpper, newTerrainType ==TERRAIN_UPPER_BLOCK? SPRITE_TERRAIN_SOLID:SPRITE_TERRAIN_EMPTY); // Faça um novo terreno para entrar à direita if (--newTerrainDuration ==0) {if (newTerrainType ==TERRAIN_EMPTY) {newTerrainType =(random (3) ==0)? TERRAIN_UPPER_BLOCK:TERRAIN_LOWER_BLOCK; newTerrainDuration =2 + aleatório (10); } else {newTerrainType =TERRAIN_EMPTY; newTerrainDuration =10 + aleatório (10); }} if (buttonPushed) {if (heroPos <=HERO_POSITION_RUN_LOWER_2) heroPos =HERO_POSITION_JUMP_1; buttonPushed =false; digitalWrite (PIN_BUZZER, HIGH); } if (drawHero (heroPos, terrainUpper, terrainLower, distance>> 3)) {playing =false; // O herói colidiu com algo. Que pena. para (int i =0; i <=2; i ++) {digitalWrite (PIN_BUZZER, HIGH); atraso (100); digitalWrite (PIN_BUZZER, LOW); atraso (100); }} else {if (heroPos ==HERO_POSITION_RUN_LOWER_2 || heroPos ==HERO_POSITION_JUMP_8) {heroPos =HERO_POSITION_RUN_LOWER_1; } else if ((heroPos> =HERO_POSITION_JUMP_3 &&heroPos <=HERO_POSITION_JUMP_5) &&terrainLower [HERO_HORIZONTAL_POSITION]! =SPRITE_TERRAIN_EMPTY) {heroPos =HERO_POSITION_RUN_UPPER_1; } else if (heroPos> =HERO_POSITION_RUN_UPPER_1 &&terrainLower [HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY) {heroPos =HERO_POSITION_JUMP_5; } else if (heroPos ==HERO_POSITION_RUN_UPPER_2) {heroPos =HERO_POSITION_RUN_UPPER_1; } else {++ heroPos; } ++ distância; digitalWrite (PIN_AUTOPLAY, terrainLower [HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY? HIGH:LOW); } atraso (100); digitalWrite (PIN_BUZZER, LOW);}