Код
Код 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_3 #define SPRITE_JUMP_ 3 #define SPRITE_JUMP_ 3 #define SPRITE_JUMP_3. // Использовать '.' символ для головы # define SPRITE_JUMP_LOWER 4 # define SPRITE_TERRAIN_EMPTY '' // Используйте символ '' # define SPRITE_TERRAIN_SOLID 5 # define SPRITE_TERRAIN_SOLID_RIGHT 6 # define SPRITE_TERRAIN_SOLID_RIGHT 6 # define SPRITE_TERRAIN_SOLTHID_LEFT 7 # define HERO_HORIZIT TERRAIN_EMPTY 0 #define TERRAIN_LOWER_BLOCK 1 # define TERRAIN_UPPER_BLOCK 2 #define HERO_POSITION_OFF 0 // Герой невидим # define HERO_POSITION_RUN_LOWER_1 1 // Герой бежит в нижнем ряду (поза 1) #define # HERO_UM_2_POSITION / Начало прыжка #define HERO_POSITION_JUMP_2 4 // На полпути вверх # define HERO_POSITION_JUMP_3 5 // Прыжок в верхней строке #define HERO_POSITION_JUMP_4 6 // Прыжок в верхней строке #defin HERO_POSITION_JUMP_5 7 // Прыжок в верхнем ряду #define 8 // Прыжок в верхнем ряду # define HERO_POSITION_JUMP_7 9 // На полпути вниз #define HERO_POSITION_JUMP_8 10 // Готовимся к приземлению # define HERO_POSITION_RUN_UPPER_1 11 // Герой бежит по верхнему ряду (поза 1) #define HERO_POSITION_RUN_UPPER_2 12 // (поза 2) LiquidCrystal lcd (11, 9, 6, 5, 4, 3); static char terrainUpper [TERRAIN_WIDTH + 1]; static char terrainLower [TERRAIN_WIDTH + 1]; static bool buttonPushing =false; void initializeGraphics () {static byte graphics [] ={// Выполнить позицию 1 B01100, B01100, B00000, B01110, B11100, B01100, B11010, B10011, // Выполнить позицию 2 B01100, B01100, B00000, B01100, B01100, B01100, B01100, B01110, // Перейти B01100, B01100, B00000, B11110, B01101, B11111, B10000, B00000, // Перейти вниз B11110, B01101, B10011, B0011 , B00000, B00000, // Земля B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, // Земля справа B00011, B00011, B00011, B00011, B00011, B00011, B00011, B00011, // Земля слева B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000,}; int i; // Пропуск с использованием символа 0, это позволяет использовать lcd.print () для // быстрого рисования нескольких символов для (i =0; i <7; ++ i) {lcd.createChar (i + 1, &graphics [i * 8]); } для (i =0; i 9999)? 5:(оценка> 999)? 4:(оценка> 99)? 3:(оценка> 9)? 2:1; // Отрисовываем сцену terrainUpper [TERRAIN_WIDTH] ='\ 0'; terrainLower [TERRAIN_WIDTH] ='\ 0'; char temp =terrainUpper [16 цифр]; terrainUpper [16 цифр] ='\ 0'; lcd.setCursor (0,0); lcd.print (terrainUpper); terrainUpper [16-значный] =temp; lcd.setCursor (0,1); lcd.print (terrainLower); lcd.setCursor (16 - цифры, 0); lcd.print (оценка); terrainUpper [HERO_HORIZONTAL_POSITION] =upperSave; terrainLower [HERO_HORIZONTAL_POSITION] =lowerSave; return collide;} // Обработка нажатия кнопки как прерывания. digitalWrite (PIN_READWRITE, LOW); pinMode (PIN_CONTRAST, ВЫХОД); digitalWrite (PIN_CONTRAST, LOW); pinMode (PIN_BUTTON, INPUT); digitalWrite (PIN_BUTTON, HIGH); pinMode (PIN_AUTOPLAY, ВЫХОД); digitalWrite (PIN_AUTOPLAY, HIGH); pinMode (PIN_BUZZER, OUTPUT); // инициализируем вывод зуммера как выход digitalWrite (PIN_BUZZER, LOW); // Цифровой вывод 2 отображается на прерывание 0 attachInterrupt (0 / * PIN_BUTTON * /, buttonPush, FALLING); initializeGraphics (); lcd.begin (16, 2);} void loop () {статический байт heroPos =HERO_POSITION_RUN_LOWER_1; статический байт newTerrainType =TERRAIN_EMPTY; статический байт newTerrainDuration =1; static bool plays =false; static bool blink =false; статическое беззнаковое целое расстояние =0; если (! играет) {drawHero ((мигает)? HERO_POSITION_OFF:heroPos, terrainUpper, terrainLower, distance>> 3); если (мигает) {lcd.setCursor (0,0); lcd.print («Нажать Старт»); } задержка (250); мигать =! мигать; если (кнопка нажата) {initializeGraphics (); heroPos =HERO_POSITION_RUN_LOWER_1; play =true; buttonPushing =false; расстояние =0; } возвращение; } // Сдвигаем ландшафт влево advanceTerrain (terrainLower, newTerrainType ==TERRAIN_LOWER_BLOCK? SPRITE_TERRAIN_SOLID:SPRITE_TERRAIN_EMPTY); advanceTerrain (terrainUpper, newTerrainType ==TERRAIN_UPPER_BLOCK? SPRITE_TERRAIN_SOLID:SPRITE_TERRAIN_EMPTY); // Создаем новый ландшафт для входа справа if (--newTerrainDuration ==0) {if (newTerrainType ==TERRAIN_EMPTY) {newTerrainType =(random (3) ==0)? TERRAIN_UPPER_BLOCK:TERRAIN_LOWER_BLOCK; newTerrainDuration =2 + random (10); } еще {newTerrainType =TERRAIN_EMPTY; newTerrainDuration =10 + random (10); }} если (кнопка нажата) {если (heroPos <=HERO_POSITION_RUN_LOWER_2) heroPos =HERO_POSITION_JUMP_1; buttonPushing =false; digitalWrite (PIN_BUZZER, HIGH); } if (drawHero (heroPos, terrainUpper, terrainLower, distance>> 3)) {plays =false; // Герой с чем-то столкнулся. Очень плохо. для (int я =0; я <=2; я ++) {digitalWrite (PIN_BUZZER, HIGH); задержка (100); digitalWrite (PIN_BUZZER, LOW); задержка (100); }} else {если (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_1; } иначе, если (heroPos> =HERO_POSITION_RUN_UPPER_1 &&terrainLower [HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY) {heroPos =HERO_POSITION_JUMP_5; } иначе, если (heroPos ==HERO_POSITION_RUN_UPPER_2) {heroPos =HERO_POSITION_RUN_UPPER_1; } else {++ heroPos; } ++ расстояние; digitalWrite (PIN_AUTOPLAY, terrainLower [HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY? HIGH:LOW); } задержка (100); digitalWrite (PIN_BUZZER, LOW);}