Proiectul realizat de mine consta in realizarea renumitului joc Sudoku de dimensiune 4×4. Acest joc poate fi jucat de o singura persoana, care va avea la dispozitie mai multe grile. Aceste grile reprezinta o rezolvarea partiala, scopul jocului fiind de a umple fiecare grila cu numere de la 1 la 4 respectand anumite conditii. Interesul jocului consistă în simplitatea regulilor sale si in complexitatea solutiilor.
Jocul este propus sub forma unei grile de 4×4, impartita in sub-grile de 2×2, numite “regiuni”. Cateva celule conţin cifre, asa-numitele “casute precompletate”. Scopul este acela de a umple celulele goale, cu cate o cifra in fiecare celula, in asa fel incat fiecare rand, fiecare coloana si fiecare regiune sa contina cifrele de la 1 la 4 o singura data. In consecinta, fiecare cifra a solutiei apare o singura data in trei “directii”, de unde numele “cifra unica”. Cand o cifra poate fi inscrisă intr-o celula, aceasta se numeste candidata.
Pentru realizarea proiectului voi avea nevoie de urmatoarele componente:
Jucatorul va putea vizualiza grila de joc pe ecranul LCD. Folosind cele patru butoane (UP, DOWN, RIGHT, LEFT) se va putea muta dintr-o celula intr-alta. Cand doreste sa schimbe o celula va apasa butonul din mijloc (SELECT), si va selecta cifra dorita folosind potentiometrul (NUMBER).
Schema bloc a modulelor este prezentata mai jos:
Lista de piese:
Schema electrica a circuitului este:
Pentru dezvoltare am folosit un driver luat de la 37.
Acesta a fost putin modificat deoarece pinii nu corespundeau cu harwdware-ul meu.
Am adaugat diferite functii pentru a activa/dezactiva pixeli, pentru a desena linii si caractere.
Pentru a citi valoarea potentiometrului la un anumit moment dat citesc valoarea de la ADC de pe canalul 0. Am impartit intreg intervalul [0-1024] in 5 zone, pentru a intoarce exact rezultatul de care am nevoie.
In aplicatie folosesc 6 butoane. Pentru acestea am activat rezistente de pull-up programatic.
Tabelele sunt retinute in memoria EEPROM, sub forma a doi intregi pe 32 de biti (in total 64 de biti). Pentru fiecare casuta din grid am folosit 4 biti pentru a retine valoarea (0, 1, 2, 3 sau 4). Astfel, pentru cele 16 casute din grid, aveam nevoie de un numar de 64 biti. Valoarea din celula [i,j] se gaseste in cei 4 biti (i*4+j)*4..(i*4+j)*4+3 din cei 64 de biti alocati pentru fiecare tabela. Am ales aceasta varianta deoarece era imposibil sa retin nu numar mare de gile intr-o memorie asa mica (16k).
La pornire, pe display se vede grid-ul initial de joc, completat cu numerele corespunzatoare. Acest grid este ales de fiecare data aleator, dificultatea fiecaruia variind.
Jucatorul are la dispozitie 6 butoane si un potentiometru pentru a modifica valorile unei casute. Cu ajutorul a patru butoane se deplaseaza stanga, dreapta, sus si jos, pentru a selecta casuta in care doreste sa schimbe numarul. In momentul in care doreste sa schimbe numarul, apasa butonul din mijloc (SELECT) si apoi seteaza valoarea casutei cu ajutorul potentiometrului. Cand se ajunge la valoarea dorita se apasa din nou butonul (SELECT) pentru a seta valoarea.
In cazul in care se incearca sa se schimbe o valoare initiala a gridului se declanseaza o eroare, aprinzandu-se LED-ul rosu. Acelasi LED este aprins si in momentul in care pe grid sunt valori eronate conform reguluilor jocului.
Jucatorul poate oricand sa renunte la tabla de joc si sa inceapa altul nou, printr-o singura apasare de buton (RESET). In cazul incheierii cu succes a unui joc, se porneste unul nou cu o grila noua.
Initial pe LCD nu se putea observa nimic. Dupa mai multe teste am reusit sa-l fac sa mearga, dar nu in totalitate. Fiind singura problema, l-am schimbat cu usurinta si apoi totul a mers.
Jocul se poate juca foarte usor, cum am explicat mai sus. Initial, din lipsa de timp, nu am pus decat cateva grile de joc, urmand ca pe parcurs sa maresc numarul lor.
Din pacate nu mi-a intrat toata grila pe ecran (LCD-ul are doar 48 de pixeli pe verticala, iar eu aveam nevoie de 49 de pixeli). Astfel pe ultimul rand al tabelului a trebuit sa fac o modificare usor sesizabila pentru a pastra integritatea grilei.