Crack the code

Introducere

Proiectul este un joc de tip Crack the Code. Acesta consta din ghicirea unui cod numeric de 4 cifre generat aleatoriu de calculator. Jocul are doua dificultati: easy si hard, diferenta dintre ele constand in cantitatea de informatii pe care o primeste jucatorul ca raspuns. Astfel, jucatorul va incerca diferite grupuri de 4 cifre si va primi ca raspuns numarul de cifre care sunt corecte pe pozitia corecta.
De exemplu:
Daca codul generat este 4921 si jucatorul introduce 3912, o singura cifra este corecta pe pozitia corecta (adica cifra 9)
Scopul este ca jucatorul sa ajunga la valoarea generata initial intr-un timp cat mai scurt.

Descriere generala

Jucatorul se va folosi de un numpad pentru a tasta cifrele dorite, buzzer-ul emitand un semnal sonor pentru fiecare cifra tastata. Acestea vor aparea pe un ecran de tip LCD pentru a vedea posibilele erori de tastare si a le putea remedia. Pentru modificarea valorii tastate, jucatorul se va folosi de butonele stanga (*) dreapta (#) pentru a ajunge la cifra gresita si va apasa o alta cifra pentru a o suprascrie.
Dupa ce jucatorul va apasa pe butonul verde cu rol de “submit”, jocul va transmite raspunsul, aprinzand ledurile RGB cu verde pentru fiecare cifra corecta pe pozitia corecta si cu rosu in caz contrar. De aici jucatorul poate apasa pe butonul verde pentru a mai introduce un cod sau pe butonul rosu pentru a renunta, caz in care codul va fi afisat.

Hardware Design

Lista de piese principale:

  • placuta arduino uno R3
  • 4 leduri RGB
  • numpad
  • ecran LCD
  • un buton de submit
  • un buton de reset joc
  • buzzer

schema_pm_v3.jpg

Software Design

Descrierea codului aplicaţiei (firmware):

  • Mediu de dezvoltare este Arduino IDE.
  • Librariile include sunt Keypad_I2C.h si LiquidCrystal_I2C.h pentru simplificarea utilizarii LCD-ului si al Numpad-ului cu ajutorul protocolului I2C.

Organizarea Codului

Structuri folosite:

  • structura pentru led-uri contine doua campuri: redPin - numarul pinului pentru culoarea rosie si greenPin - pinul pentru culoareaverde. Pinul albastru va ramane in aer pentru ca nu am nevoie de aceasta culoare.
  • enum pentru starile prin care va trece jocul: MENU, CHOOSE_DIFF, GAME, EASY_CHECK_CODE, HARD_CHECK_CODE, FINAL, CHOOSE_GIVE_UP, FINAL_GIVE_UP
  • array pentru codul generat de calculator (code[4])
  • array pentru codul introdus de jucator (code_input[4])

Functii implementate standard:

  • setup(): initializarea pinilor ca INPUT sau OUTPUT
  • loop(): apeleaza functiile specifice pentru state-ul in care se afla jocul. Va incepe cu MENU.

Functii implementate pentru state-uri:

  • menu(): va printa numele jocului si trecerea spre urmatorul state, va astepta o apasare de buton verde pentru a trece la state-ul CHOOSE_DIFF.
  • choose_diff(): va printa optiunile de dificultate “easy” si “hard”. Jucatorul poate alege navigand stanga prin apasarea (*) si dreapta prin apasarea (#). Pentru a confirma alegerea, se asteapta apasarea butonului verde. Pentru a se intoarce in state-ul de pornire se va apasa butonul rosu.
  • game(): va procesa tastele apasate pe numpad de catre jucator si va verifica corectitudinea acestora (correct_code[i] = 1, daca este corecta si correct_code[i] = -1, daca este gresita). Fiecare apasare va genera un sunet prin buzzer. Jucatorul poate adauga cifrele in ce ordine doreste, pentru a face acest lucru va muta cursorul stanga(*) dreapta(#). Cand o cifra este selectata, va palpai si daca jucatorul apasa o alta tasta, cifra va fi suprascrisa. Pentru a trimite codul, jucatorul va apasa butonul verde. In situatia in care jucatorul nu a tastat toate cele 4 cifrele, buzzer-ul va scoate un sunet si jocul nu va progresa. Daca jucatorul vrea sa renunte la jocul curent, poate apasa pe butonul rosu.
  • easy_check_game(): va calcula cate cifre sunt corecte si va aprinde atatea leduri verzi, restul rosii. Va scrie pe lcd cate cifre au fost corecte si le va arata pozitia in cod. Daca jucatorul vrea sa renunte la jocul curent, poate apasa pe butonul rosu.
  • hard_check_game(): va calcula cate cifre sunt corecte si va aprinde atatea leduri verzi, restul rosii. Va scrie pe lcd cate cifre au fost corecte. Daca jucatorul vrea sa renunte la jocul curent, poate apasa pe butonul rosu.
  • final(): va fi apelat daca toate cifrele sunt corecte. Va printa un mesaj de incurajare si va intreba jucatorul daca vrea sa joace din nou. La apasarea butonului verde, se va intoarce in state-ul de menu.
  • choose_give_up(): va fi apelata daca jucatorul vrea sa renunte prin apasarea butonului rosu. Jucatorul poate alege intre “yes” si “no” prin mutarea cursoului stanga(*) dreapta(#). Pentru a confirma decizia, jucatorul trebuie sa apese butonul verde.
  • final_give_up(): va scrie pe lcd care este codul corect si va intreba jucatorul daca vrea sa joace din nou. Pentru a face acest lucru, jucatorul trebuie sa apese butonul verde, iar jocul se va intoarce in state-ul CHOOSE_DIFF.

Functii ajutatoare:

  • setColor(int redValue, int greenValue, int blueValue, RGBLed led): Valorile pentru rosu, verde si albastru si ledul pe care sa il aprinda.
  • beep(int ms, uint8_t freq): Numarul de milisecunde si frecventa pentru buzzer
  • get_button_input(int buttonPin): debounce button
  • pressed_one_time(int buttonPin): va verifica daca butonul a fost apasat si va returna true cand butonul nu mai este eliberat.

Rezultate Obţinute

Concluzii

O experienta interesanta

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

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.

Jurnal

  • Update schema fusion
  • Adaugare Software Design
  • Adaugare github
  • Adaugare youtube

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2024/mdinica/andreea.drehuta.txt · Last modified: 2024/05/26 23:28 by andreea.drehuta
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0