Gra REFLEKS - z jedną diodą

Gra REFLEKS dla dwóch graczy

Ten projekt to zabawa w szybkie reakcje! Gdy zapali się dioda, pierwszy gracz, który naciśnie przycisk, zdobywa punkt. Wygrywa ten, kto pierwszy zdobędzie 5 punktów!

#define LED_GAME 2      // dioda sygnalizująca moment reakcji
#define BUZZER 3
#define BTN1 4
#define BTN2 5
#define BTN_RESET 6
#define LED_P1 7        // dioda gracza 1
#define LED_P2 8        // dioda gracza 2

int punkty1 = 0;
int punkty2 = 0;
const int CEL = 5;

void setup() {
  pinMode(LED_GAME, OUTPUT);
  pinMode(LED_P1, OUTPUT);
  pinMode(LED_P2, OUTPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(BTN1, INPUT_PULLUP);
  pinMode(BTN2, INPUT_PULLUP);
  pinMode(BTN_RESET, INPUT_PULLUP);

  randomSeed(analogRead(A0)); // dla losowości

  Serial.begin(9600);
  Serial.println("🎮 Gra refleksu start!");
  Serial.println("Pierwszy do 5 punktów wygrywa!");
}

void loop() {
  if (digitalRead(BTN_RESET) == LOW) {
    delay(150);
    if (digitalRead(BTN_RESET) == LOW) {
      resetGry();
      return;
    }
  }

  if (punkty1 >= CEL || punkty2 >= CEL) {
    zwyciestwo();
    return;
  }

  sygnalStartu();
  digitalWrite(LED_GAME, LOW);

  int czasCzekania = random(1000, 5000);
  unsigned long startCzekania = millis();
  bool przedwczesne = false;

  while (millis() - startCzekania < czasCzekania) {
    if (digitalRead(BTN1) == LOW) {
      kara(1);
      przedwczesne = true;
      break;
    }
    if (digitalRead(BTN2) == LOW) {
      kara(2);
      przedwczesne = true;
      break;
    }
    if (digitalRead(BTN_RESET) == LOW) { resetGry(); return; }
  }

  if (przedwczesne) {
    delay(1500);
    return;
  }

  digitalWrite(LED_GAME, HIGH);
  unsigned long czasZapalenia = millis();
  bool koniecRundy = false;
  unsigned long limit = 3000;

  while (!koniecRundy && millis() - czasZapalenia < limit) {
    if (digitalRead(BTN1) == LOW) {
      delay(80);
      if (digitalRead(BTN1) == LOW) {
        reakcja(1, czasZapalenia);
        koniecRundy = true;
      }
    }
    if (digitalRead(BTN2) == LOW) {
      delay(80);
      if (digitalRead(BTN2) == LOW) {
        reakcja(2, czasZapalenia);
        koniecRundy = true;
      }
    }
    if (digitalRead(BTN_RESET) == LOW) { resetGry(); return; }
  }

  if (!koniecRundy) {
    Serial.println("⏱️ Nikt nie zareagował na czas!");
  }

  digitalWrite(LED_GAME, LOW);
  delay(1000);
}

void reakcja(int gracz, unsigned long czasZapalenia) {
  unsigned long czasReakcji = millis() - czasZapalenia;

  if (gracz == 1) {
    punkty1++;
    digitalWrite(LED_P1, HIGH);
  } else {
    punkty2++;
    digitalWrite(LED_P2, HIGH);
  }

  dzwiekWygranej();

  Serial.print("⚡ Gracz ");
  Serial.print(gracz);
  Serial.print(" punkt! Czas reakcji: ");
  Serial.print(czasReakcji);
  Serial.println(" ms");
  Serial.print("Wynik: ");
  Serial.print(punkty1);
  Serial.print(" - ");
  Serial.println(punkty2);

  delay(400);
  digitalWrite(LED_P1, LOW);
  digitalWrite(LED_P2, LOW);
}

void dzwiekWygranej() {
  tone(BUZZER, 1000, 200);
  delay(250);
  noTone(BUZZER);
}

void kara(int gracz) {
  tone(BUZZER, 300, 400);
  delay(500);
  noTone(BUZZER);

  if (gracz == 1 && punkty1 > 0) punkty1--;
  if (gracz == 2 && punkty2 > 0) punkty2--;

  Serial.print("❌ Gracz ");
  Serial.print(gracz);
  Serial.println(" za szybki! Traci 1 punkt.");
  Serial.print("Aktualny wynik: ");
  Serial.print(punkty1);
  Serial.print(" - ");
  Serial.println(punkty2);
}

void sygnalStartu() {
  tone(BUZZER, 600, 100);
  delay(150);
  tone(BUZZER, 800, 100);
  delay(150);
  noTone(BUZZER);
}

void zwyciestwo() {
  bool gracz1Wygral = (punkty1 >= CEL);

  if (gracz1Wygral)
    Serial.println("🏆 Gracz 1 WYGRYWA GRĘ!");
  else
    Serial.println("🏆 Gracz 2 WYGRYWA GRĘ!");

  int ledZwyciezcy = gracz1Wygral ? LED_P1 : LED_P2;

  for (int i = 0; i < 3; i++) {
    tone(BUZZER, 800, 200);
    migajDiode(ledZwyciezcy, 200);
    delay(100);

    tone(BUZZER, 1000, 200);
    migajDiode(ledZwyciezcy, 200);
    delay(100);

    tone(BUZZER, 1200, 300);
    migajDiode(ledZwyciezcy, 300);
    delay(200);
  }

  noTone(BUZZER);
  resetGry();
}

void migajDiode(int pin, int czas) {
  digitalWrite(pin, HIGH);
  delay(czas);
  digitalWrite(pin, LOW);
  delay(czas);
}

void resetGry() {
  punkty1 = 0;
  punkty2 = 0;
  digitalWrite(LED_GAME, LOW);
  digitalWrite(LED_P1, LOW);
  digitalWrite(LED_P2, LOW);
  noTone(BUZZER);
  Serial.println("🔁 Gra zresetowana. Nowa runda zaczyna się...");
  delay(1500);
}
    

Opis działania

Po włączeniu programu Arduino losowo odlicza od 1 do 5 sekund. Gdy dioda LED_GAME się zapali, gracze próbują jak najszybciej nacisnąć swoje przyciski (BTN1 i BTN2). Zbyt wczesne wciśnięcie przycisku to kara – utrata punktu!

💡 Ciekawostka: Dzięki funkcji millis() Arduino mierzy czas z dokładnością do jednej tysięcznej sekundy.
⚠️ Uwaga: Użyj przycisków z INPUT_PULLUP.
🏆 Pomysł na rozwinięcie: Dodaj wyświetlacz LCD lub fanfarę z buzzera.
Schemat połączenia gry REFLEKS Arduino

Brak komentarzy:

Prześlij komentarz