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.
Brak komentarzy:
Prześlij komentarz