Adrian DUMITRACHE (78642) - Hangman

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

In acest proiect vreau sa fac o implementare a cunoscutului joc Hangman. Acesta se joaca in 2 si este afisat pe un LCD grafic. Prima data un jucator alege un cuvant format doar din litere mici ale alfabetului englez. Aceste litere sunt apoi inlocuite de caracterul “_”, urmand ca celalalt jucator sa ghiceasca pe rand cate o litera din componenta cuvantului. Daca acesta ghiceste o litera, va aparea litera respectiva in toate pozitiile sale in locul caracterului “_”. Daca nu exista litera respectiva va fi adaugata o parte a corpului omului care urmeaza sa fie spanzurat. Jocul se termina atunci cand omul este desent complet ceea ce inseamna ca primul jucator a castigat, sau cand cuvantul este complet ceea ce inseamna ca jucatorul 2 a castigat. Omul are 6 componente, deci sunt 6 vieti. Acest joc este destinat copiilor si are in primul rand scopul de divertisment. De asemenea are si un scop educativ, deoarece ajuta la dezvoltarea vocabularului jucatorului 2, lucru esential pentru copii. Mi-am dorit sa fac un joc interactiv destul de cunoscut pentru a putea exemplifica prin ceva practic neinitiatilor in calculatoare ce se intampla la aceasta facultate.

Descriere generală

Schema bloc:

Descriere componente:

Placa de baza ce contine microcontroller-ul Atmega324.

Display LCD grafic utilizat pentru afisarea cuvintelor si a omului spanzurat.

Keypad cu 16 taste utilizat pentru primirea de input de la utilizator: cifrele 0-9 asemeni tastaturii nokia si in plus un buton pentru confirmare si unul pentru stergere al unui caracter.

Hardware Design

Lista de componente necesare:

- kit-ul de componente de baza;

- keypad;

- LCD grafic;

- translator bidirectional 3.3V - 5V - CJMCU-0108;

- sursa de tensiune 3.3V - LM1086IT-3.3;

- cablu pentru alimentare pe seriala de la pc;

- fire mama-mama;

- fire mama-tata.

Software Design

Proiectul a fost realizat si compilat folosind avr-gcc. Functionalitatea acestuia este urmatoarea:

Jocul este destinat folosirii de catre doi utilizatori simultan: unul care va introduce un cuvant si celalalt care va fi provocat sa ghiceasca respectivul cuvant. Initial pe ecranul de pornire se cere cuvantul pentru Player1 si sunt afisate comenzile de stergere a unui caracter si de confirmare a cuvantului dorit. Apoi se schimba ecranul astfel:

  • pe prima linie apare cate o steluta( '*' ) pentru fiecare litera a cuvantului
  • se cere introducerea unei litere urmate de butonul 'D' pentru submit.
  • urmeaza spatiul rezervat literei introduse
  • in subsol exista lista cu literele introduse gresit
  • in dreapta se pOATE vizualiza grafic progresul in functie de cat de mult este desenat din stick man(6 vieti in total)

Exista 2 ecrane in functie de rezultatul jocului, cel de win si cel de lose. In ambele situatii este precizat si cuvantul corect pentru a nu exista dubii ca cineva a trisat.

Cifrele de la 1 la 9 au asociate fiecare cate un sir de caractere: “abc”, “def”, “ghi”, “jkl”, “mno”, “pqr”, “stu”, “vwx”, “yz ”. Pentru a sterge un caracter se foloseste tasta '0', iar 'D' pentru submit.

Pentru a desena o parte a corpului omului folosesc functia void draw_body(); implementata de mine. Functia void check(); verifica daca litera introdusa face parte din cuvant si o afiseaza fie in cuvant fie la categoria “Bad letters”. Am 2 functii de printat caractere destul de asemanatoare. Diferenta este ca void print2(char character, int order); nu are nevoie de repozitionarea cursorului. Parametrul order inseamna a cata litera de pe tasta respectiva, spre exemplu tasta 1 - “abc”, daca order == 0, atunci se afiseaza 'a', daca order == '1' se afiseaza 'b'. Functia char get_character(int key); returneaza x, daca nu a fost apasat niciun buton, sau valoarea butonului apasat. In main am facut timerul de asteptare astfel incat sa se poate introduce un caracter de 2 ori la rand sau ceva de forma “ab”, cu un delay de peste 1 secunda, pentru a avea timp sa se ajunga la litera dorita. Pentru ca userul sa aiba timp sa introduca ce cuvant isi doreste(maxim 12 caractere) am pus totul intr-un while(1), astfel se pot introduce date oricand, pseudoasincron. Bibliotecile folosite sunt luate din referinte si modificate de mine. De asemenea am adaugat si alte functii noi in acele biblioteci precum desenarea unui cerc, sau a unei drepte oblice.

Rezultate Obţinute

Concluzii

Proiectul mi-a iesit cum imi propusesem pentru timpul alocat. Am testat jucandu-ma cateva ore si am dat si unor colegi sa se joace si nu a aparut vreun comportament neasteptat. Ca functionalitate suplimentara m-am gandit sa fac si varianta singleplayer in care se alege dintr-un dictionar un cuvant random, dar la jumatatea drumului mi-am dat seama ca nu asta e scopul jocului Hangman, sa fie doar un “Guess the word”, ci interactiunea dintre 2 oameni il face interesant, asa ca am renuntat.

Download

Jurnal

15 mai: am implementat jocul in sine;

14 mai: am convertit caracterele tastaturii in literele alfabetului;

12 mai: am facut tastatura functionala;

11 mai: am facut LCD-ul functional;

10 mai: am facut ultimele lipituri, inclusiv lipirea translatorului si m-am documentat despre conectarea LCD-ului;

3 mai: am facut schema electrica in eagle;

25 aprilie: am lipit placa de baza;

19 aprilie: am detaliat proiectul pe pagina mea;

12 aprilie. am ales tema proiectului și primit ACK din partea asistentului pentru categoria nota 10.

Bibliografie/Resurse

pm/prj2018/rbarbascu/dumitrache-adrian.txt · Last modified: 2021/04/14 17:07 (external edit)
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