Вы находитесь на странице: 1из 17

ПРОЕКТ 7: ИГРА НА ЗАПОМИНАНИЕ

Цель: В ЭТОМ ПРОЕКТЕ МЫ СОЗДАДИМ СОБСТВЕННУЮ ВЕРСИЮ АРКАДНОЙ ЛОГИЧЕСКОЙ ИГРЫ


TOUCH ME КОМПАНИИ ATARI, ИСПОЛЬЗУЯ ЧЕТЫРЕ СВЕТОДИОДА, ЧЕТЫРЕ КНОПКИ,
ПЬЕЗОИЗЛУЧАТЕЛЬ, НЕСКОЛЬКО РЕЗИСТОРОВ И ПЕРЕМЫЧКИ.

ТРЕБУЕМЫЕ КОМПОНЕНТЫ:

• Плата Arduino

• Макетная плата

• Перемычки

• 4 светодиод

• 4 кнопки

• 4 резистора с сопротивлением 220 Ом

ТРЕБУЕМЫЕ БИБЛИОТЕКИ:

• Топе

ПРИНЦИП РАБОТЫ:

В оригинальной игре компании Atari было четыре оборудованных светодиодами цветных панели,
которые загорались в определенном порядке, после чего игрок должен был повторить
комбинацию

Наша игра на запоминание воспроизводит короткую начальную мелодию и мигает светодиодами


в определенном порядке. После того, как вы повторите комбинацию, нажав кнопки в
соответствующем порядке, программа выдаст комбинацию, усложненную на 1 шаг. Так
происходит при каждом корректном вводе, чтобы усложнить процесс игры. Если вы ошибетесь
при повторении комбинации, игра сбрасывается на начальный уровень.

СБОРКА:

1. Установите кнопки на макетную плату так, чтобы они перекрывали собой канавку (словно
мостики), а контакты А и В оказались на одной стороне от канавки, а С и D — на другой.
2. Подключите контакт В каждой кнопки к шине заземления макетной платы, а саму шину — к
контакту GND платы Arduino.

3. Подключите контакт D каждой кнопки к цифровым контактам 2-5 платы Arduino (по порядку).

4. Установите светодиоды в макетную плату так, чтобы короткая ножка (катод) каждого из них
была соединена с контактом С каждой кнопки. Установите длинную ножку (анод) каждого
светодиода в отверстие справа, как показано на рис.

5. Установите на макетную плату резисторы с сопротивлением 220 Ом так, чтобы одна из ножек
каждого резистора была соединена с длинной ножкой (анодом) каждого светодиода. Другую
ножку каждого резистора с помощью перемычек подключите к Arduino к контактам 8-11, как
показано на рис.

6. Убедитесь, что красный светодиод, подключенный к контакту 11 платы Arduino, соединен с


кнопкой, подключенной к контакту 5. Желтый светодиод, подключенный к контакту 10, соединен с
кнопкой, подключенной к контакту 4. Зеленый светодиод, подключенный к контакту 9, соединен с
кнопкой, подключенной к контакту 3. Синий светодиод, подключенный к контакту 8, соединен с
кнопкой, подключенной к контакту 2.

7. Подключите черный провод пьезоизлучателя напрямую к контакту GND платы Arduino, а


красный — к контакту 12 на плате Arduino.

8. Убедитесь, что ваша цепь соответствует схеме, а затем загрузите в память Arduino код скетча,
приведенный в разделе «Скетч» далее в этом проекте.
СКЕТЧ:

Скетч генерирует случайную последовательность, в которой будут зажигаться светодиоды.


Случайное значение переменной у, генерируемое в цикле последовательности, определяет, на
какой светодиод подается питание (например, если переменной у присваивается значение 2,
загорается светодиод, подключенный к контакту 2). Во время игры вы должны запомнить
последовательность и повторить ее, чтобы перейти на следующий уровень. На каждом уровне
предыдущая последовательность повторяется и добавляется еще одна вспышка случайного
светодиода. Вспышка каждого светодиода сопровождается собственным тоном пьезоизлучателя,
поэтому мелодия также меняется. Если вы ошиблись при повторе последовательности, программа
перезапускается и воспроизводит другую последовательность. Для корректной компиляции скетча
нужно подключить библиотеку Топе (доступную по адресу
https://www.arduinolibraries.info/libraries/tone).

#include <Tone.h>

Tone speakerpin;

int starttune[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4,
NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4};

int duration2[] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};

int note[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};

int duration1[] = {100, 100, 100, 300, 100, 300};

int buttonP[] = {2, 3, 4, 5}; // Пины для кнопок

int ledPins[] = {8, 9, 10, 11}; // Пины для светодиодов


int turn = 0; // Счетчик ходов игрока

int buttonstate = 0; // Состояние кнопок

int randomArray[100]; // Массив для хранения сгенерированной случайной последовательности

int inputArray[100];

void fail() {

// Здесь разместите обработку ошибок

for (int y = 0; y <= 2; y++){// Индикация светодиодами для обозначения ошибки

digitalWrite(ledPins[0], HIGH);

digitalWrite(ledPins[1], HIGH);

digitalWrite(ledPins[2], HIGH);

digitalWrite(ledPins[3], HIGH);

speakerpin.play(NOTE_G3, 300);

delay (200);

digitalWrite(ledPins[0], LOW);

digitalWrite (ledPins[1], LOW);

digitalWrite (ledPins[2], LOW);

digitalWrite (ledPins[3], LOW);

speakerpin.play(NOTE_C3, 300);

delay (200);

delay(500);

turn = -1; // Сбросить значение переменной turn для начала новой игры

void setup() {

Serial.begin(9600);

speakerpin.begin(12); // Пин для пьезоизлучателя

// Инициализация пинов светодиодов как ВЫХОД

for (int i = 0; i < 4; i++) {

pinMode(ledPins[i], OUTPUT);

}
// Инициализация пинов кнопок как ВХОД с подтягивающими резисторами

for (int i = 0; i < 4; i++) {

pinMode(button[i], INPUT);

digitalWrite(button[i], HIGH); // Включение внутренних подтягивающих резисторов

// Задание начального значения генератору случайных чисел

randomSeed(analogRead(0));

// Воспроизведение начальной мелодии с использованием светодиодов

for (int thisNote = 0; thisNote < 13; thisNote++) {

speakerpin.play(starttune[thisNote]);

// Зажигание светодиодов для соответствующих нот

for (int i = 0; i < 4; i++) {

if (thisNote == i * 2 || thisNote == i * 2 + 1) {

digitalWrite(ledPins[i], HIGH);

delay(duration2[thisNote]);

speakerpin.stop();

// Выключение светодиодов

for (int i = 0; i < 4; i++) {

digitalWrite(ledPins[i], LOW);

delay(25);

delay(1000);

}
void loop() {

// Генерация массива, назначаемого игроку

for (int y = 0; y <= 99; y++) {

digitalWrite(ledPins[0], HIGH);

digitalWrite(ledPins[1], HIGH);

digitalWrite(ledPins[2], HIGH);

digitalWrite(ledPins[3], HIGH) ;

// Воспроизведение следующей ноты

for (int thisNote = 0; thisNote < 6; thisNote ++) {

speakerpin.play(note[thisNote]); // Продолжение ноты

delay(duration[thisNote]); // Остановка для воспроизведения следующей ноты

speakerpin.stop();

delay(25);

digitalWrite(ledPins[0] , LOW);

digitalWrite(ledPins[1] , LOW);

digitalWrite(ledPins[2] , LOW);

digitalWrite(ledPins[3] , LOW);

delay(1000);

// Ограничения переменной turn

for (int y = turn; y <= turn; y++) {

Serial.println("");

Serial.print("Turn: ");

Serial.print(y);

Serial.println("") ;

randomArray[y] = random(1, 5); // Присвоение случайного номера (1-4)

// Включение светодиодов в случайном порядке

for (int x = 0; x <= turn; x++) {

Serial.print(randomArray[x]);

for (int y = 0; y < 4 ; y++) {

if (randomArray[x] == 1 && ledPins[y] == 8) {

digitalWrite(ledPins[y], HIGH);
speakerpin.play(NOTE_G3, 100);

delay(400);

digitalWrite(ledPins[y], LOW);

delay(100);

if (randomArray[x] == 2 && ledPins[y] == 9) {

digitalWrite(ledPins[y], HIGH);

speakerpin.play(NOTE_A3, 100);

delay(400) ;

digitalWrite(ledPins[y], LOW);

delay(100);

if (randomArray[x] == 3 && ledPins[y] == 10) {

digitalWrite(ledPins[y], HIGH);

speakerpin.play(NOTE_B3, 100);

delay (400);

digitalWrite(ledPins[y], LOW);

delay (100);

if (randomArray[x] == 4 && ledPins[y] == 11) {

digitalWrite(ledPins[y], HIGH);

speakerpin.play(NOTE_C4, 100);

delay (400);

digitalWrite(ledPins[y], LOW);

delay (100);

input ();

}
void input() {

// Здесь разместите логику ввода игрока

for (int x = 0; x <= turn;) {

for (int y = 0; y < 4; y++) {

buttonstate = digitalRead(button[y]); // Проверка нажатия

// кнопки

if (buttonstate == LOW && button[y] == 2) {

digitalWrite(ledPins[0], HIGH);

speakerpin.play(NOTE_G3, 100);

delay (200);

digitalWrite(ledPins[0], LOW);

inputArray[x] = 1;

delay (250);

Serial.print(" ");

Serial .print (1);

// Проверка введенного пользователем значения на соответствие

// сгенерированному массиву

if (inputArray[x] != randomArray[x]) {

fail();// Если нет, вызывается функция fail

x++;

if (buttonstate == LOW && button[y] == 3) {

digitalWrite(ledPins[1], HIGH);

speakerpin.play(NOTE_A3, 100);

delay (200);

digitalWrite(ledPins[1], LOW);

inputArray[x] = 2;

delay (250);

Serial .print (" ");

Serial .print(2);
if (inputArray[x] != randomArray[x]) {

fail();

x++;

if (buttonstate == LOW && button[y] == 4) {

digitalWrite(ledPins[2], HIGH);

speakerpin.play(NOTE_B3, 100);

delay (200);

digitalWrite(ledPins[2], LOW);

inputArray[x] = 3;

delay (250);

Serial .print (" ");

Serial.print (3);

if (inputArray[x] != randomArray[x]) {

fail ();

x++;

if (buttonstate == LOW && button[y] == 5) {

digitalWrite(ledPins[3], HIGH);

speakerpin.play(NOTE_C4, 100);

delay(200);

digitalWrite(ledPins[3], LOW);

inputArray[x] = 4;

delay (250);

Serial.print (" ");

Serial .print (4);

if (inputArray[x] != randomArray[x]) {

fail();

x++;

}
}

delay(500);

turn++; // Увеличение значения переменной turn

Для Тинкеркада:

#define NOTE_C4 261.63

#define NOTE_F4 349.23

#define NOTE_G4 392.00

#define NOTE_E4 329.63

#define NOTE_G3 196.00

#define NOTE_A3 220.00

#define NOTE_B3 246.94

#define NOTE_C3 130.81

#define NOTE_C5 523.25

int speakerPin = 12; // Change to your desired speaker pin

int starttune[] = {NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4, NOTE_C4, NOTE_F4,
NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_G4};

int duration2[] = {100, 200, 100, 200, 100, 400, 100, 100, 100, 100, 200, 100, 500};

int note[] = {NOTE_C4, NOTE_C4, NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5};

int duration1[] = {100, 100, 100, 300, 100, 300};

int buttonP[] = {2, 3, 4, 5}; // Pins for buttons

int ledPins[] = {8, 9, 10, 11}; // Pins for LEDs

int turn = 0; // Player's turn counter

int buttonState = 0; // Button state

int randomArray[100]; // Array to store the randomly generated sequence

int inputArray[100];
void fail() {

// Handle errors here

for (int y = 0; y <= 2; y++) {

// LED indication for error

digitalWrite(ledPins[0], HIGH);

digitalWrite(ledPins[1], HIGH);

digitalWrite(ledPins[2], HIGH);

digitalWrite(ledPins[3], HIGH);

tone(speakerPin, NOTE_G3, 300);

delay(200);

digitalWrite(ledPins[0], LOW);

digitalWrite(ledPins[1], LOW);

digitalWrite(ledPins[2], LOW);

digitalWrite(ledPins[3], LOW);

tone(speakerPin, NOTE_C3, 300);

delay(200);

delay(500);

turn = -1; // Reset the turn variable to start a new game

void setup() {

Serial.begin(9600);

// Initialize speaker pin

pinMode(speakerPin, OUTPUT);

// Initialize LED pins as OUTPUT


for (int i = 0; i < 4; i++) {

pinMode(ledPins[i], OUTPUT);

// Initialize button pins as INPUT with pull-up resistors

for (int i = 0; i < 4; i++) {

pinMode(buttonP[i], INPUT);

digitalWrite(buttonP[i], HIGH); // Enable internal pull-up resistors

// Set the initial random seed

randomSeed(analogRead(0));

// Play the initial melody using LEDs

for (int thisNote = 0; thisNote < 13; thisNote++) {

tone(speakerPin, starttune[thisNote]);

// Illuminate LEDs for corresponding notes

for (int i = 0; i < 4; i++) {

if (thisNote == i * 2 || thisNote == i * 2 + 1) {

digitalWrite(ledPins[i], HIGH);

delay(duration2[thisNote]);

noTone(speakerPin);

// Turn off LEDs

for (int i = 0; i < 4; i++) {

digitalWrite(ledPins[i], LOW);

delay(25);
}

delay(1000);

void loop() {

// Generate an array assigned to the player

for (int y = 0; y <= 99; y++) {

// LED indication for the player's turn

digitalWrite(ledPins[0], HIGH);

digitalWrite(ledPins[1], HIGH);

digitalWrite(ledPins[2], HIGH);

digitalWrite(ledPins[3], HIGH);

// Play the next note

for (int thisNote = 0; thisNote < 6; thisNote++) {

tone(speakerPin, note[thisNote]);

delay(duration1[thisNote]);

noTone(speakerPin);

delay(25);

// Turn off LEDs

digitalWrite(ledPins[0], LOW);

digitalWrite(ledPins[1], LOW);

digitalWrite(ledPins[2], LOW);

digitalWrite(ledPins[3], LOW);

delay(1000);

// Limit the variable 'turn'

for (int y = turn; y <= turn; y++) {

Serial.println("");
Serial.print("Turn: ");

Serial.print(y);

Serial.println("");

randomArray[y] = random(1, 5); // Assign a random number (1-4)

// Illuminate LEDs in random order

for (int x = 0; x <= turn; x++) {

Serial.print(randomArray[x]);

for (int y = 0; y < 4; y++) {

if (randomArray[x] == 1 && ledPins[y] == 8) {

digitalWrite(ledPins[y], HIGH);

tone(speakerPin, NOTE_G3, 100);

delay(400);

digitalWrite(ledPins[y], LOW);

delay(100);

if (randomArray[x] == 2 && ledPins[y] == 9) {

digitalWrite(ledPins[y], HIGH);

tone(speakerPin, NOTE_A3, 100);

delay(400);

digitalWrite(ledPins[y], LOW);

delay(100);

if (randomArray[x] == 3 && ledPins[y] == 10) {

digitalWrite(ledPins[y], HIGH);

tone(speakerPin, NOTE_B3, 100);

delay(400);

digitalWrite(ledPins[y], LOW);

delay(100);

if (randomArray[x] == 4 && ledPins[y] == 11) {

digitalWrite(ledPins[y], HIGH);

tone(speakerPin, NOTE_C4, 100);


delay(400);

digitalWrite(ledPins[y], LOW);

delay(100);

input();

void input() {

// Player input logic

for (int x = 0; x <= turn;) {

for (int y = 0; y < 4; y++) {

buttonState = digitalRead(buttonP[y]); // Check button press

if (buttonState == LOW && buttonP[y] == 2) {

digitalWrite(ledPins[0], HIGH);

tone(speakerPin, NOTE_G3, 100);

delay(200);

digitalWrite(ledPins[0], LOW);

inputArray[x] = 1;

delay(250);

Serial.print(" ");

Serial.print(1);

if (inputArray[x] != randomArray[x]) {

fail(); // If not, call the fail function

x++;

}
if (buttonState == LOW && buttonP[y] == 3) {

digitalWrite(ledPins[1], HIGH);

tone(speakerPin, NOTE_A3, 100);

delay(200);

digitalWrite(ledPins[1], LOW);

inputArray[x] = 2;

delay(250);

Serial.print(" ");

Serial.print(2);

if (inputArray[x] != randomArray[x]) {

fail();

x++;

if (buttonState == LOW && buttonP[y] == 4) {

digitalWrite(ledPins[2], HIGH);

tone(speakerPin, NOTE_B3, 100);

delay(200);

digitalWrite(ledPins[2], LOW);

inputArray[x] = 3;

delay(250);

Serial.print(" ");

Serial.print(3);

if (inputArray[x] != randomArray[x]) {

fail();

x++;

}
if (buttonState == LOW && buttonP[y] == 5) {

digitalWrite(ledPins[3], HIGH);

tone(speakerPin, NOTE_C4, 100);

delay(200);

digitalWrite(ledPins[3], LOW);

inputArray[x] = 4;

delay(250);

Serial.print(" ");

Serial.print(4);

if (inputArray[x] != randomArray[x]) {

fail();

x++;

delay(500);

turn++; // Increase the turn variable

Вам также может понравиться