This is an old revision of the document!
Schema Bloc:
Rolul LCD-ului este de a arata interfata pe care se va joca Wordle. Pentru conectarea LCD-ului am folost pinii:
Rolul tastaturii este de a putea insera caractere intr-un mod cat mai usor. Pentru conectarea tastaturii am taiat cablul acesteia si am conectat 4 fire:
Acest cod este un exemplu de implementare a jocului Wordle folosind o placă Arduino și un ecran TFT ILI9341, controlate prin intermediul unei tastaturi PS2. Iată o scurtă descriere a codului:
Codul este scris în limbajul C++ și este destinat să fie rulat pe o placă Arduino. Utilizează librăriile PS2Keyboard, SPI, Adafruit_GFX, și Adafruit_ILI9341 pentru a comunica cu tastatura PS2 și afișajul TFT ILI9341.
Pentru a putea alege intre cele doua optiuni din meniu se vor folosi sagetile de la tastatura (UP si DOWN).
Codul implementează funcții pentru inițializarea și resetarea jocului, desenarea meniului, afișarea regulilor jocului, gestionarea feedback-ului pentru ghicirea cuvântului, precum și gestionarea intrărilor de la tastatură. Implementează un ciclu loop() care verifică disponibilitatea intrărilor de la tastatură și gestionează comenzile utilizatorului în funcție de starea jocului și a meniului.
Această funcție este responsabilă pentru resetarea jocului la începutul unei sesiuni noi. Alege un cuvânt ascuns aleatoriu din lista de cuvinte și resetează toate variabilele necesare pentru următoarea încercare de ghicire.
void resetGame() { targetWord = wordList[random(0, wordCount)]; currentGuess = 0; charIndex = 0; memset(guess, 0, sizeof(guess)); gameOver = false; // Clear the display and redraw the grid display.fillScreen(ILI9341_BLACK); display.setTextColor(ILI9341_WHITE); display.setTextSize(2); // Draw empty grid for guesses for (int i = 0; i < maxGuesses; i++) { for (int j = 0; j < 5; j++) { display.drawRect(gridStartX + j * (boxWidth + boxSpacing), gridStartY + i * (boxHeight + boxSpacing), boxWidth, boxHeight, ILI9341_WHITE); } }
}
Această funcție este responsabilă pentru desenarea meniului pe ecran. Afișează titlul jocului și opțiunile de meniu disponibile.
void drawMenu() { display.fillScreen(ILI9341_BLACK); // Draw "WORDLE" title display.setTextSize(4); display.setTextColor(ILI9341_WHITE); for (int i = 0; i < 6; i++) { display.fillRect(menuX + i * (boxWidth + 4), menuY - titleSpacing, boxWidthMenu, boxHeightMenu, ILI9341_GREEN); display.setCursor(menuX + i * (boxWidth + 4) + 4, menuY - titleSpacing + 8); display.print("WORDLE"[i]); } // Draw menu options display.setTextSize(2); display.setTextColor(ILI9341_WHITE); display.setCursor(menuX, menuY + titleSpacing); for (int i = 0; i < menuOptionCount; i++) { if (i == currentOption) { display.setTextColor(ILI9341_GREEN); // Highlight current option } else { display.setTextColor(ILI9341_WHITE); } display.println(menuOptions[i]); display.setCursor(menuX, menuY + titleSpacing + (i + 1) * menuSpacing); } }
Această funcție conține logica jocului Wordle. Așteaptă intrările de la tastatură, validează ghicirile utilizatorului și oferă feedback vizual pentru fiecare încercare de ghicire.
void startWordleGame() { // Reset the game resetGame(); // Game loop while (!gameOver) { if (keyboard.available()) { char c = keyboard.read(); if (c >= 'a' && c <= 'z') { c = c - 'a' + 'A'; // convert to uppercase } if (charIndex < 5 && c >= 'A' && c <= 'Z') { guess[charIndex] = c; display.setCursor(gridStartX + charIndex * (boxWidth + boxSpacing) + 8, gridStartY + currentGuess * (boxHeight + boxSpacing) + 8); display.print(c); charIndex++; } if (c == PS2_ENTER && charIndex == 5) { guess[5] = '\0'; // Null-terminate the guess // Determine box colors based on the guess for (int i = 0; i < 5; i++) { if (guess[i] == targetWord[i]) { display.fillRect(gridStartX + i * (boxWidth + boxSpacing), gridStartY + currentGuess * (boxHeight + boxSpacing), boxWidth, boxHeight, ILI9341_GREEN); } else if (strchr(targetWord, guess[i])) { display.fillRect(gridStartX + i * (boxWidth + boxSpacing), gridStartY + currentGuess * (boxHeight + boxSpacing), boxWidth, boxHeight, ILI9341_YELLOW); } else { display.fillRect(gridStartX + i * (boxWidth + boxSpacing), gridStartY + currentGuess * (boxHeight + boxSpacing), boxWidth, boxHeight, ILI9341_DARKGREY); } display.setCursor(gridStartX + i * (boxWidth + boxSpacing) + 8, gridStartY + currentGuess * (boxHeight + boxSpacing) + 8); display.setTextColor(ILI9341_WHITE); display.print(guess[i]); } if (strcmp(guess, targetWord) == 0) { showPopup("You Win!", ""); gameOver = true; return; } currentGuess++; charIndex = 0; memset(guess, 0, sizeof(guess)); if (currentGuess == maxGuesses) { char buffer[30]; sprintf(buffer, "The word is: %s", targetWord); showPopup("You lose!", buffer); gameOver = true; return; } } if (c == PS2_BACKSPACE && charIndex > 0) { charIndex--; guess[charIndex] = '\0'; display.fillRect(gridStartX + charIndex * (boxWidth + boxSpacing), gridStartY + currentGuess * (boxHeight + boxSpacing), boxWidth, boxHeight, ILI9341_BLACK); display.drawRect(gridStartX + charIndex * (boxWidth + boxSpacing), gridStartY + currentGuess * (boxHeight + boxSpacing), boxWidth, boxHeight, ILI9341_WHITE); } } } }
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.