Introducere Acest proiect are ca scop realizarea unei versiuni fizice a jocului clasic Sudoku. Jocul va fi afișat pe un ecran LCD, navigarea printre celulele grilei se va face cu ajutorul unui joystick, iar introducerea numerelor se va realiza prin intermediul unui keypad.
Obiectivul proiectului este de a crea o interfață interactivă și fizică pentru rezolvarea puzzle-urilor Sudoku, combinând elemente de programare, electronică și logică.
Descriere generală Sudoku este un joc de logică ce presupune completarea unei grile de 9×9 cu cifre de la 1 la 9, respectând anumite reguli stricte:
Fiecare rând trebuie să conțină o singură dată cifrele de la 1 la 9.
Fiecare coloană trebuie să conțină o singură dată cifrele de la 1 la 9.
Fiecare bloc de 3×3 celule (regiune) trebuie să conțină toate cifrele de la 1 la 9, fără repetiții.
În cadrul proiectului, ecranul LCD are rolul de a afișa grila și cifrele corespunzătoare, oferind utilizatorului o experiență vizuală clară a jocului. Introducerea cifrelor se face cu ajutorul keypad-ului, iar joystick-ul permite deplasarea între celule pentru selectarea poziției dorite.
Lista componente
1. Arduino UNO
2. Ecran LCD 1.8” SPI
3. Tastatura numerica 4*4
4. Joystick
5. Breadboard 400 de puncte
6. Rezistente + fire
Pentru realizarea componentei software am folosit mediul de dezvoltare Arduino IDE. Aplicatia este un joc de Sudoku care ruleaza pe un microcontroler si foloseste un ecran TFT, un joystick analogic si o tastatura 4×4.
Biblioteci folosite:
Structura codului si functiile folosite:
Se configureaza joystick-ul, tastatura si ecranul TFT. Se calculeaza dimensiunea fiecarei celule (cellWidth, cellHeight) in functie de rezolutia ecranului. Se apeleaza functia drawMainMenu() pentru a afisa meniul principal.
Afiseaza pe ecran titlul “SUDOKU” si instructiuni:
Incarca o tabla predefinita din predefinedBoards[index]. Marcheaza celulele care nu pot fi modificate (fixedCells[]). Initializeaza variabila filledCells. Apeleaza drawSudokuGrid() si drawBoldGridLines() pentru afisare.
- drawSudokuGrid() Deseneaza fiecare celula. Daca are o valoare, o afiseaza (text alb). Evidentiaza celula selectata cu un chenar rosu. - drawBoldGridLines() Deseneaza liniile groase pentru a marca fiecare subgrila 3×3.
Citeste pozitia joystick-ului (analogRead(X) si analogRead(Y)) si modifica selectedRow / selectedCol. Daca utilizatorul apasa o tasta intre 1 si 9, se apeleaza writeToCell(key).
Verifica daca celula este editabila (fixedCells). Daca da, salveaza cifra si coloreaza celula pentru a arata ca a fost modificata.
Daca tabla nu este completata (filledCells < TOTAL_CELLS), afiseaza mesajul “NOT FINISHED!”. Daca este completata, verifica: toate liniile, toate coloanele, toate subgrilele 3×3.
Daca totul e corect, afiseaza “YOU WON!”. Daca sunt greseli, afiseaza “TRY AGAIN!”. In toate cazurile, dupa afisarea mesajului se redeseneaza tabla (drawSudokuGrid() si drawBoldGridLines()).
Reseteaza valorile de stare (isInMenu, selectedRow, filledCells, etc.). Curata ecranul si afiseaza din nou meniul (drawMainMenu()), unde codul este deja optimizat:
Optimizari posibile: Debounce pentru joystick – ar reduce miscarile involuntare. Butonul joystick-ului (joystickButtonPin) nu este folosit – ar putea fi adaugata o functie de stergere celula. Feedback vizual pentru greseli – se pot colora celulele incorecte. Verificare in timp real – pentru a preveni introducerea cifrelor care incalca regulile. Oprire mai devreme la validare – algoritmul verifica tot jocul chiar daca gaseste o greseala; se poate optimiza.
Notiuni din laborator aplicate: