Каталог
Игра "Cowboy" на Arduino

Игра "Cowboy" на Arduino

В этом проекте мы создадим игру "Ковбой" на платформе Arduino. В этой игре два игрока соревнуются на реакцию: кто первым нажмет кнопку после сигнала, получает 1 балл. Если игрок нажимает кнопку до сигнала или после соперника, ему не дается балл. Побеждает тот, кто первым наберет 5 баллов. Игра включает световую и звуковую индикацию состояния игры с помощью светодиодов и зуммера, а также отображение счета на ЖК-дисплее 1602 i2c.

Необходимые компоненты:

  • Arduino Uno или Nano
  • ЖК-дисплей 1602 i2c
  • 2 кнопки
  • 2 светодиода
  • Зуммер
  • Резисторы (10 кОм для кнопки и 220 Ом для светодиодов)
  • Соединительные провода
  • Макетная плата (breadboard)

Подключение компонентов:

  1.  Подключение ЖК-дисплея:

    • SDA -> A4 (Uno/Nano)
    • SCL -> A5 (Uno/Nano)
    • VCC -> 5V
    • GND -> GND 

Шаги реализации:

  1.  Подключите ЖК-дисплей, кнопки, светодиоды и зуммер к Arduino согласно схеме выше.
  2.  Подключите библиотеку для Arduino.

Для это выполните следующие шаги:

  1. Скачайте обе библиотеки с официального сайта или из репозитория GitHub:

  2. Откройте программу Arduino IDE и перейдите в меню «Скетч» → «Подключить библиотеку» → «Добавить .ZIP библиотеку…».

  3. В открывшемся окне выберите скачанный .zip файл и нажмите «Открыть».

  4. Снизу Arduino IDE появится сообщение “Библиотека добавлена. Проверьте меню “Подключить библиотеку” ”.

  5. Теперь библиотека будет доступна для использования в ваших проектах.

2. Создайте новый скетч.

3. Перепишите следующий код:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Инициализация LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);

const int button1 = 2; // Пин первой кнопки
const int button2 = 3; // Пин второй кнопки
const int led1 = 8;    // Пин первого светодиода
const int led2 = 9;    // Пин второго светодиода
const int buzzer = 10; // Пин зуммера

int score1 = 0; // Счет первого игрока
int score2 = 0; // Счет второго игрока
const int winScore = 5; // Количество баллов для победы

bool gameOn = false; // Флаг начала игры
bool signalGiven = false; // Флаг подачи сигнала
unsigned long startTime;
unsigned long signalTime;struct MusicStruct {  //generating tones
  int A = 550;
  int As = 582;
  int B = 617;
  int C = 654;
  int Cs = 693;
  int D = 734;
  int Ds = 777;
  int E = 824;
  int F = 873;
  int Fs = 925;
  int G = 980;
  int Gs = 1003;
  int A2 = 1100;
  int A2s = 1165;
  int B2 = 1234;
  int C3 = 1308;
  int C3s = 1385;
  int D3 = 1555;
} Music;
struct LengthStruct {
  float half = 0.5;
  float one = 1.0;
  float one_half = 1.5;
  float two = 2.0;
  float two_half = 2.5;
} Length;
int tempo = 400;

void setup() {
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(buzzer, OUTPUT);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("   Created by");
  lcd.setCursor(0, 1);
  lcd.print(" Alash engineer");
  delay(2000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Cowboy Game");
  delay(2000);
  lcd.clear();

  resetGame();
}

void loop() {
  if (gameOn) {
    if (millis() >= signalTime && !signalGiven) {
      // Сигнал начала реакции
      lcd.setCursor(0, 0);
      lcd.print("Press Now!");
      tone(buzzer, 1000, 200); // Сигнал зуммера
      signalGiven = true;
    }

    if (signalGiven) {
      if (digitalRead(button1) == HIGH) {
        handleButtonPress(1);
      }
      if (digitalRead(button2) == HIGH) {
        handleButtonPress(2);
      }
    } else {w
      if (digitalRead(button1) == HIGH) {
        handleFalseStart(1);
      }
      if (digitalRead(button2) == HIGH) {
        handleFalseStart(2);
      }
    }
  } else {
    if (score1 == winScore || score2 == winScore) {
      lcd.setCursor(0, 0);
      lcd.print("Player ");
      lcd.print(score1 == winScore ? "1 Wins!" : "2 Wins!");
      harrypotter();
      //      delay(5000);
      resetGame();
    } else {
      startNewRound();
    }
  }
}

void startNewRound() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Get Ready...");
  delay(100);

  lcd.setCursor(0, 1);
  lcd.print("Score: ");
  lcd.print(score1);
  lcd.print(" - ");
  lcd.print(score2);

  startTime = millis();
  signalTime = startTime + random(1500, 2500); // Сигнал через 1.5-2.5 секунд
  gameOn = true;
  signalGiven = false;
}

void handleButtonPress(int player) {
  gameOn = false;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Player ");
  lcd.print(player);
  lcd.print(" Wins!");

  if (player == 1) {
    score1++;
    digitalWrite(led1, HIGH);
    delay(500);
    digitalWrite(led1, LOW);
  } else {
    score2++;
    digitalWrite(led2, HIGH);
    delay(500);
    digitalWrite(led2, LOW);
  }

  lcd.setCursor(0, 1);
  lcd.print("Score: ");
  lcd.print(score1);
  lcd.print(" - ");
  lcd.print(score2);
  delay(2000);
  lcd.clear();
}

void handleFalseStart(int player) {
  gameOn = false;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Player ");
  lcd.print(player);
  lcd.print(" False!");
  tone(buzzer, 500, 500); // Сигнал ложного старта

  if (player == 1) {
    score2++;
    digitalWrite(led1, HIGH);
    delay(500);
    digitalWrite(led1, LOW);
  } else {
    score1++;
    digitalWrite(led2, HIGH);
    delay(500);
    digitalWrite(led2, LOW);
  }
  lcd.setCursor(0, 1);
  lcd.print("Score: ");
  lcd.print(score1);
  lcd.print(" - ");
  lcd.print(score2);
  delay(2000);
  lcd.clear();
}

void resetGame() {
  score1 = 0;
  score2 = 0;
  gameOn = false;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Cowboy Game");
  lcd.setCursor(0, 1);
  lcd.print("Score: 0 - 0");
  delay(1000);
  startNewRound();
}

void setTone(int pin, int note, int duration) {
  tone(pin, note, duration);
  delay(duration);
  noTone(pin);
}
void harrypotter() {
  setTone(buzzer, Music.B, tempo * Length.one);
  setTone(buzzer, Music.E, tempo * Length.one_half);
  setTone(buzzer, Music.G, tempo * Length.half);
  setTone(buzzer, Music.F, tempo * Length.one);
  setTone(buzzer, Music.E, tempo * Length.two);
  setTone(buzzer, Music.B2, tempo * Length.one);
  setTone(buzzer, Music.A2, tempo * Length.two_half);
  setTone(buzzer, Music.Fs, tempo * Length.two_half);
  setTone(buzzer, Music.E, tempo * Length.one_half);
  setTone(buzzer, Music.G, tempo * Length.half);
  setTone(buzzer, Music.F, tempo * Length.one);
  setTone(buzzer, Music.Ds, tempo * Length.two);
  setTone(buzzer, Music.F, tempo * Length.one);
  setTone(buzzer, Music.B, tempo * Length.two_half);
}

Заключение

В этом проекте вы научились создавать простую игру на реакцию для двух игроков с использованием Arduino. Мы использовали ЖК-дисплей для отображения состояния игры, светодиоды для индикации победы, и зуммер для подачи звуковых сигналов. Этот проект является отличным примером того, как можно комбинировать различные компоненты и библиотеки Arduino для создания увлекательных и интерактивных приложений. Наслаждайтесь игрой и продолжайте развивать свои навыки программирования и работы с электроникой!

Комментарии
Отзывов еще никто не оставлял
Предзаказ
Предзаказ успешно отправлен!
Имя *
Телефон *
Добавить в корзину
Название товара
100 тг
1 шт.
Перейти в корзину
Обратный звонок
Запрос успешно отправлен!
Имя *
Телефон *
Заказ в один клик
С помощью уведомлений о заказе можно не только получать актуальную информацию по заказу, но и иметь быстрый канал связи с магазином