mashlukashova

Untitled

Jun 12th, 2021
1,023
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iarduino_OLED.h>                                                            // Биб-ка для работы с OLED дисплеем
  2. iarduino_OLED myOLED(0x3C);                                                           // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C или 0x3D
  3. extern uint8_t MediumFontRus[];                                                       // Подключаем шрифт MediumFontRus
  4. extern uint8_t SmallFontRus[];                                                        // Подключаем шрифт SmallFontRus
  5.  
  6. const uint8_t HandScare[] PROGMEM = { 44, 16,
  7.   0xc0, 0x58, 0x7c, 0xc4, 0x8c, 0x1f, 0x31, 0x31, 0x07, 0x0c, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00,
  8.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  9.   0x00, 0xc0, 0x70, 0x10, 0x18, 0x88, 0x88, 0x88, 0xf8, 0x40, 0xc0, 0x00, 0x01, 0x03, 0x02, 0x06,
  10.   0x04, 0x04, 0x0c, 0x08, 0x18, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  11.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
  12.   0xc0, 0x40, 0x40, 0x48, 0x4a, 0x6a, 0x2b, 0x3e
  13. };
  14.  
  15. const uint8_t EggBroken[] PROGMEM = { 23, 16,                                         // Разбитое яйцо
  16. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0x80, 0x80, 0xE0, 0x70, 0x00, 0x80,
  17. 0x80, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x0B, 0x1F, 0x0E,
  18. 0x00, 0x24, 0x36, 0x7F, 0x6F, 0x39, 0x31, 0x53, 0x6F, 0x3B, 0x21, 0x00, 0x0C, 0x3E,
  19. 0x34, 0x1C, 0x00, 0x00};
  20.  
  21. const uint8_t HandLeftUp[] PROGMEM = { 27, 24,                                        // Рука слева вверху
  22. 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFC, 0x0E, 0x06, 0x3E, 0xEE, 0x2C, 0xB8, 0x48, 0xC8,
  23. 0x88, 0x18, 0x70, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  24. 0x60, 0xE0, 0xF0, 0xFB, 0xFF, 0x9E, 0x18, 0x3C, 0x7D, 0x7F, 0xFC, 0xC4, 0x07, 0x0F,
  25. 0xFC, 0xF8, 0xF1, 0x47, 0xBC, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  26. 0x00, 0x03, 0x07, 0x0F, 0x1C, 0x11, 0x11, 0x12, 0x10, 0x10, 0x18, 0x08, 0x08, 0x08,
  27. 0x19, 0x13, 0x12, 0x04, 0x28, 0x08, 0x38, 0x70, 0x60, 0x40, 0x00};
  28.  
  29. const uint8_t HandLeftDown[] PROGMEM = { 26, 24,                                      // Рука слева внизу
  30. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xF0, 0x18, 0xC8, 0x08, 0xCC, 0x84, 0xE4,
  31. 0xC4, 0x74, 0x5C, 0x4C, 0x4E, 0x6E, 0xEE, 0xE6, 0x74, 0x34, 0x10, 0x00, 0x00, 0xC0,
  32. 0xE0, 0xE0, 0xF0, 0xF0, 0xF0, 0xF5, 0xFF, 0xF1, 0xE1, 0xEF, 0xFE, 0xD4, 0xC0, 0xE0,
  33. 0x70, 0x3C, 0x0E, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0F, 0x0F,
  34. 0x3F, 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x7F, 0x3F, 0x3F, 0x3F, 0x1F, 0x0F, 0x00, 0x00,
  35. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  36.  
  37. const uint8_t HandRightUp[] PROGMEM = { 24, 24,                                       // Рука справа вверху
  38. 0x00, 0x40, 0xC0, 0xE0, 0xE0, 0xB0, 0x90, 0x18, 0x08, 0x6C, 0xC4, 0xFC, 0x2C, 0x26,
  39. 0xFE, 0x0E, 0x3C, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  40. 0x00, 0x00, 0x61, 0xF1, 0xFA, 0xFA, 0xFF, 0x3F, 0x1D, 0x3D, 0xFF, 0xFC, 0x7C, 0x3F,
  41. 0x3F, 0xFC, 0xFC, 0xFC, 0x78, 0x00, 0x00, 0x40, 0x60, 0x60, 0x70, 0x70, 0x70, 0x49,
  42. 0x4B, 0x6F, 0x67, 0x67, 0x60, 0x60, 0x61, 0x21, 0x20, 0x2A, 0x29, 0x1C, 0x07, 0x01,
  43. 0x00, 0x00};
  44.  
  45. const uint8_t HandRightDown[] PROGMEM = { 29, 24,                                     // Рука справа внизу
  46. 0x00, 0x00, 0xCC, 0x9C, 0x9C, 0x3C, 0x28, 0x68, 0xC8, 0x8C, 0x0C, 0x04, 0x46, 0xE6,
  47. 0xEC, 0x7C, 0x4C, 0xDC, 0x7C, 0x38, 0xF0, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
  48. 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x3F, 0x76, 0xE4, 0x84, 0x19, 0x11, 0x33, 0x37,
  49. 0x3F, 0x1F, 0x19, 0xDF, 0xDF, 0x78, 0x78, 0xF8, 0xFF, 0xFF, 0xF8, 0xF8, 0xF8, 0xF8,
  50. 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0F, 0x1E, 0x18,
  51. 0x30, 0x30, 0x20, 0x68, 0x6A, 0x7A, 0x3B, 0x3D, 0x3F, 0x1F, 0x1F, 0x0F, 0x07, 0x03,
  52. 0x00, 0x00, 0x00};
  53.  
  54. const uint8_t WolfLeft[] PROGMEM = { 29, 39,                                          // Волк влево
  55. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdc, 0xb4, 0xe6, 0xf3,
  56.   0xd1, 0xd1, 0x31, 0xe1, 0x01, 0x01, 0x07, 0x04, 0x0c, 0x78, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
  57.   0x00, 0x80, 0xf0, 0x1c, 0x87, 0xf1, 0x19, 0x0f, 0x01, 0x81, 0x01, 0x00, 0x00, 0x81, 0xc1, 0x61,
  58.   0x31, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00,
  59.   0x3c, 0x37, 0x10, 0x10, 0x18, 0x08, 0x0c, 0x06, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  60.   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x38, 0x2c, 0x67, 0xc9, 0x9c, 0x9c, 0xbc, 0x3c, 0x3c,
  61.   0x7c, 0x7c, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, 0x3f, 0x3f, 0x03, 0x00, 0x00,
  62.   0xfe, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x40, 0x41, 0x41, 0x01, 0x01, 0x01, 0x01,
  63.   0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x7e, 0x42, 0x42, 0x42, 0x42, 0x03, 0x01, 0x00, 0x00,
  64.   0x00};
  65.  
  66. const uint8_t WolfRight[] PROGMEM = { 31, 41,
  67.   0x00, 0x00, 0x00, 0x80, 0xf0, 0x18, 0x08, 0x0e, 0x02, 0x02, 0xc2, 0x62, 0xa2, 0xa2, 0xe6, 0xcc,
  68.   0x68, 0xb8, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69.   0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x38, 0xe0, 0x81, 0x02, 0x03, 0x03, 0x01, 0x01, 0x03,
  70.   0x03, 0x03, 0x0e, 0x3a, 0xe2, 0x8e, 0x38, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f,
  71.   0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0e, 0x08, 0x18, 0x30, 0x60, 0x41,
  72.   0xc0, 0x80, 0x80, 0xc0, 0x7f, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
  73.   0x06, 0xfc, 0x04, 0x04, 0x06, 0x7e, 0x7e, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
  74.   0xf8, 0xf8, 0x78, 0x78, 0x78, 0x38, 0x38, 0x93, 0xce, 0x58, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
  75.   0x03, 0x06, 0x84, 0x84, 0x84, 0x84, 0xfc, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x02, 0x02,
  76.   0x02, 0x02, 0x82, 0x83, 0x81, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  77.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  78.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  79. };
  80.  
  81.  
  82. void StartScreen();                                                                   // Функция заставки игры
  83. void WolfMove();                                                                      // Функция движения волка
  84. void StartWolf();                                                                     // Функция вывода начального положения волка
  85. void EggMoveLeftUp();                                                                 // Функция движения яйца слева сверху
  86. void EggMoveLeftDown();                                                               // Функция движения яйца слева снизу
  87. void EggMoveRightUp();                                                                // Функция движения яйца справа сверху
  88. void EggMoveRightDown();                                                              // Функция движения яйца справа снизу
  89. void CatcheLeftUp();                                                                  // Функция проверки пойманного яйца слева сверху
  90. void CatcheLeftDown();                                                                // Функция проверки пойманного яйца слева снизу
  91. void CatcheRightUp();                                                                 // Функция проверки пойманного яйца справа сверху
  92. void CatcheRightDown();                                                               // Функция проверки пойманного яйца справа снизу
  93. void GenerationEggs();                                                                // Функция генерации яиц
  94. void EggsToCatch();                                                                   // Функция проверки пойманного яйца
  95. void Location();                                                                      // Функция прорисовки локации
  96. void ShowScore();                                                                     // Функция вывода очков
  97. void LevelComplicate();                                                               // Функция уровня сложности
  98. void GameOver();                                                                      // Функция завершения игры
  99. void Move();                                                                          // Функция отрисовки движения яиц
  100. int MassEggs[5];                                                                      // Массив в котором каждая переменная соответствует линии, с которой скатывается яйцо
  101. int MassWolfPosition;                                                                 // Переменная положения волка
  102. int eventWolf;                                                                        // Переменная события для волка
  103. int previousWolf;                                                                     // Переменная предыдущего положения волка
  104. int wolfPositionStart;                                                                // Переменная начального положения волка
  105. int eggsPosition;                                                                     // Переменная положения яйца
  106. int timeEggs;                                                                         // Переменная времени передвижения яиц
  107. int eventEggs;                                                                        // Переменная события для яиц
  108. int score;                                                                            // Переменная очков
  109. int s;                                                                                // Дополнительная переменная для генерации чисел
  110. int eventGenerationEggs;                                                              // Переменная события для генерации чисел
  111. int quantityScore;                                                                    // Количество очков
  112. const int levelComplicate1 = 6;                                                       // Константа уровня сложности 1
  113. const int levelComplicate2 = 3;                                                       // Константа уровня сложности 2
  114. const int levelComplicate3 = 2;                                                       // Константа уровня сложности 3
  115. const int levelComplicate4 = 1;                                                       // Константа уровня сложности 4
  116. int eggsLeftUp[7];                                                                    // Массив вывода картинки яйца на линию слева сверху
  117. int eggsLeftDown[7];                                                                  // Массив вывода картинки яйца на линию слева снизу
  118. int eggsRightUp[7];                                                                   // Массив вывода картинки яйца на линию справа сверху
  119. int eggsRightDown[7];                                                                 // Массив вывода картинки яйца на линию справа снизу
  120. uint32_t Tm;                                                                          // Переменная времени
  121. int eventStartGame;                                                                   // Переменная события для запуска игры
  122. #include "GyverButton.h"                                                              // Биб-ка для отработки нажатия кнопок
  123. #define PINb1 6                                                                       // Кнопка - рука слева вверху (пин D6)
  124. #define PINb2 7                                                                       // Кнопка - рука слева внизу (пин D7)
  125. #define PINb3 4                                                                       // Кнопка - рука справа вверху (пин D4)
  126. #define PINb4 5                                                                       // Кнопка - рука справа внизу (пин D5)
  127. GButton butt1(PINb1);                                                                 // Создаём кнопку PINb1
  128. GButton butt2(PINb2);                                                                 // Создаём кнопку PINb2
  129. GButton butt3(PINb3);                                                                 // Создаём кнопку PINb3
  130. GButton butt4(PINb4);                                                                 // Создаём кнопку PINb4
  131. const uint8_t spkPin = 11;                                                            // Buzzer (пин D11)
  132. #define NOTE_C4 262
  133. #define NOTE_A4 440
  134. #define NOTE_F5 698
  135. int lose[] = { NOTE_F5, NOTE_A4, NOTE_C4 };                                           // Задаём ноты для мелодии
  136. int loseNoteDurations[] = { 2, 4, 4 };                                                // Задаём продолжительность нот
  137. #include <EEPROM.h>                                                                   // Биб-ка для работы с энергонезависимой памятью
  138. int record = 0;                                                                       // Переменная рекорда
  139. void EggsToBroken();                                                                  // Функция разбившегося яйца
  140. int brokegg;                                                                          // Переменная разбившихся яиц
  141.  
  142. void setup() {
  143.   eggsLeftUp[1]    = 16;  eggsLeftUp[1]    <<= 8;  eggsLeftUp[1]    += 2;             // Координаты вывода яйца в зависимости от шага
  144.   eggsLeftUp[2]    = 18;  eggsLeftUp[2]    <<= 8;  eggsLeftUp[2]    += 7;
  145.   eggsLeftUp[3]    = 20;  eggsLeftUp[3]    <<= 8;  eggsLeftUp[3]    += 12;
  146.   eggsLeftUp[4]    = 22;  eggsLeftUp[4]    <<= 8;  eggsLeftUp[4]    += 17;
  147.   eggsLeftUp[5]    = 24;  eggsLeftUp[5]    <<= 8;  eggsLeftUp[5]    += 22;
  148.   eggsLeftUp[6]    = 0;
  149.   eggsLeftDown[1]  = 36;  eggsLeftDown[1]  <<= 8;  eggsLeftDown[1]  += 2;
  150.   eggsLeftDown[2]  = 38;  eggsLeftDown[2]  <<= 8;  eggsLeftDown[2]  += 7;
  151.   eggsLeftDown[3]  = 40;  eggsLeftDown[3]  <<= 8;  eggsLeftDown[3]  += 12;
  152.   eggsLeftDown[4]  = 42;  eggsLeftDown[4]  <<= 8;  eggsLeftDown[4]  += 17;
  153.   eggsLeftDown[5]  = 44;  eggsLeftDown[5]  <<= 8;  eggsLeftDown[5]  += 22;
  154.   eggsLeftDown[6]  = 0;
  155.   eggsRightUp[1]   = 16;  eggsRightUp[1]   <<= 8;  eggsRightUp[1]   += 125;
  156.   eggsRightUp[2]   = 18;  eggsRightUp[2]   <<= 8;  eggsRightUp[2]   += 120;
  157.   eggsRightUp[3]   = 20;  eggsRightUp[3]   <<= 8;  eggsRightUp[3]   += 115;
  158.   eggsRightUp[4]   = 22;  eggsRightUp[4]   <<= 8;  eggsRightUp[4]   += 110;
  159.   eggsRightUp[5]   = 24;  eggsRightUp[5]   <<= 8;  eggsRightUp[5]   += 105;
  160.   eggsRightUp[6]   = 0;
  161.   eggsRightDown[1] = 36;  eggsRightDown[1] <<= 8;  eggsRightDown[1] += 125;
  162.   eggsRightDown[2] = 38;  eggsRightDown[2] <<= 8;  eggsRightDown[2] += 120;
  163.   eggsRightDown[3] = 40;  eggsRightDown[3] <<= 8;  eggsRightDown[3] += 115;
  164.   eggsRightDown[4] = 42;  eggsRightDown[4] <<= 8;  eggsRightDown[4] += 110;
  165.   eggsRightDown[5] = 44;  eggsRightDown[5] <<= 8;  eggsRightDown[5] += 105;
  166.   eggsRightDown[6] = 0;
  167.   myOLED.begin();                                                                     // Инициируем работу с дисплеем
  168.   myOLED.invScr(true);                                                                // Инвертируем цвет дисплея
  169.   myOLED.bgImage(false);                                                              // В дальнейшем выводить изображения без фона
  170.   while(!Serial){}                                                                    // Ждём готовность Serial к передаче данных в монитор последовательного порта
  171.   Serial.begin(9600);                                                                 // Открываем последовательный порт, устанавливает скорость 9600 бит/c
  172.   randomSeed(analogRead(0));                                                          // Инициализируем генератор псевдослучайных чисел и выбираем считывание с аналогового входа
  173.   eventStartGame = 1;                                                                 // Разрешаем начало игры
  174. }
  175.  
  176. void loop() {
  177.   butt1.tick();                                                                       // Опрос кнопки butt1 (обязательная функция отработки, должна постоянно опрашиваться)
  178.   butt2.tick();                                                                       // Опрос кнопки butt2 (обязательная функция отработки, должна постоянно опрашиваться)
  179.   butt3.tick();                                                                       // Опрос кнопки butt3 (обязательная функция отработки, должна постоянно опрашиваться)
  180.   butt4.tick();                                                                       // Опрос кнопки butt4 (обязательная функция отработки, должна постоянно опрашиваться)
  181.   if (eventStartGame)                                                                 // Если игра разрешена, то настраиваем начальные параметры
  182.   {
  183.     myOLED.autoUpdate(false);                                                         // Запрещаем автоматический вывод данных. Информация на дисплее будет обновляться только после обращения к функции update()
  184.     StartScreen();                                                                    // Показываем заставку
  185.     StartWolf();                                                                      // Выводим начальное положение волка
  186.     ShowScore();                                                                      // Выводим очки
  187.     Location();                                                                       // Прорисовываем локацию
  188.     GenerationEggs();                                                                 // Генерируем начальную линию с которой будет скатываться яйцо
  189.     eventStartGame = 0;                                                               // Запрещаем начало игры
  190.   }
  191.   WolfMove();                                                                         // Изменяем положение волка
  192.   LevelComplicate();                                                                  // Выбираем уровня сложности
  193.   if (millis()-Tm>500)                                                                // Функция будет работать каждые 500 мс
  194.   {
  195.     Tm  = millis();                                                                   // Сохраняем значение millis()
  196.     eventEggs = 1;                                                                    // Приравниваем переменную события к единице
  197.     MassEggs[1] <<= 1;                                                                // Постоянно сдвигаем бит в элементе массива слева сверху
  198.     MassEggs[2] <<= 1;                                                                // Постоянно сдвигаем бит в элементе массива слева снизу
  199.     MassEggs[3] <<= 1;                                                                // Постоянно сдвигаем бит в элементе массива справа сверху
  200.     MassEggs[4] <<= 1;                                                                // Постоянно сдвигаем бит в элементе массива справа снизу
  201.     if (eventGenerationEggs)                                                          // Разрешаем генерацию нового яйца
  202.     {
  203.       GenerationEggs();                                                               // Функция генерации яйца
  204.       eventGenerationEggs = 0;                                                        // Если сгенерировалось яйцо, запрещаем событие
  205.     }
  206.   }
  207.   Move();                                                                             // Отрисовываем движение яиц
  208.   if (eventEggs) {myOLED.update(); eventEggs = 0;}                                    // Выводим на экран, если яйцо скатилось вниз на один шаг
  209.   if (eventWolf) {myOLED.update(); eventWolf = 0;}                                    // Выводим на экран, если изменилось положение волка
  210. }
  211.  
  212. void Move()                                                                           // Функция отрисовки движения яиц
  213. {
  214.   EggMoveLeftUp();                                                                    // Функция движение и отрисовки яйца по линии слева сверху
  215.   EggMoveLeftDown();                                                                  // Функция движение и отрисовки яйца по линии слева снизу
  216.   EggMoveRightUp();                                                                   // Функция движение и отрисовки яйца по линии справа сверху
  217.   EggMoveRightDown();                                                                 // Функция движение и отрисовки яйца по линии справа снизу
  218. }
  219.  
  220. void GenerationEggs()                                                                 // Функция генерации яиц
  221. {
  222.   do{s=random(1, 5);}                                                                 // Сравниваем предыдущее значение и новое сгенерированное
  223.   while(s==eggsPosition);                                                             // Выполняем цикл пока оба значение равны друг другу
  224.   eggsPosition = s;                                                                   // Присваиваем новое значение
  225.   switch (eggsPosition)                                                               // Выбираем позицию яйца
  226.   {
  227.     case 1:                                                                           // Позиция яйца слева сверху
  228.     MassEggs[1] |= 1;                                                                 // Задаем новое яйцо слева сверху
  229.     break;                                                                            // Выходим из оператора case
  230.     case 2:                                                                           // Позиция яйца слева снизу
  231.     MassEggs[2] |= 1;                                                                 // Задаем новое яйцо слева снизу
  232.     break;                                                                            // Выходим из оператора case
  233.     case 3:                                                                           // Позиция яйца справа сверху
  234.     MassEggs[3] |= 1;                                                                 // Задаем новое яйцо справа сверху
  235.     break;                                                                            // Выходим из оператора case
  236.     case 4:                                                                           // Позиция яйца справа снизу
  237.     MassEggs[4] |= 1;                                                                 // Задаем новое яйцо справа снизу
  238.     break;                                                                            // Выходим из оператора case
  239.   }
  240. }
  241.  
  242. void EggMoveLeftUp()                                                                  // Функция движение и отрисовки яйца по линии слева сверху
  243. {
  244.   if (bitRead(MassEggs[1],quantityScore)){eventGenerationEggs = 1;}                   // Разрешаем генерацию нового яйца в зависимости от уровня сложности
  245.   if (bitRead(MassEggs[1],6)){CatcheLeftUp();}                                        // Проверяем поймал волк яйцо
  246.   for (int i = 1; i <= 5; i++)                                                        // Отрисовываем новый массив с помощью цикла
  247.   {
  248.     if (bitRead(MassEggs[1],i))                                                       // Если бит равен единице, то выводим положение яйца на экране
  249.     {
  250.       myOLED.drawCircle(lowByte(eggsLeftUp[i-1]),highByte(eggsLeftUp[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
  251.       myOLED.drawCircle(lowByte(eggsLeftUp[i]),  highByte(eggsLeftUp[i]),  3,false,1);// Выводим на экран положение яйца в соответствии с координатами
  252.     }
  253.   }
  254. }
  255.  
  256. void EggMoveLeftDown()                                                                // Функция движение и отрисовки яйца по линии слева снизу
  257. {
  258.   if (bitRead(MassEggs[2],quantityScore)){eventGenerationEggs = 1;}                   // Разрешаем генерацию нового яйца в зависимости от уровня сложности
  259.   if (bitRead(MassEggs[2],6)){CatcheLeftDown();}                                      // Проверяем поймал волк яйцо
  260.   for (int i = 1; i <= 5; i++)                                                        // Отрисовываем новый массив с помощью цикла
  261.   {
  262.     if (bitRead(MassEggs[2],i))                                                       // Если бит равен единице, то выводим положение яйца на экране
  263.     {
  264.       myOLED.drawCircle(lowByte(eggsLeftDown[i-1]),highByte(eggsLeftDown[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
  265.       myOLED.drawCircle(lowByte(eggsLeftDown[i]),  highByte(eggsLeftDown[i]),  3,false,1);// Выводим на экран положение яйца в соответствии с координатами
  266.     }
  267.   }
  268. }
  269.  
  270. void EggMoveRightUp()                                                                 // Функция движение и отрисовки яйца по линии справа сверху
  271. {
  272.   if (bitRead(MassEggs[3],quantityScore)){eventGenerationEggs = 1;}                   // Разрешаем генерацию нового яйца в зависимости от уровня сложности
  273.   if (bitRead(MassEggs[3],6)){CatcheRightUp();}                                       // Проверяем поймал волк яйцо
  274.   for (int i = 1; i <= 5; i++)                                                        // Отрисовываем новый массив с помощью цикла
  275.   {
  276.     if (bitRead(MassEggs[3],i))                                                       // Если бит равен единице, то выводим положение яйца на экране
  277.     {
  278.       myOLED.drawCircle(lowByte(eggsRightUp[i-1]),highByte(eggsRightUp[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
  279.       myOLED.drawCircle(lowByte(eggsRightUp[i]),  highByte(eggsRightUp[i]),  3,false,1);// Выводим на экран положение яйца в соответствии с координатами
  280.     }
  281.   }
  282. }
  283.  
  284. void EggMoveRightDown()                                                               // Функция движение и отрисовки яйца по линии справа сверху
  285. {
  286.   if (bitRead(MassEggs[4],quantityScore)){eventGenerationEggs = 1;}                   // Разрешаем генерацию нового яйца в зависимости от уровня сложности
  287.   if (bitRead(MassEggs[4],6)){CatcheRightDown();}                                     // Проверяем поймал волк яйцо
  288.   for (int i = 1; i <= 5; i++)                                                        // Отрисовываем новый массив с помощью цикла
  289.   {
  290.     if (bitRead(MassEggs[4],i))                                                       // Если бит равен единице, то выводим положение яйца на экране
  291.     {
  292.       myOLED.drawCircle(lowByte(eggsRightDown[i-1]),highByte(eggsRightDown[i-1]),3,false,0);// Гасим предыдущее положение яйца в соответствии с координатами
  293.       myOLED.drawCircle(lowByte(eggsRightDown[i]),  highByte(eggsRightDown[i]),  3,false,1);// Выводим на экран положение яйца в соответствии с координатами
  294.     }
  295.   }
  296. }
  297.  
  298. void LevelComplicate() {                                                              // Функция выбора уровня сложности
  299.   if (!score)     {quantityScore = levelComplicate1;}                                 // Если счет равен 0, то уровень сложности 1
  300.   if (score == 15) {quantityScore = levelComplicate2;}                                // Если счет равен 15, то уровень сложности 2
  301.   if (score == 30){quantityScore = levelComplicate3;}                                 // Если счет равен 30, то уровень сложности 3
  302.   if (score == 50){quantityScore = levelComplicate4;}                                 // Если счет равен 50, то уровень сложности 4
  303. }
  304.  
  305. void EggsToCatch() {                                                                  // Функция когда яйцо поймано
  306.   score++;                                                                            // Увеличиваем количество очков
  307.   ShowScore();                                                                        // Выводим счет
  308.   playEggCaughtSound();                                                               // Проигрываем звук пойманного яйца
  309. }
  310.  
  311. void EggsToBroken() {                                                                 // Функция когда яйцо разбилось
  312.   brokegg++;                                                                          // Увеличиваем количество разбившихся яиц
  313.   ShowScore();                                                                        // Выводим счет
  314.   playEggBrokenSound();                                                               // Проигрываем звук разбившегося яйца
  315.   if (brokegg == 3) {                                                                 // Если разбившихся яиц 3
  316.     GameOver();                                                                       // Завершение игры
  317.   }
  318.   else {                                                                              // Иначе
  319.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место положения волка
  320.     myOLED.drawRect(24, 52, 47, 63, true, 0);                                         // Очищаем место положения разбившегося яйца слева
  321.     myOLED.drawRect(87, 52, 110, 63, true, 0);                                        // Очищаем место положения разбившегося яйца справа
  322.     StartWolf();                                                                      // Функция вывода начального положения волка
  323.   }
  324. }
  325.  
  326. void CatcheLeftUp() {                                                                 // Функция проверки пойманного яйца слева сверху
  327.   if (bitRead(MassWolfPosition,1) && bitRead(MassEggs[1],6)) {                        // Положение волка должно совпадать с положением яйца
  328.     bitClear(MassEggs[1],6);                                                          // Очищаем бит положения яйца
  329.     myOLED.drawCircle (22, 24, 3, false, 0);                                          // Очищаем последнее положение яйца
  330.     EggsToCatch();                                                                    // Если яйцо поймано, то переходим к функции когда яйцо поймано
  331.   }
  332.   else {                                                                              // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
  333.     myOLED.autoUpdate(true);                                                          // Разрешаем автоматический вывод данных
  334.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения волка
  335.     myOLED.drawImage(HandScare,  40, 44, IMG_ROM);                                    // Выводим на экран картинку поднятых рук
  336.     myOLED.drawImage(WolfLeft,  46, 64, IMG_ROM);                                     // Выводим на экран волка направленного в сторону разбившегося яйца
  337.     myOLED.drawCircle (22, 24, 3, false, 0);                                          // Очищаем последнее положение яйца
  338.     myOLED.drawCircle (32, 31, 3, false, 1);                                          // Двигаем яйцо вниз
  339.     delay(450);                                                                       // Задержка 450 мс
  340.     myOLED.drawCircle (32, 31, 3, false, 0);                                          // Очищаем последнее положение яйца
  341.     myOLED.drawCircle (32, 41, 3, false, 1);                                          // Двигаем яйцо вниз
  342.     delay(450);                                                                       // Задержка 450 мс
  343.     myOLED.drawCircle (32, 41, 3, false, 0);                                          // Очищаем последнее положение яйца
  344.     myOLED.drawCircle (32, 51, 3, false, 1);                                          // Двигаем яйцо вниз
  345.     delay(450);                                                                       // Задержка 450 мс
  346.     myOLED.drawCircle (32, 51, 3, false, 0);                                          // Очищаем последнее положение яйца
  347.     myOLED.drawImage(EggBroken,  24, 63, IMG_ROM);                                    // Выводим картинку разбившегося яйца
  348.     EggsToBroken();                                                                   // Переходим к функции когда яйцо разбилось
  349.   }
  350. }
  351.  
  352. void CatcheLeftDown() {                                                               // Функция проверки пойманного яйца слева снизу
  353.   if (bitRead(MassWolfPosition,2) && bitRead(MassEggs[2],6)) {                        // Положение волка должно совпадать с положением яйца
  354.     bitClear(MassEggs[2],6);                                                          // Очищаем бит положения яйца
  355.     myOLED.drawCircle (22, 44, 3, false, 0);                                          // Очищаем последнее положение яйца
  356.     EggsToCatch();                                                                    // Если яйцо поймано, то переходим к функции когда яйцо поймано
  357.   }
  358.   else {                                                                              // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
  359.     myOLED.autoUpdate(true);                                                          // Разрешаем автоматический вывод данных
  360.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения волка
  361.     myOLED.drawImage(HandScare,  40, 44, IMG_ROM);                                    // Выводим на экран картинку руки подняты вверх
  362.     myOLED.drawImage(WolfLeft,  46, 64, IMG_ROM);                                     // Выводим на экран волка направленного в сторону разбившегося яйца
  363.     myOLED.drawCircle (22, 44, 3, false, 0);                                          // Очищаем последнее положение яйца
  364.     myOLED.drawCircle (32, 51, 3, false, 1);                                          // Двигаем яйцо вниз
  365.     delay(450);                                                                       // Задержка 450 мс
  366.     myOLED.drawCircle (32, 51, 3, false, 0);                                          // Очищаем последнее положение яйца
  367.     myOLED.drawImage(EggBroken,  24, 63, IMG_ROM);                                    // Выводим картинку разбившегося яйца
  368.     EggsToBroken();                                                                   // Переходим к функции когда яйцо разбилось
  369.   }
  370. }
  371.  
  372. void CatcheRightUp() {                                                                // Функция проверки пойманного яйца справа сверху
  373.   if (bitRead(MassWolfPosition,3) && bitRead(MassEggs[3],6)) {                        // Положение волка должно совпадать с положением яйца
  374.     bitClear(MassEggs[3],6);                                                          // Очищаем бит положения яйца
  375.     myOLED.drawCircle (105, 24, 3, false, 0);                                         // Очищаем последнее положение яйца
  376.     EggsToCatch();                                                                    // Если яйцо поймано, то переходим к функции когда яйцо поймано
  377.   }
  378.   else {                                                                              // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
  379.     myOLED.autoUpdate(true);                                                          // Разрешаем автоматический вывод данных
  380.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения волка
  381.     myOLED.drawImage(HandScare,  40, 44, IMG_ROM);                                    // Выводим на экран картинку поднятых рук
  382.     myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);                                     // Выводим на экран волка направленного в сторону разбившегося яйца
  383.     myOLED.drawCircle (105, 24, 3, false, 0);                                         // Очищаем последнее положение яйца
  384.     myOLED.drawCircle (95,  31, 3, false, 1);                                         // Двигаем яйцо вниз
  385.     delay(450);                                                                       // Задержка 450 мс
  386.     myOLED.drawCircle (95,  31, 3, false, 0);                                         // Очищаем последнее положение яйца
  387.     myOLED.drawCircle (95,  41, 3, false, 1);                                         // Двигаем яйцо вниз
  388.     delay(450);                                                                       // Задержка 450 мс
  389.     myOLED.drawCircle (95,  41, 3, false, 0);                                         // Очищаем последнее положение яйца
  390.     myOLED.drawCircle (95,  51, 3, false, 1);                                         // Двигаем яйцо вниз
  391.     delay(450);                                                                       // Задержка 450 мс
  392.     myOLED.drawCircle (95,  51, 3, false, 0);                                         // Очищаем последнее положение яйца
  393.     myOLED.drawImage(EggBroken,  87, 63, IMG_ROM);                                    // Выводим картинку разбившегося яйца
  394.     EggsToBroken();                                                                   // Переходим к функции когда яйцо разбилось
  395.   }
  396. }
  397.  
  398. void CatcheRightDown() {                                                              // Функция проверки пойманного яйца справа снизу
  399.   if (bitRead(MassWolfPosition,4) && bitRead(MassEggs[4],6)) {                        // Положение волка должно совпадать с положением яйца
  400.     bitClear(MassEggs[4],6);                                                          // Очищаем бит положения яйца
  401.     myOLED.drawCircle (105, 44, 3, false, 0);                                         // Очищаем последнее положение яйца
  402.     EggsToCatch();                                                                    // Если яйцо поймано, то переходим к функции когда яйцо поймано
  403.   }
  404.   else {                                                                              // Если яйцо не поймано, выводим анимацию проигрыша, количество очков и начинаем игру заново
  405.     myOLED.autoUpdate(true);                                                          // Разрешаем автоматический вывод данных
  406.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения волка
  407.     myOLED.drawImage(HandScare,  40, 44, IMG_ROM);                                    // Выводим на экран картинку поднятых рук
  408.     myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);                                     // Выводим на экран волка направленного в сторону разбившегося яйца
  409.     myOLED.drawCircle (105, 44, 3, false, 0);                                         // Очищаем последнее положение яйца
  410.     myOLED.drawCircle (95,  51, 3, false, 1);                                         // Двигаем яйцо вниз
  411.     delay(450);                                                                       // Задержка 450 мс
  412.     myOLED.drawCircle (95, 51, 3, false, 0);                                          // Очищаем последнее положение яйца
  413.     myOLED.drawImage(EggBroken,  87, 63, IMG_ROM);                                    // Выводим картинку разбившегося яйца
  414.     EggsToBroken();                                                                   // Переходим к функции когда яйцо разбилось
  415.   }
  416. }
  417.  
  418. void WolfMove() {                                                                     // Функция движения волка
  419.   previousWolf = MassWolfPosition;                                                    // Запоминаем последнее положение волка
  420.   if (butt1.isPress()) {                                                              // Если нажата кнопка влево - вверх. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt1.setDebounce(50);)
  421.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  422.     myOLED.drawImage(WolfLeft,   46, 64, IMG_ROM);                                    // Выводим на экран новое положение волка
  423.     myOLED.drawImage(HandLeftUp, 27, 43, IMG_ROM);                                    // Выводим на экран новое положение корзинки
  424.     MassWolfPosition = 0;                                                             // Очищаем переменную позиций
  425.     bitSet(MassWolfPosition,1);                                                       // Устанавливаем бит нового положения волка
  426.     playClickSound();                                                                 // Проигрываем звук нажатия на кнопку
  427.   }
  428.   if (butt2.isPress()) {                                                              // Если нажата кнопка влево - вниз. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt2.setDebounce(50);)
  429.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  430.     myOLED.drawImage(WolfLeft,     46, 64, IMG_ROM);                                  // Выводим на экран новое положение волка
  431.     myOLED.drawImage(HandLeftDown, 27, 64, IMG_ROM);                                  // Выводим на экран новое положение корзинки
  432.     MassWolfPosition = 0;                                                             // Очищаем переменную позиций
  433.     bitSet(MassWolfPosition,2);                                                       // Устанавливаем бит нового положения волка
  434.     playClickSound();                                                                 // Проигрываем звук нажатия на кнопку
  435.   }
  436.   if (butt3.isPress()) {                                                              // Если нажата кнопка вправо - вверх. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt3.setDebounce(50);)
  437.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  438.     myOLED.drawImage(WolfRight,   48, 64, IMG_ROM);                                   // Выводим на экран новое положение волка
  439.     myOLED.drawImage(HandRightUp, 72, 43, IMG_ROM);                                   // Выводим на экран новое положение корзинки
  440.     MassWolfPosition = 0;                                                             // Очищаем переменную позиций
  441.     bitSet(MassWolfPosition,3);                                                       // Устанавливаем бит нового положения волка
  442.     playClickSound();                                                                 // Проигрываем звук нажатия на кнопку
  443.   }
  444.   if (butt4.isPress()) {                                                              // Если нажата кнопка вправо - вниз. Выводим на экран новое положение волка с корзинкой. (Нажатие на кнопку + дебаунс, антидребезг по умолчанию 80 мс, можно настроить в void setup() -> butt4.setDebounce(50);)
  445.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  446.     myOLED.drawImage(WolfRight,     48, 64, IMG_ROM);                                 // Выводим на экран новое положение волка
  447.     myOLED.drawImage(HandRightDown, 72, 64, IMG_ROM);                                 // Выводим на экран новое положение корзинки
  448.     MassWolfPosition = 0;                                                             // Очищаем переменную позиций
  449.     bitSet(MassWolfPosition,4);                                                       // Устанавливаем бит нового положения волка
  450.     playClickSound();                                                                 // Проигрываем звук нажатия на кнопку
  451.   }
  452.   if (previousWolf != MassWolfPosition) {eventWolf = 1;}                              // Если волк изменил свое положение присваиваем переменной события единицу
  453. }
  454.  
  455. void StartWolf() {                                                                    // Функция вывода начального положения волка
  456.   wolfPositionStart = random(1, 5);                                                   // Генерируем случайное положение для волка
  457.   switch (wolfPositionStart)                                                          // В зависимости от положения волка, выводим соответствующий рисунок
  458.   {
  459.     case 1:                                                                           // Положение слева вверх
  460.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  461.     myOLED.drawImage(WolfLeft,  46, 64, IMG_ROM);                                     // Выводим на экран новое положение волка
  462.     myOLED.drawImage(HandLeftUp,    27, 43, IMG_ROM);                                 // Выводим на экран новое положение корзинки
  463.     bitSet(MassWolfPosition,1);                                                       // Устанавливаем бит нового положения волка
  464.     break;                                                                            // Выходим из оператора case
  465.     case 2:                                                                           // Положение слева вниз
  466.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  467.     myOLED.drawImage(WolfLeft,  46, 64, IMG_ROM);                                     // Выводим на экран новое положение волка
  468.     myOLED.drawImage(HandLeftDown,  27, 64, IMG_ROM);                                 // Выводим на экран новое положение корзинки
  469.     bitSet(MassWolfPosition,2);                                                       // Устанавливаем бит нового положения волка
  470.     break;                                                                            // Выходим из оператора case
  471.     case 3:                                                                           // Положение справа вверх
  472.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  473.     myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);                                     // Выводим на экран новое положение волка
  474.     myOLED.drawImage(HandRightUp,   72, 43, IMG_ROM);                                 // Выводим на экран новое положение корзинки
  475.     bitSet(MassWolfPosition,3);                                                       // Устанавливаем бит нового положения волка
  476.     break;                                                                            // Выходим из оператора case
  477.     case 4:                                                                           // Положение справа вниз
  478.     myOLED.drawRect(27, 16, 100, 64, true, 0);                                        // Очищаем место изменения положения волка и корзинки
  479.     myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);                                     // Выводим на экран новое положение волка
  480.     myOLED.drawImage(HandRightDown, 72, 64, IMG_ROM);                                 // Выводим на экран новое положение корзинки
  481.     bitSet(MassWolfPosition,4);                                                       // Устанавливаем бит нового положения волка
  482.     break;                                                                            // Выходим из оператора case
  483.   }
  484. }
  485.  
  486. void Location() {                                                                     // Функция прорисивки локации
  487.   myOLED.drawLine   (0, 20, 24, 29, 1);                                               // Выводим на экран полочку для яиц слева сверху
  488.   myOLED.drawLine   (0, 21, 24, 30, 1);
  489.   myOLED.drawLine   (0, 22, 24, 31, 1);
  490.   myOLED.drawLine   (0, 40, 24, 49, 1);                                               // Выводим на экран полочку для яиц слева снизу
  491.   myOLED.drawLine   (0, 41, 24, 50, 1);
  492.   myOLED.drawLine   (0, 42, 24, 51, 1);
  493.   myOLED.drawLine   (103, 29, 127, 20, 1);                                            // Выводим на экран полочку для яиц справа сверху
  494.   myOLED.drawLine   (103, 30, 127, 21, 1);
  495.   myOLED.drawLine   (103, 31, 127, 22, 1);
  496.   myOLED.drawLine   (103, 49, 127, 40, 1);                                            // Выводим на экран полочку для яиц справа снизу
  497.   myOLED.drawLine   (103, 50, 127, 41, 1);
  498.   myOLED.drawLine   (103, 51, 127, 42, 1);
  499. }
  500.  
  501. void ShowScore() {                                                                    // Функция вывода очков
  502.   myOLED.setFont(SmallFontRus);                                                       // Указываем шрифт который требуется использовать для вывода цифр и текста
  503.   myOLED.drawCircle(21, 6, 3, false, 1);                                              // Выводим круг с центром в точке 21х6 и радиусом 3
  504.   myOLED.print(F("-"), 28, 10);                                                       // Выводим тире 28 столбца 10 строки
  505.   myOLED.print(score, 36, 10);                                                        // Выводим количество очков 36 столбца 10 строки
  506.   myOLED.drawImage(EggBroken, 73, 12, IMG_ROM);                                       // Выводим картинку разбившегося яйца 73 столбца 12 строки
  507.   myOLED.print(F("-"), 97, 10);                                                       // Выводим тире 97 столбца 10 строки
  508.   myOLED.print(brokegg, 105, 10);                                                     // Выводим количество разбившихся яиц 105 столбца 10 строки
  509.   myOLED.update();                                                                    // Разрешаем автоматический вывод данных
  510. }
  511.  
  512. void GameOver() {                                                                     // Функция завершения игры
  513.   MassEggs[1] = 0;                                                                    // Очищаем элемент массива слева сверху
  514.   MassEggs[2] = 0;                                                                    // Очищаем элемент массива слева снизу
  515.   MassEggs[3] = 0;                                                                    // Очищаем элемент массива справа сверху
  516.   MassEggs[4] = 0;                                                                    // Очищаем элемент массива справа снизу
  517.   eventGenerationEggs = 0;                                                            // Переменная события для генерации чисел
  518.   MassWolfPosition = 0;                                                               // Переменная положения волка
  519.   eventWolf = 0;                                                                      // Переменная события для волка
  520.   previousWolf = 0;                                                                   // Переменная предыдущего положения волка
  521.   wolfPositionStart = 0;                                                              // Переменная начального положения волка
  522.   eggsPosition = 0;                                                                   // Переменная положения яйца
  523.   timeEggs = 0;                                                                       // Переменная времени передвижения яиц
  524.   eventEggs = 0;                                                                      // Переменная события для яиц
  525.   s = 0;                                                                              // Дополнительная переменная для генерации чисел
  526.   quantityScore = 0;                                                                  // Количество очков
  527.   if (score > EEPROM.get(0, record)) {                                                // Если счёт больше рекорда записанного в энергонезависимой памяти
  528.     record = constrain(record, 0, 255);                                               // Ограничили
  529.     EEPROM.put(0, score);                                                             // Записываем в энергонезависимую память новый рекорд по адресу 0
  530.   }
  531.   myOLED.clrScr();                                                                    // Чистим экран
  532.   myOLED.setFont(SmallFontRus);                                                       // Указываем шрифт который требуется использовать для вывода цифр и текста
  533.   myOLED.print(F("Игра окончена"), OLED_C, 25);                                       // Выводим текст по центру 25 строки
  534.   myOLED.print(F("Очки - "), 35, 40);                                                 // Выводим текст 35 столбца 40 строки
  535.   myOLED.print(score, 80, 40);                                                        // Выводим количество очков 80 столбца 40 строки
  536.   myOLED.print(F("Рекорд - "), 30, 55);                                               // Выводим текст 30 столбца 55 строки
  537.   myOLED.print(record, 84, 55);                                                       // Выводим рекорд 84 столбца 55 строки
  538.   myOLED.update();                                                                    // Разрешаем автоматический вывод данных
  539.   playGameOverSound();                                                                // Проигрываем звук завершения игры
  540.   delay(3000);                                                                        // Задержка 3 секунды
  541.   myOLED.clrScr();                                                                    // Чистим экран
  542.   if (score >= 60) {                                                                  // Если счёт больше или равен 60
  543.     Film();                                                                           // Показываем анимацию
  544.     myOLED.clrScr();                                                                  // Чистим экран
  545.   }
  546.   score = 0;                                                                          // Обнуляем очки
  547.   brokegg = 0;                                                                        // Обнуляем разбившиеся яйца
  548.   eventStartGame = 1;                                                                 // Разрешаем начало игры
  549. }
  550.  
  551. void StartScreen() {                                                                  // Функция вывода заставки игры
  552.   myOLED.drawRect (0, 0, 127, 63, false, 1);                                          // Прорисовываем рамку игрового поля
  553.   myOLED.setFont(MediumFontRus);                                                      // Указываем шрифт который требуется использовать для вывода цифр и текста
  554.   myOLED.print(F("НУ,ПОГОДИ!"), OLED_C, 40);                                          // Выводим текст по центру 40 строки
  555.   myOLED.update();                                                                    // Разрешаем автоматический вывод данных
  556.   delay(3000);                                                                        // Задержка 3 секунды
  557.   myOLED.clrScr();                                                                    // Чистим экран
  558.   myOLED.drawRect (0, 0, 127, 63, false, 1);                                          // Прорисовываем рамку игрового поля
  559.   myOLED.print(F("От"), OLED_C, 25);                                                  // Выводим текст по центру 25 строки
  560.   myOLED.print(F("AlexBus"), OLED_C, 50);                                             // Выводим текст по центру 50 строки
  561.   myOLED.update();                                                                    // Разрешаем автоматический вывод данных
  562.   delay (3000);                                                                       // Задержка 3 секунды
  563.   myOLED.clrScr();                                                                    // Чистим экран
  564. }
  565.  
  566. void playClickSound() {                                                               // Звук нажатия на кнопку
  567.   for (int i = 1200; i > 250; i--) {
  568.     tone(spkPin, i, 1);
  569.   }
  570.   noTone(spkPin);
  571. }
  572.  
  573. void playEggCaughtSound() {                                                           // Звук пойманного яйца
  574.   for(int i = 1000; i > 900; i--) {
  575.     tone(spkPin, i, 0.1);
  576.   }
  577.   noTone(spkPin);
  578. }
  579.  
  580. void playEggBrokenSound() {                                                           // Звук разбившегося яйца
  581.   for (int i = 0; i < 1000; i++) {
  582.     tone(spkPin, random(2000, 10000), 0.25);
  583.   }
  584.   noTone(spkPin);
  585. }
  586.  
  587. void playGameOverSound() {                                                            // Звук завершения игры
  588.   for (int i = 0; i < 2000; i++) {
  589.     tone(spkPin, random(2000, 10000), 0.25);
  590.   }
  591.   noTone(spkPin);
  592. }
  593.  
  594. void Film() {                                                                         // Анимация
  595.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  596.   myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
  597.   delay(450);
  598.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  599.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  600.   myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
  601.   delay(450);
  602.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  603.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  604.   myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
  605.   delay(450);
  606.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  607.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  608.   myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
  609.   delay(450);
  610.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  611.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  612.   myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
  613.   delay(450);
  614.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  615.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  616.   myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
  617.   delay(450);
  618.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  619.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  620.   myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
  621.   delay(450);
  622.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  623.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  624.   myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
  625.   delay(450);
  626.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  627.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  628.   myOLED.drawImage(WolfRight, 48, 64, IMG_ROM);
  629.   delay(450);
  630.   myOLED.drawRect(27, 16, 100, 64, true, 0);
  631.   myOLED.drawImage(HandScare,  40, 44, IMG_ROM);
  632.   myOLED.drawImage(WolfLeft, 48, 64, IMG_ROM);
  633. }
RAW Paste Data