Проект 8. Кнопочные ковбои

Это небольшая, но довольно интересная игра на скорость реакции. Через некоторые случайные промежутки времени будет издаваться сигнал. По сигналу игроки должны нажать на свою кнопку, кто быстрее нажал тот и выиграл раунд. При этом ведётся подсчёт очков, и передаётся на компьютер.

Программирование:

Генератор случайных чисел random

Создание методов

Практика

Сделать игру, в которой игрокам необходимо будет после включения жёлтого светодиода нажать на кнопки. Жёлтый светодиод загорается в случайный промежуток времени от 3 до 7 секунд после старта игры. При появлении сигнала, первый игрок должен нажать на D0, второй на D2. Игрок, нажавший быстрее другого побеждает. Если выиграл первый игрок, то включается зелёный светодиод, если второй, то включается красный светодиод.

Дополнительное задание

Добавить начисление очков с выводом в COM-порт. Добавить защиту от нечестной игры: если игрок нажал кнопку до появления сигнала, то у него вычитаются очки.

Решение

Мы рекомендуем сначала освоить материал и попробовать сделать программу самостоятельно! А потом проверить себя, посмотрев наш вариант решения:

#include <Eryoma.h>
Eryoma eryoma;

void setup() {
  eryoma.setupConnector(ePort1, TrafficLight);
  eryoma.setupConnector(ePort4, Keypad);
  delay(random(3000, 8000)); //задержка перед первым ходом
  eryoma.write(ePort1, 0, 255, 0); //сигнал перед первым ходом
}

void loop() {
  if (eryoma.read(ePort4, D0) == 0) {
    eryoma.write(ePort1, 255, 0, 0);
    delay(1000);
    eryoma.write(ePort1, 0, 0, 0);
    delay(random(3000, 8000));
    eryoma.write(ePort1, 0, 255, 0);
  }
  if (eryoma.read(ePort4, D2) == 0) {
    eryoma.write(ePort1, 0, 0, 255);
    delay(1000);
    eryoma.write(ePort1, 0, 0, 0);
    delay(random(3000, 8000));
    eryoma.write(ePort1, 0, 255, 0);
  }
}

#include <Eryoma.h>
Eryoma eryoma;

int point1 = 0;
int point2 = 0;

void setup() {
  eryoma.setupConnector(ePort1, TrafficLight);
  eryoma.setupConnector(ePort4, Keypad);
  Serial.begin(9600);
  Serial.println("Start game!");
  delay(random(3000, 8000)); //задержка перед первым ходом
  eryoma.write(ePort1, 0, 255, 0); //сигнал перед первым ходом
}

void loop() {
  if (eryoma.read(ePort4, D0) == 0) {
    point1++;
    eryoma.write(ePort1, 255, 0, 0);
    doNext();
  }
  if (eryoma.read(ePort4, D2) == 0) {
    point2++;
    eryoma.write(ePort1, 0, 0, 255);
    doNext();
  }
}

void doNext() {
  Serial.print("Points is: ");
  Serial.print(point1);
  Serial.print(" | ");
  Serial.println(point2);
  delay(2000);
  eryoma.write(ePort1, 0, 0, 0);
  delay(random(3000, 8000));
  if (eryoma.read(ePort4, D0) == 0) {
    point1 -= 2;
    Serial.println("Player 1 used cheat!");
  }
  if (eryoma.read(ePort4, D2) == 0) {
    point2 -= 2;
    Serial.println("Player 2 used cheat!");
  }
  eryoma.write(ePort1, 0, 255, 0);
}