====== «Саймон говорит…» ====== **[[arduino-projects:start|Проекты на Arduino Uno и Slot Shield]]** Увлекательная электронная игра, направленная на развитие и тренировку памяти. Игроку предстоит последовательно повторять случайные комбинации загорающихся кнопок. Чем длиннее цепочка — тем больше счёт на экране компьютера. {{ :arduino-projects:arduino-snake:arduino-games-simon-says.png |}} Игровое поле — это пара [[amp>product/troyka-rgb-led-4x4?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|RGB матриц]]. Мозг проекта — оригинальная [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Arduino Uno]]. * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Iskra Neo]] * Язык программирования: Arduino (C++) ===== Что потребуется ===== [[amp>collection/arduino-games?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят: * [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Arduino Uno]] * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Troyka Slot Shield]] * [[amp>product/troyka-rgb-led-4x4?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|RGB матрица 4×4]] ===== Видеоинструкция ===== {{youtube>SkbAgCVzeLU?large}} ===== Как собрать ===== Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Arduino Uno]] {{ :arduino-projects:arduino-snake:fourgames0.png |}} Вставьте [[amp>product/troyka-rgb-led-4x4?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|RGB матрицу]] в разъём ''С''. Ножка ''S'' должна подключится к пину ''4''. {{ :arduino-projects:arduino-snake:fourgames1.png |}} ===== Скетч ===== Прошейте контроллер скетчем через [[articles:arduino-ide-install|Arduino IDE]]. // библиотека для работы с RGB-матрицей #include // номер пина, к которому подключена RGB-матрица #define MATRIX_C_PIN 4 // количество светодиодов в матрице #define LED_COUNT 16 // зерно для генератора случайных чисел #define ANALOG_PIN_FOR_RND A3 // максимальная яркость матрицы от 0 до 255 #define BRIGHT 10 // создаём объект класса Adafruit_NeoPixel Adafruit_NeoPixel matrixOnC = Adafruit_NeoPixel(LED_COUNT, MATRIX_C_PIN, NEO_GRB + NEO_KHZ800); // создаем объект класса String, в который будем записывать информацию с клавиатуры String player = ""; // создаем объект класса String, в который будет записываться случайная последовательность "цветов" String simon = ""; // создаем счетчик очков int score = 0; // создаем массив для хранения стандартных цветов const char color [] = {'r', 'g', 'b'}; void setup() { // открываем последовательный порт Serial.begin(9600); // инициализируем последовательность случайных чисел randomSeed(analogRead(ANALOG_PIN_FOR_RND)); // записываем первый случайный цвет в последовательность simon = color [random(0, 3)]; // инициализируем матрицу matrixOnC.begin(); // задаем придельную яркость matrixOnC.setBrightness(BRIGHT); // очищаем матрицу matrixOnC.clear(); matrixOnC.show(); // "Давай сыграем!" Serial.println("Let's play!"); delay(1000); // зажигаем матрицу с заданной последовательностью matrix_show_simon(); } void loop() { // пока в Serial port поступают символы... while (Serial.available() > 0) { // ...символ записываем в переменную char symbol = Serial.read(); // если приходит символ разрыва строки... if (symbol == '\n') { // ...то сравниваем, совпадает ли последовательность игрока с заданной if ( player == simon) { // если "да", то выполняем условия победы: // выводим счет в Serial port Serial.print("You win! Your score: "); // увеличиваем счет score++; Serial.println(score); // увеличиваем сложность добавив в последовательность цветов новый элемент simon += color [random(0, 3)]; // "Давай сыграем еще раз!" Serial.println("Let's play again!"); delay(1000); // показываем цвета на матрице matrix_show_simon(); // опустошаем последовательность, ранее введенную игроком player = ""; } else { // если "нет", то выполняем условия поражения: Serial.print("You lose. Your score: "); Serial.println(score); // обнуляем счет score = 0; // инициализируем новую последовательность случайных чисел randomSeed(analogRead(ANALOG_PIN_FOR_RND)); // записываем первый случайный цвет в последовательность simon = color [random(0, 3)]; // "Да ладно! Давай сыграем!" Serial.println("Come on! Let's play!"); delay(1000); // показываем цвета на матрице matrix_show_simon(); // опустошаем последовательность, ранее введенную игроком player = ""; } } else { // ... если символ не является символом разрыва строки, то вписываем его // в последовательность, введенную игроком player += symbol; } } } // функция показа последовательности цветов void matrix_show_simon() { for (int i = 0; i <= score; i++) { // отправляем, в функцию показа цвета, i-тый символ из объекта simon matrix_color(simon.charAt(i)); } } // функция для показа нужного цвета на матрице void matrix_color(char rgb) { switch (rgb) { case 'r': { for (int i = 0; i < LED_COUNT; i++) matrixOnC.setPixelColor(i, 255, 0, 0); break; } case 'g': { for (int i = 0; i < LED_COUNT; i++) matrixOnC.setPixelColor(i, 0, 255, 0); break; } case 'b': { for (int i = 0; i < LED_COUNT; i++) matrixOnC.setPixelColor(i, 0, 0, 255); break; } } matrixOnC.show(); delay(400); matrixOnC.clear(); matrixOnC.show(); delay(100); } ====== Часто задаваемые вопросы ====== > Где скачать необходимые библиотеки и как их установить? * [[https://github.com/adafruit/Adafruit_NeoPixel|Библиотека Adafruit NeoPixel]] * [[программирование:библиотеки|Как установить библиотеку]] ===== Что дальше ===== * Добавьте [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|четырёхразрядный индикатор]]. На него можно вывести текущий счёт. * Добавьте [[amp>product/arduino-power-shield-li-ion?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Power Shield]] — игру можно будет взять с собой в дорогу. * Вставьте устройство в корпус из #cтруктора. [[amp>product/structor-slot-box?utm_source=proj&utm_campaign=arduino-slot-proj-11&utm_medium=wiki|Slot Box]] придаст игре законченный вид.