Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iarduino_OLED.h> // Биб-ка для работы с OLED дисплеем
- iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D
- extern uint8_t MediumFontRus[]; // Подключаем шрифт MediumFontRus
- extern uint8_t SmallFontRus[]; // Подключаем шрифт SmallFontRus
- const uint8_t HandScare[] PROGMEM = { 44, 16,
- 0xc0, 0x58, 0x7c, 0xc4, 0x8c, 0x1f, 0x31, 0x31, 0x07, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xc0, 0x70, 0x10, 0x18, 0x88, 0x88, 0x88, 0xf8, 0x40, 0xc0, 0x00, 0x01, 0x03, 0x02, 0x06,
- 0x04, 0x04, 0x0c, 0x08, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
- 0xc0, 0x40, 0x40, 0x48, 0x4a, 0x6a, 0x2b, 0x3e
- };
- const uint8_t EggBroken[] PROGMEM = { 23, 16, // Разбитое яйцо
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x80, 0x80, 0xE0, 0x70, 0x00, 0x80,
- 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0B, 0x1F, 0x0E,
- 0x00, 0x24, 0x36, 0x7F, 0x6F, 0x39, 0x31, 0x53, 0x6F, 0x3B, 0x21, 0x00, 0x0C, 0x3E,
- 0x34, 0x1C, 0x00, 0x00};
- const uint8_t HandLeftUp[] PROGMEM = { 27, 24, // Рука слева вверху
- 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x0E, 0x06, 0x3E, 0xEE, 0x2C, 0xB8, 0x48, 0xC8,
- 0x88, 0x18, 0x70, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x60, 0xE0, 0xF0, 0xFB, 0xFF, 0x9E, 0x18, 0x3C, 0x7D, 0x7F, 0xFC, 0xC4, 0x07, 0x0F,
- 0xFC, 0xF8, 0xF1, 0x47, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x03, 0x07, 0x0F, 0x1C, 0x11, 0x11, 0x12, 0x10, 0x10, 0x18, 0x08, 0x08, 0x08,
- 0x19, 0x13, 0x12, 0x04, 0x28, 0x08, 0x38, 0x70, 0x60, 0x40, 0x00};
- const uint8_t HandLeftDown[] PROGMEM = { 26, 24, // Рука слева внизу
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xF0, 0x18, 0xC8, 0x08, 0xCC, 0x84, 0xE4,
- 0xC4, 0x74, 0x5C, 0x4C, 0x4E, 0x6E, 0xEE, 0xE6, 0x74, 0x34, 0x10, 0x00, 0x00, 0xC0,
- 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF5, 0xFF, 0xF1, 0xE1, 0xEF, 0xFE, 0xD4, 0xC0, 0xE0,
- 0x70, 0x3C, 0x0E, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0F,
- 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- const uint8_t HandRightUp[] PROGMEM = { 24, 24, // Рука справа вверху
- 0x00, 0x40, 0xC0, 0xE0, 0xE0, 0xB0, 0x90, 0x18, 0x08, 0x6C, 0xC4, 0xFC, 0x2C, 0x26,
- 0xFE, 0x0E, 0x3C, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x61, 0xF1, 0xFA, 0xFA, 0xFF, 0x3F, 0x1D, 0x3D, 0xFF, 0xFC, 0x7C, 0x3F,
- 0x3F, 0xFC, 0xFC, 0xFC, 0x78, 0x00, 0x00, 0x40, 0x60, 0x60, 0x70, 0x70, 0x70, 0x49,
- 0x4B, 0x6F, 0x67, 0x67, 0x60, 0x60, 0x61, 0x21, 0x20, 0x2A, 0x29, 0x1C, 0x07, 0x01,
- 0x00, 0x00};
- const uint8_t HandRightDown[] PROGMEM = { 29, 24, // Рука справа внизу
- 0x00, 0x00, 0xCC, 0x9C, 0x9C, 0x3C, 0x28, 0x68, 0xC8, 0x8C, 0x0C, 0x04, 0x46, 0xE6,
- 0xEC, 0x7C, 0x4C, 0xDC, 0x7C, 0x38, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3F, 0x76, 0xE4, 0x84, 0x19, 0x11, 0x33, 0x37,
- 0x3F, 0x1F, 0x19, 0xDF, 0xDF, 0x78, 0x78, 0xF8, 0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xF8,
- 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x1E, 0x18,
- 0x30, 0x30, 0x20, 0x68, 0x6A, 0x7A, 0x3B, 0x3D, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x03,
- 0x00, 0x00, 0x00};
- const uint8_t WolfLeft[] PROGMEM = { 29, 39, // Волк влево
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0xb4, 0xe6, 0xf3,
- 0xd1, 0xd1, 0x31, 0xe1, 0x01, 0x01, 0x07, 0x04, 0x0c, 0x78, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x80, 0xf0, 0x1c, 0x87, 0xf1, 0x19, 0x0f, 0x01, 0x81, 0x01, 0x00, 0x00, 0x81, 0xc1, 0x61,
- 0x31, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00,
- 0x3c, 0x37, 0x10, 0x10, 0x18, 0x08, 0x0c, 0x06, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x38, 0x2c, 0x67, 0xc9, 0x9c, 0x9c, 0xbc, 0x3c, 0x3c,
- 0x7c, 0x7c, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x3f, 0x3f, 0x03, 0x00, 0x00,
- 0xfe, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x41, 0x41, 0x01, 0x01, 0x01, 0x01,
- 0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x03, 0x01, 0x00, 0x00,
- 0x00};
- const uint8_t WolfRight[] PROGMEM = { 31, 41,
- 0x00, 0x00, 0x00, 0x80, 0xf0, 0x18, 0x08, 0x0e, 0x02, 0x02, 0xc2, 0x62, 0xa2, 0xa2, 0xe6, 0xcc,
- 0x68, 0xb8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x81, 0x02, 0x03, 0x03, 0x01, 0x01, 0x03,
- 0x03, 0x03, 0x0e, 0x3a, 0xe2, 0x8e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
- 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0e, 0x08, 0x18, 0x30, 0x60, 0x41,
- 0xc0, 0x80, 0x80, 0xc0, 0x7f, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x06, 0xfc, 0x04, 0x04, 0x06, 0x7e, 0x7e, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
- 0xf8, 0xf8, 0x78, 0x78, 0x78, 0x38, 0x38, 0x93, 0xce, 0x58, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x03, 0x06, 0x84, 0x84, 0x84, 0x84, 0xfc, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x02, 0x02,
- 0x02, 0x02, 0x82, 0x83, 0x81, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
- void StartScreen(); // Функция заставки игры
- void WolfMove(); // Функция движения волка
- void StartWolf(); // Функция вывода начального положения волка
- void EggMoveLeftUp(); // Функция движения яйца слева сверху
- void EggMoveLeftDown(); // Функция движения яйца слева снизу
- void EggMoveRightUp(); // Функция движения яйца справа сверху
- void EggMoveRightDown(); // Функция движения яйца справа снизу
- void CatcheLeftUp(); // Функция проверки пойманного яйца слева сверху
- void CatcheLeftDown(); // Функция проверки пойманного яйца слева снизу
- void CatcheRightUp(); // Функция проверки пойманного яйца справа сверху
- void CatcheRightDown(); // Функция проверки пойманного яйца справа снизу
- void GenerationEggs(); // Функция генерации яиц
- void EggsToCatch(); // Функция проверки пойманного яйца
- void Location(); // Функция прорисовки локации
- void ShowScore(); // Функция вывода очков
- void LevelComplicate(); // Функция уровня сложности
- void GameOver(); // Функция завершения игры
- void Move(); // Функция отрисовки движения яиц
- int MassEggs[5]; // Массив в котором каждая переменная соответствует линии, с которой скатывается яйцо
- int MassWolfPosition; // Переменная положения волка
- int eventWolf; // Переменная события для волка
- int previousWolf; // Переменная предыдущего положения волка
- int wolfPositionStart; // Переменная начального положения волка
- int eggsPosition; // Переменная положения яйца
- int timeEggs; // Переменная времени передвижения яиц
- int eventEggs; // Переменная события для яиц
- int score; // Переменная очков
- int s; // Дополнительная переменная для генерации чисел
- int eventGenerationEggs; // Переменная события для генерации чисел
- int quantityScore; // Количество очков
- const int levelComplicate1 = 6; // Константа уровня сложности 1
- const int levelComplicate2 = 3; // Константа уровня сложности 2
- const int levelComplicate3 = 2; // Константа уровня сложности 3
- const int levelComplicate4 = 1; // Константа уровня сложности 4
- int eggsLeftUp[7]; // Массив вывода картинки яйца на линию слева сверху
- int eggsLeftDown[7]; // Массив вывода картинки яйца на линию слева снизу
- int eggsRightUp[7]; // Массив вывода картинки яйца на линию справа сверху
- int eggsRightDown[7]; // Массив вывода картинки яйца на линию справа снизу
- uint32_t Tm; // Переменная времени
- int eventStartGame; // Переменная события для запуска игры
- #include "GyverButton.h" // Биб-ка для отработки нажатия кнопок
- #define PINb1 6 // Кнопка - рука слева вверху (пин D6)
- #define PINb2 7 // Кнопка - рука слева внизу (пин D7)
- #define PINb3 4 // Кнопка - рука справа вверху (пин D4)
- #define PINb4 5 // Кнопка - рука справа внизу (пин D5)
- GButton butt1(PINb1); // Создаём кнопку PINb1
- GButton butt2(PINb2); // Создаём кнопку PINb2
- GButton butt3(PINb3); // Создаём кнопку PINb3
- GButton butt4(PINb4); // Создаём кнопку PINb4
- const uint8_t spkPin = 11; // Buzzer (пин D11)
- #define NOTE_C4 262
- #define NOTE_A4 440
- #define NOTE_F5 698
- int lose[] = { NOTE_F5, NOTE_A4, NOTE_C4 }; // Задаём ноты для мелодии
- int loseNoteDurations[] = { 2, 4, 4 }; // Задаём продолжительность нот
- #include <EEPROM.h> // Биб-ка для работы с энергонезависимой памятью
- int record = 0; // Переменная рекорда
- void EggsToBroken(); // Функция разбившегося яйца
- int brokegg; // Переменная разбившихся яиц
- void setup() {
- eggsLeftUp[1] = 16; eggsLeftUp[1] <<= 8; eggsLeftUp[1] += 2; // Координаты вывода яйца в зависимости от шага
- eggsLeftUp[2] = 18; eggsLeftUp[2] <<= 8; eggsLeftUp[2] += 7;
- eggsLeftUp[3] = 20; eggsLeftUp[3] <<= 8; eggsLeftUp[3] += 12;
- eggsLeftUp[4] = 22; eggsLeftUp[4] <<= 8; eggsLeftUp[4] += 17;
- eggsLeftUp[5] = 24; eggsLeftUp[5] <<= 8; eggsLeftUp[5] += 22;
- eggsLeftUp[6] = 0;
- eggsLeftDown[1] = 36; eggsLeftDown[1] <<= 8; eggsLeftDown[1] += 2;
- eggsLeftDown[2] = 38; eggsLeftDown[2] <<= 8; eggsLeftDown[2] += 7;
- eggsLeftDown[3] = 40; eggsLeftDown[3] <<= 8; eggsLeftDown[3] += 12;
- eggsLeftDown[4] = 42; eggsLeftDown[4] <<= 8; eggsLeftDown[4] += 17;
- eggsLeftDown[5] = 44; eggsLeftDown[5] <<= 8; eggsLeftDown[5] += 22;
- eggsLeftDown[6] = 0;
- eggsRightUp[1] = 16; eggsRightUp[1] <<= 8; eggsRightUp[1] += 125;
- eggsRightUp[2] = 18; eggsRightUp[2] <<= 8; eggsRightUp[2] += 120;
- eggsRightUp[3] = 20; eggsRightUp[3] <<= 8; eggsRightUp[3] += 115;
- eggsRightUp[4] = 22; eggsRightUp[4] <<= 8; eggsRightUp[4] += 110;
- eggsRightUp[5] = 24; eggsRightUp[5] <<= 8; eggsRightUp[5] += 105;
- eggsRightUp[6] = 0;
- eggsRightDown[1] = 36; eggsRightDown[1] <<= 8; eggsRightDown[1] += 125;
- eggsRightDown[2] = 38; eggsRightDown[2] <<= 8; eggsRightDown[2] += 120;
- eggsRightDown[3] = 40; eggsRightDown[3] <<= 8; eggsRightDown[3] += 115;
- eggsRightDown[4] = 42; eggsRightDown[4] <<= 8; eggsRightDown[4] += 110;
- eggsRightDown[5] = 44; eggsRightDown[5] <<= 8; eggsRightDown[5] += 105;
- eggsRightDown[6] = 0;
- myOLED.begin(); // Инициируем работу с дисплеем
- myOLED.invScr(true); // Инвертируем цвет дисплея
- myOLED.bgImage(false); // В дальнейшем выводить изображения без фона
- while(!Serial){} // Ждём готовность Serial к передаче данных в монитор последовательного порта
- Serial.begin(9600); // Открываем последовательный порт, устанавливает скорость 9600 бит/c
- randomSeed(analogRead(0)); // Инициализируем генератор псевдослучайных чисел и выбираем считывание с аналогового входа
- eventStartGame = 1; // Разрешаем начало игры
- }
- void loop() {
- butt1.tick(); // Опрос кнопки butt1 (обязательная функция отработки, должна постоянно опрашиваться)
- butt2.tick(); // Опрос кнопки butt2 (обязательная функция отработки, должна постоянно опрашиваться)
- butt3.tick(); // Опрос кнопки butt3 (обязательная функция отработки, должна постоянно опрашиваться)
- butt4.tick(); // Опрос кнопки butt4 (обязательная функция отработки, должна постоянно опрашиваться)
- if (eventStartGame) // Если игра разрешена, то настраиваем начальные параметры
- {
- myOLED.autoUpdate(false); // Запрещаем автоматический вывод данных. Информация на дисплее будет обновляться только после обращения к функции update()
- StartScreen(); // Показываем заставку
- StartWolf(); // Выводим начальное положение волка
- ShowScore(); // Выводим очки
- Location(); // Прорисовываем локацию
- GenerationEggs(); // Генерируем начальную линию с которой будет скатываться яйцо
- eventStartGame = 0; // Запрещаем начало игры
- }
- WolfMove(); // Изменяем положение волка
- LevelComplicate(); // Выбираем уровня сложности
- if (millis()-Tm>500) // Функция будет работать каждые 500 мс
- {
- Tm = millis(); // Сохраняем значение millis()
- eventEggs = 1; // Приравниваем переменную события к единице
- MassEggs[1] <<= 1; // Постоянно сдвигаем бит в элементе массива слева сверху
- MassEggs[2] <<= 1; // Постоянно сдвигаем бит в элементе массива слева снизу
- MassEggs[3] <<= 1; // Постоянно сдвигаем бит в элементе массива справа сверху
- MassEggs[4] <<= 1; // Постоянно сдвигаем бит в элементе массива справа снизу
- if (eventGenerationEggs) // Разрешаем генерацию нового яйца
- {
- GenerationEggs(); // Функция генерации яйца
- eventGenerationEggs = 0; // Если сгенерировалось яйцо, запрещаем событие
- }
- }
- Move(); // Отрисовываем движение яиц
- if (eventEggs) {myOLED.update(); eventEggs = 0;} // Выводим на экран, если яйцо скатилось вниз на один шаг
- if (eventWolf) {myOLED.update(); eventWolf = 0;} // Выводим на экран, если изменилось положение волка
- }
- void Move() // Функция отрисовки движения яиц
- {
- EggMoveLeftUp(); // Функция движение и отрисовки яйца по линии слева сверху
- EggMoveLeftDown(); // Функция движение и отрисовки яйца по линии слева снизу
- EggMoveRightUp(); // Функция движение и отрисовки яйца по линии справа сверху
- EggMoveRightDown(); // Функция движение и отрисовки яйца по линии справа снизу
- }
- void GenerationEggs() // Функция генерации яиц
- {
- do{s=random(1, 5);} // Сравниваем предыдущее значение и новое сгенерированное
- while(s==eggsPosition); // Выполняем цикл пока оба значение равны друг другу
- eggsPosition = s; // Присваиваем новое значение
- switch (eggsPosition) // Выбираем позицию яйца
- {
- case 1: // Позиция яйца слева сверху
- MassEggs[1] |= 1; // Задаем новое яйцо слева сверху
- break; // Выходим из оператора case
- case 2: // Позиция яйца слева снизу
- MassEggs[2] |= 1; // Задаем новое яйцо слева снизу
- break; // Выходим из оператора case
- case 3: // Позиция яйца справа сверху
- MassEggs[3] |= 1; // Задаем новое яйцо справа сверху
- break; // Выходим из оператора case
- case 4: // Позиция яйца справа снизу
- MassEggs[4] |= 1; // Задаем новое яйцо справа снизу
- break; // Выходим из оператора case
- }
- }
- void EggMoveLeftUp() // Функция движение и отрисовки яйца по линии слева сверху
- {
- if (bitRead(MassEggs[1],quantityScore)){eventGenerationEggs = 1;} // Разрешаем генерацию нового яйца в зависимости от уровня сложности
- if (bitRead(MassEggs[1],6)){CatcheLeftUp();} // Проверяем поймал волк яйцо
- for (int i = 1; i <= 5; i++) // Отрисовываем новый массив с помощью цикла
- {
- if (bitRead(MassEggs[1],i)) // Если бит равен единице, то выводим положение яйца на экране
- {
- myOLED.drawCircle(lowByte(eggsLeftUp[i-1]),highByte(eggsLeftUp[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
- myOLED.drawCircle(lowByte(eggsLeftUp[i]), highByte(eggsLeftUp[i]), 3,false,1);// Выводим на экран положение яйца в соответствии с координатами
- }
- }
- }
- void EggMoveLeftDown() // Функция движение и отрисовки яйца по линии слева снизу
- {
- if (bitRead(MassEggs[2],quantityScore)){eventGenerationEggs = 1;} // Разрешаем генерацию нового яйца в зависимости от уровня сложности
- if (bitRead(MassEggs[2],6)){CatcheLeftDown();} // Проверяем поймал волк яйцо
- for (int i = 1; i <= 5; i++) // Отрисовываем новый массив с помощью цикла
- {
- if (bitRead(MassEggs[2],i)) // Если бит равен единице, то выводим положение яйца на экране
- {
- myOLED.drawCircle(lowByte(eggsLeftDown[i-1]),highByte(eggsLeftDown[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
- myOLED.drawCircle(lowByte(eggsLeftDown[i]), highByte(eggsLeftDown[i]), 3,false,1);// Выводим на экран положение яйца в соответствии с координатами
- }
- }
- }
- void EggMoveRightUp() // Функция движение и отрисовки яйца по линии справа сверху
- {
- if (bitRead(MassEggs[3],quantityScore)){eventGenerationEggs = 1;} // Разрешаем генерацию нового яйца в зависимости от уровня сложности
- if (bitRead(MassEggs[3],6)){CatcheRightUp();} // Проверяем поймал волк яйцо
- for (int i = 1; i <= 5; i++) // Отрисовываем новый массив с помощью цикла
- {
- if (bitRead(MassEggs[3],i)) // Если бит равен единице, то выводим положение яйца на экране
- {
- myOLED.drawCircle(lowByte(eggsRightUp[i-1]),highByte(eggsRightUp[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
- myOLED.drawCircle(lowByte(eggsRightUp[i]), highByte(eggsRightUp[i]), 3,false,1);// Выводим на экран положение яйца в соответствии с координатами
- }
- }
- }
- void EggMoveRightDown() // Функция движение и отрисовки яйца по линии справа сверху
- {
- if (bitRead(MassEggs[4],quantityScore)){eventGenerationEggs = 1;} // Разрешаем генерацию нового яйца в зависимости от уровня сложности
- if (bitRead(MassEggs[4],6)){CatcheRightDown();} // Проверяем поймал волк яйцо
- for (int i = 1; i <= 5; i++) // Отрисовываем новый массив с помощью цикла
- {
- if (bitRead(MassEggs[4],i)) // Если бит равен единице, то выводим положение яйца на экране
- {
- myOLED.drawCircle(lowByte(eggsRightDown[i-1]),highByte(eggsRightDown[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
- myOLED.drawCircle(lowByte(eggsRightDown[i]), highByte(eggsRightDown[i]), 3,false,1);// Выводим на экран положение яйца в соответствии с координатами
- }
- }
- }
- void LevelComplicate() { // Функция выбора уровня сложности
- if (!score) {quantityScore = levelComplicate1;} // Если счет равен 0, то уровень сложности 1
- if (score == 15) {quantityScore = levelComplicate2;} // Если счет равен 15, то уровень сложности 2
- if (score == 30){quantityScore = levelComplicate3;} // Если счет равен 30, то уровень сложности 3
- if (score == 50){quantityScore = levelComplicate4;} // Если счет равен 50, то уровень сложности 4
- }
- void EggsToCatch() { // Функция когда яйцо поймано
- score++; // Увеличиваем количество очков
- ShowScore(); // Выводим счет
- playEggCaughtSound(); // Проигрываем звук пойманного яйца
- }
- void EggsToBroken() { // Функция когда яйцо разбилось
- brokegg++; // Увеличиваем количество разбившихся яиц
- ShowScore(); // Выводим счет
- playEggBrokenSound(); // Проигрываем звук разбившегося яйца
- if (brokegg == 3) { // Если разбившихся яиц 3
- GameOver(); // Завершение игры
- }
- else { // Иначе
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место положения волка
- myOLED.drawRect(24, 52, 47, 63, true, 0); // Очищаем место положения разбившегося яйца слева
- myOLED.drawRect(87, 52, 110, 63, true, 0); // Очищаем место положения разбившегося яйца справа
- StartWolf(); // Функция вывода начального положения волка
- }
- }
- void CatcheLeftUp() { // Функция проверки пойманного яйца слева сверху
- if (bitRead(MassWolfPosition,1) && bitRead(MassEggs[1],6)) { // Положение волка должно совпадать с положением яйца
- bitClear(MassEggs[1],6); // Очищаем бит положения яйца
- myOLED.drawCircle (22, 24, 3, false, 0); // Очищаем последнее положение яйца
- EggsToCatch(); // Если яйцо поймано, то переходим к функции когда яйцо поймано
- }
- else { // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
- myOLED.autoUpdate(true); // Разрешаем автоматический вывод данных
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения волка
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM); // Выводим на экран картинку поднятых рук
- myOLED.drawImage(WolfLeft, 46, 64, IMG_ROM); // Выводим на экран волка направленного в сторону разбившегося яйца
- myOLED.drawCircle (22, 24, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (32, 31, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (32, 31, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (32, 41, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (32, 41, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (32, 51, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (32, 51, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawImage(EggBroken, 24, 63, IMG_ROM); // Выводим картинку разбившегося яйца
- EggsToBroken(); // Переходим к функции когда яйцо разбилось
- }
- }
- void CatcheLeftDown() { // Функция проверки пойманного яйца слева снизу
- if (bitRead(MassWolfPosition,2) && bitRead(MassEggs[2],6)) { // Положение волка должно совпадать с положением яйца
- bitClear(MassEggs[2],6); // Очищаем бит положения яйца
- myOLED.drawCircle (22, 44, 3, false, 0); // Очищаем последнее положение яйца
- EggsToCatch(); // Если яйцо поймано, то переходим к функции когда яйцо поймано
- }
- else { // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
- myOLED.autoUpdate(true); // Разрешаем автоматический вывод данных
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения волка
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM); // Выводим на экран картинку руки подняты вверх
- myOLED.drawImage(WolfLeft, 46, 64, IMG_ROM); // Выводим на экран волка направленного в сторону разбившегося яйца
- myOLED.drawCircle (22, 44, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (32, 51, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (32, 51, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawImage(EggBroken, 24, 63, IMG_ROM); // Выводим картинку разбившегося яйца
- EggsToBroken(); // Переходим к функции когда яйцо разбилось
- }
- }
- void CatcheRightUp() { // Функция проверки пойманного яйца справа сверху
- if (bitRead(MassWolfPosition,3) && bitRead(MassEggs[3],6)) { // Положение волка должно совпадать с положением яйца
- bitClear(MassEggs[3],6); // Очищаем бит положения яйца
- myOLED.drawCircle (105, 24, 3, false, 0); // Очищаем последнее положение яйца
- EggsToCatch(); // Если яйцо поймано, то переходим к функции когда яйцо поймано
- }
- else { // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
- myOLED.autoUpdate(true); // Разрешаем автоматический вывод данных
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения волка
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM); // Выводим на экран картинку поднятых рук
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM); // Выводим на экран волка направленного в сторону разбившегося яйца
- myOLED.drawCircle (105, 24, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (95, 31, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (95, 31, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (95, 41, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (95, 41, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (95, 51, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (95, 51, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawImage(EggBroken, 87, 63, IMG_ROM); // Выводим картинку разбившегося яйца
- EggsToBroken(); // Переходим к функции когда яйцо разбилось
- }
- }
- void CatcheRightDown() { // Функция проверки пойманного яйца справа снизу
- if (bitRead(MassWolfPosition,4) && bitRead(MassEggs[4],6)) { // Положение волка должно совпадать с положением яйца
- bitClear(MassEggs[4],6); // Очищаем бит положения яйца
- myOLED.drawCircle (105, 44, 3, false, 0); // Очищаем последнее положение яйца
- EggsToCatch(); // Если яйцо поймано, то переходим к функции когда яйцо поймано
- }
- else { // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
- myOLED.autoUpdate(true); // Разрешаем автоматический вывод данных
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения волка
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM); // Выводим на экран картинку поднятых рук
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM); // Выводим на экран волка направленного в сторону разбившегося яйца
- myOLED.drawCircle (105, 44, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawCircle (95, 51, 3, false, 1); // Двигаем яйцо вниз
- delay(450); // Задержка 450 мс
- myOLED.drawCircle (95, 51, 3, false, 0); // Очищаем последнее положение яйца
- myOLED.drawImage(EggBroken, 87, 63, IMG_ROM); // Выводим картинку разбившегося яйца
- EggsToBroken(); // Переходим к функции когда яйцо разбилось
- }
- }
- void WolfMove() { // Функция движения волка
- previousWolf = MassWolfPosition; // Запоминаем последнее положение волка
- if (butt1.isPress()) { // Если нажата кнопка влево - вверх. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt1.setDebounce(50);)
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfLeft, 46, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandLeftUp, 27, 43, IMG_ROM); // Выводим на экран новое положение корзинки
- MassWolfPosition = 0; // Очищаем переменную позиций
- bitSet(MassWolfPosition,1); // Устанавливаем бит нового положения волка
- playClickSound(); // Проигрываем звук нажатия на кнопку
- }
- if (butt2.isPress()) { // Если нажата кнопка влево - вниз. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt2.setDebounce(50);)
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfLeft, 46, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandLeftDown, 27, 64, IMG_ROM); // Выводим на экран новое положение корзинки
- MassWolfPosition = 0; // Очищаем переменную позиций
- bitSet(MassWolfPosition,2); // Устанавливаем бит нового положения волка
- playClickSound(); // Проигрываем звук нажатия на кнопку
- }
- if (butt3.isPress()) { // Если нажата кнопка вправо - вверх. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt3.setDebounce(50);)
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandRightUp, 72, 43, IMG_ROM); // Выводим на экран новое положение корзинки
- MassWolfPosition = 0; // Очищаем переменную позиций
- bitSet(MassWolfPosition,3); // Устанавливаем бит нового положения волка
- playClickSound(); // Проигрываем звук нажатия на кнопку
- }
- if (butt4.isPress()) { // Если нажата кнопка вправо - вниз. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt4.setDebounce(50);)
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandRightDown, 72, 64, IMG_ROM); // Выводим на экран новое положение корзинки
- MassWolfPosition = 0; // Очищаем переменную позиций
- bitSet(MassWolfPosition,4); // Устанавливаем бит нового положения волка
- playClickSound(); // Проигрываем звук нажатия на кнопку
- }
- if (previousWolf != MassWolfPosition) {eventWolf = 1;} // Если волк изменил свое положение присваиваем переменной события единицу
- }
- void StartWolf() { // Функция вывода начального положения волка
- wolfPositionStart = random(1, 5); // Генерируем случайное положение для волка
- switch (wolfPositionStart) // В зависимости от положения волка, выводим соответствующий рисунок
- {
- case 1: // Положение слева вверх
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfLeft, 46, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandLeftUp, 27, 43, IMG_ROM); // Выводим на экран новое положение корзинки
- bitSet(MassWolfPosition,1); // Устанавливаем бит нового положения волка
- break; // Выходим из оператора case
- case 2: // Положение слева вниз
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfLeft, 46, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandLeftDown, 27, 64, IMG_ROM); // Выводим на экран новое положение корзинки
- bitSet(MassWolfPosition,2); // Устанавливаем бит нового положения волка
- break; // Выходим из оператора case
- case 3: // Положение справа вверх
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandRightUp, 72, 43, IMG_ROM); // Выводим на экран новое положение корзинки
- bitSet(MassWolfPosition,3); // Устанавливаем бит нового положения волка
- break; // Выходим из оператора case
- case 4: // Положение справа вниз
- myOLED.drawRect(27, 16, 100, 64, true, 0); // Очищаем место изменения положения волка и корзинки
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM); // Выводим на экран новое положение волка
- myOLED.drawImage(HandRightDown, 72, 64, IMG_ROM); // Выводим на экран новое положение корзинки
- bitSet(MassWolfPosition,4); // Устанавливаем бит нового положения волка
- break; // Выходим из оператора case
- }
- }
- void Location() { // Функция прорисивки локации
- myOLED.drawLine (0, 20, 24, 29, 1); // Выводим на экран полочку для яиц слева сверху
- myOLED.drawLine (0, 21, 24, 30, 1);
- myOLED.drawLine (0, 22, 24, 31, 1);
- myOLED.drawLine (0, 40, 24, 49, 1); // Выводим на экран полочку для яиц слева снизу
- myOLED.drawLine (0, 41, 24, 50, 1);
- myOLED.drawLine (0, 42, 24, 51, 1);
- myOLED.drawLine (103, 29, 127, 20, 1); // Выводим на экран полочку для яиц справа сверху
- myOLED.drawLine (103, 30, 127, 21, 1);
- myOLED.drawLine (103, 31, 127, 22, 1);
- myOLED.drawLine (103, 49, 127, 40, 1); // Выводим на экран полочку для яиц справа снизу
- myOLED.drawLine (103, 50, 127, 41, 1);
- myOLED.drawLine (103, 51, 127, 42, 1);
- }
- void ShowScore() { // Функция вывода очков
- myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста
- myOLED.drawCircle(21, 6, 3, false, 1); // Выводим круг с центром в точке 21х6 и радиусом 3
- myOLED.print(F("-"), 28, 10); // Выводим тире 28 столбца 10 строки
- myOLED.print(score, 36, 10); // Выводим количество очков 36 столбца 10 строки
- myOLED.drawImage(EggBroken, 73, 12, IMG_ROM); // Выводим картинку разбившегося яйца 73 столбца 12 строки
- myOLED.print(F("-"), 97, 10); // Выводим тире 97 столбца 10 строки
- myOLED.print(brokegg, 105, 10); // Выводим количество разбившихся яиц 105 столбца 10 строки
- myOLED.update(); // Разрешаем автоматический вывод данных
- }
- void GameOver() { // Функция завершения игры
- MassEggs[1] = 0; // Очищаем элемент массива слева сверху
- MassEggs[2] = 0; // Очищаем элемент массива слева снизу
- MassEggs[3] = 0; // Очищаем элемент массива справа сверху
- MassEggs[4] = 0; // Очищаем элемент массива справа снизу
- eventGenerationEggs = 0; // Переменная события для генерации чисел
- MassWolfPosition = 0; // Переменная положения волка
- eventWolf = 0; // Переменная события для волка
- previousWolf = 0; // Переменная предыдущего положения волка
- wolfPositionStart = 0; // Переменная начального положения волка
- eggsPosition = 0; // Переменная положения яйца
- timeEggs = 0; // Переменная времени передвижения яиц
- eventEggs = 0; // Переменная события для яиц
- s = 0; // Дополнительная переменная для генерации чисел
- quantityScore = 0; // Количество очков
- if (score > EEPROM.get(0, record)) { // Если счёт больше рекорда записанного в энергонезависимой памяти
- record = constrain(record, 0, 255); // Ограничили
- EEPROM.put(0, score); // Записываем в энергонезависимую память новый рекорд по адресу 0
- }
- myOLED.clrScr(); // Чистим экран
- myOLED.setFont(SmallFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста
- myOLED.print(F("Игра окончена"), OLED_C, 25); // Выводим текст по центру 25 строки
- myOLED.print(F("Очки - "), 35, 40); // Выводим текст 35 столбца 40 строки
- myOLED.print(score, 80, 40); // Выводим количество очков 80 столбца 40 строки
- myOLED.print(F("Рекорд - "), 30, 55); // Выводим текст 30 столбца 55 строки
- myOLED.print(record, 84, 55); // Выводим рекорд 84 столбца 55 строки
- myOLED.update(); // Разрешаем автоматический вывод данных
- playGameOverSound(); // Проигрываем звук завершения игры
- delay(3000); // Задержка 3 секунды
- myOLED.clrScr(); // Чистим экран
- if (score >= 60) { // Если счёт больше или равен 60
- Film(); // Показываем анимацию
- myOLED.clrScr(); // Чистим экран
- }
- score = 0; // Обнуляем очки
- brokegg = 0; // Обнуляем разбившиеся яйца
- eventStartGame = 1; // Разрешаем начало игры
- }
- void StartScreen() { // Функция вывода заставки игры
- myOLED.drawRect (0, 0, 127, 63, false, 1); // Прорисовываем рамку игрового поля
- myOLED.setFont(MediumFontRus); // Указываем шрифт который требуется использовать для вывода цифр и текста
- myOLED.print(F("НУ,ПОГОДИ!"), OLED_C, 40); // Выводим текст по центру 40 строки
- myOLED.update(); // Разрешаем автоматический вывод данных
- delay(3000); // Задержка 3 секунды
- myOLED.clrScr(); // Чистим экран
- myOLED.drawRect (0, 0, 127, 63, false, 1); // Прорисовываем рамку игрового поля
- myOLED.print(F("От"), OLED_C, 25); // Выводим текст по центру 25 строки
- myOLED.print(F("AlexBus"), OLED_C, 50); // Выводим текст по центру 50 строки
- myOLED.update(); // Разрешаем автоматический вывод данных
- delay (3000); // Задержка 3 секунды
- myOLED.clrScr(); // Чистим экран
- }
- void playClickSound() { // Звук нажатия на кнопку
- for (int i = 1200; i > 250; i--) {
- tone(spkPin, i, 1);
- }
- noTone(spkPin);
- }
- void playEggCaughtSound() { // Звук пойманного яйца
- for(int i = 1000; i > 900; i--) {
- tone(spkPin, i, 0.1);
- }
- noTone(spkPin);
- }
- void playEggBrokenSound() { // Звук разбившегося яйца
- for (int i = 0; i < 1000; i++) {
- tone(spkPin, random(2000, 10000), 0.25);
- }
- noTone(spkPin);
- }
- void playGameOverSound() { // Звук завершения игры
- for (int i = 0; i < 2000; i++) {
- tone(spkPin, random(2000, 10000), 0.25);
- }
- noTone(spkPin);
- }
- void Film() { // Анимация
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
- delay(450);
- myOLED.drawRect(27, 16, 100, 64, true, 0);
- myOLED.drawImage(HandScare, 40, 44, IMG_ROM);
- myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
- }
Advertisement
Add Comment
Please, Sign In to add comment