Proiectul constă într-un joculeț de memorie care funcționează în felul următor: îți alegi modul de joc (easy/hard) prin apăsarea butonului corespunzător, iar o dată ce apeși pe unul din butoane, se va afișa o secvență de lumini, fiecare led având o culoare și un sunet diferit. Jucătorul va trebui să reproducă secvența apăsând pe butoanele corespunzătoare acestora, iar dacă nimerește trece la nivelul următor.
Ideea de la care am pornit este aceea de a crea un joc, ceva care să fie și distractiv, dar care este și util, având ca scop antrenarea memoriei.
Este un mod de a combina utilul cu plăcutul, trezind în jucător și un mic spirit de competitivitate, pentru a reuși să scoată un scor cât mai bun.
M-am jucat puțin și cu simulările din Tinkercad înainte de a pune totul pe plăcuță.
void smallButtonISR() { static unsigned long lastDebounceTime = 0; unsigned long debounceDelay = 100; if (millis() - lastDebounceTime > debounceDelay) { hardModeChanged = true; lastDebounceTime = millis(); } } void setup() { pinMode(blueLED, OUTPUT); pinMode(yellowLED, OUTPUT); pinMode(redLED, OUTPUT); pinMode(greenLED, OUTPUT); pinMode(modeLED, OUTPUT); pinMode(blueButton, INPUT_PULLUP); pinMode(yellowButton, INPUT_PULLUP); pinMode(redButton, INPUT_PULLUP); pinMode(greenButton, INPUT_PULLUP); pinMode(smallButton, INPUT_PULLUP); pinMode(buzzerPin, OUTPUT); lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Memory Game!"); lcd.setCursor(0, 1); lcd.print("Highest Score "); lcd.print(highestScore); randomSeed(analogRead(0)); gameState = WAIT_FOR_START; attachInterrupt(digitalPinToInterrupt(smallButton), smallButtonISR, FALLING); }
void generateSequence() { sequence[currentLevel] = random(0, 4); sequenceIndex = 0; gameState = hardMode ? HARD_DISPLAY_SEQUENCE : DISPLAY_SEQUENCE; }
void fadeLED(int ledPin, int startBrightness, int endBrightness, int duration) { int stepDelay = duration / abs(endBrightness - startBrightness); for (int brightness = startBrightness; brightness != endBrightness; brightness += (startBrightness < endBrightness ? 1 : -1)) { analogWrite(ledPin, brightness); delay(stepDelay); } analogWrite(ledPin, endBrightness); } void displaySequence(bool hard) { int leds[] = {blueLED, yellowLED, redLED, greenLED}; int brightness = hard ? max(255 - 30 * currentLevel, 0) : 255; // Adjust brightness for hard mode unsigned long currentMillis = millis(); int basePauseDuration = 600; int minPauseDuration = 400; int pauseDuration = hard ? max(basePauseDuration - 20 * currentLevel, minPauseDuration) : basePauseDuration; if (displayState == 0 && currentMillis - lastMillis >= pauseDuration) { lastMillis = currentMillis; fadeLED(leds[sequence[sequenceIndex]], 0, brightness, 300); tone(buzzerPin, 1000 + (leds[sequence[sequenceIndex]] * 200), 300); displayState = 1; } else if (displayState == 1 && currentMillis - lastMillis >= 300) { lastMillis = currentMillis; fadeLED(leds[sequence[sequenceIndex]], brightness, 0, 300); sequenceIndex++; displayState = 0; if (sequenceIndex > currentLevel) { gameState = WAIT_FOR_BUTTON_PRESS; buttonPressIndex = 0; } } }
Laboratoare folosite:
A fost un proiect interesant, mereu am vrut să încerc să lucrez cu o plăcuță Arduino și mă bucur că am avut ocazia. Jocul chiar a ieșit drăguț după părerea mea. Unele din dificultățile pe care le-am întâmpinat au fost să îmi dau seama cum să fac butoanele să funcționeze, pentru că inițial nu se detecta nimic când se apăsau, sau cum să integrez laboratorul cu întreruperi. În final, am reușit să trec și peste ele și consider că a fost o experiență mișto.