Uvodní obrázek
Reakčná hra pre dvoch hráčov – Arduino Uno

Princíp fungovania:

Obaja hráči čakajú na štartovací signál a snažia sa stlačiť svoje tlačidlo čo najrýchlejši.

Ako bude hra prebiehať?:

  • LED postupne bliknú dvakrát ako uvítanie na začiatku hry.
  • Hra náhodne čaká 2–6 sekúnd. Ak niekto stlačí tlačidlo príliš skoro, kolo sa zruší.
  • Všetkých 5 LED sa rozsvieti — to je signál na reakciu.
  • Po 3 sekundách sa rozsvieti krajné LED víťaza na 3 sekundy.
  • LED zhasnú a hra sa pripraví na ďalšie kolo.
  • Ak obaja stlačia tlačidlo v tom istom čase, hra to vyhodnotí ako remízu a zablikajú obe krajné LED.

Súčiastky:

  • 5× LED
  • 5× 470R resistor
  • Dupont M-M prepojovacie vodiče 10cm a 2× 20cm
  • 2× tlačidlo 6×6mm

Zapojenie:

Komponenta:

Pin Arduino:

LED 1 (ľavá) – anóda cez rezistor

D3

LED 2 – anóda cez rezistor

D4

LED 3 – anóda cez rezistor

D5

LED 4 – anóda cez rezistor

D6

LED 5 (pravá) – anóda cez rezistor

D7

Katóda každej LED

GND

Tlačidlo ľavého hráča – jeden kontakt

D2

Tlačidlo pravého hráča – jeden kontakt

D8

Druhý kontakt oboch tlačidiel

GND

Program pro Arduino:

const int ledPins[] = {3, 4, 5, 6, 7};
const int pocetLED = 5;

const int tlacidloLavy = 2;
const int tlacidloPravy = 8;

const int ledLavyVitaz = 3;
const int ledPravyVitaz = 7;

void zhasniVsetkyLED() {
  for (int i = 0; i < pocetLED; i++) {
    digitalWrite(ledPins[i], LOW);
  }
}

void rozsvietVsetkyLED() {
  for (int i = 0; i < pocetLED; i++) {
    digitalWrite(ledPins[i], HIGH);
  }
}

void pockajNaUvolnenieTlacidiel() {
  while (digitalRead(tlacidloLavy) == LOW ||
         digitalRead(tlacidloPravy) == LOW) {
    delay(10);
  }
}

void uvodnaAnimacia() {
  zhasniVsetkyLED();

  // Kazda LED postupne blikne dvakrat
  for (int i = 0; i < pocetLED; i++) {
    for (int blik = 0; blik < 2; blik++) {
      digitalWrite(ledPins[i], HIGH);
      delay(200);
      digitalWrite(ledPins[i], LOW);
      delay(200);
    }
  }
}

void setup() {
  for (int i = 0; i < pocetLED; i++) {
    pinMode(ledPins[i], OUTPUT);
  }

  pinMode(tlacidloLavy, INPUT_PULLUP);
  pinMode(tlacidloPravy, INPUT_PULLUP);

  randomSeed(analogRead(A0));

  uvodnaAnimacia();
}

void loop() {
  zhasniVsetkyLED();

  // Hra sa zacne, az ked su obe tlacidla uvolnene
  pockajNaUvolnenieTlacidiel();

  // Nahodne cakanie 2 az 6 sekund
  unsigned long cakanie = random(2000, 6001);
  unsigned long zaciatokCakania = millis();

  while (millis() - zaciatokCakania < cakanie) {
    bool lavyStlaceny =
      digitalRead(tlacidloLavy) == LOW;
    bool pravyStlaceny =
      digitalRead(tlacidloPravy) == LOW;

    // Predcasne stlacenie zrusi kolo
    if (lavyStlaceny || pravyStlaceny) {
      zhasniVsetkyLED();
      pockajNaUvolnenieTlacidiel();
      delay(1000);
      return;
    }
  }

  // Startovaci signal
  rozsvietVsetkyLED();

  int vitaz = 0;
  // 1 = lavy, 2 = pravy, 3 = takmer sucasne stlacenie

  while (vitaz == 0) {
    bool lavyStlaceny =
      digitalRead(tlacidloLavy) == LOW;
    bool pravyStlaceny =
      digitalRead(tlacidloPravy) == LOW;

    if (lavyStlaceny & pravyStlaceny) {
      vitaz = 3;
    } else if (lavyStlaceny) {
      vitaz = 1;
    } else if (pravyStlaceny) {
      vitaz = 2;
    }
  }

  zhasniVsetkyLED();

  // Pauza 3 sekundy pred oznamenim vitaza
  delay(3000);

  if (vitaz == 1) {
    digitalWrite(ledLavyVitaz, HIGH);
  } else if (vitaz == 2) {
    digitalWrite(ledPravyVitaz, HIGH);
  } else {
    // Pri takmer sucasnom stlaceni bliknu obe krajné LED
    for (int i = 0; i < 3; i++) {
      digitalWrite(ledLavyVitaz, HIGH);
      digitalWrite(ledPravyVitaz, HIGH);
      delay(250);
      digitalWrite(ledLavyVitaz, LOW);
      digitalWrite(ledPravyVitaz, LOW);
      delay(250);
    }
  }

  // Vitazna LED svieti 3 sekundy
  delay(3000);
  zhasniVsetkyLED();

  // Pauza pred dalsim kolom
  pockajNaUvolnenieTlacidiel();
  delay(1000);
}
FB tw

Další podobné články