Introducere

Mi-am propus sa fac un joc de X si 0 de dimensiune 5×5, cu afisaj pe un LCD Nokia 3310.

Jocul implica existenta a doi jucatori, unul uman, celalalt fiind calculatorul. Pentru ca unul dintre cei doi sa castige, trebuie ca pe o linie/coloana/diagonala sa existe doar simbolul corespunzator acelui jucator ('x' sau '0'). Pe LCD vom observa evolutia jocului.

Ideea realizarii acestui proiect a pornit de la clasicul joc X si 0 de 3×3 patrate. M-am gandit ca e unul dintre jocurile clasice si ca ar fi amuzant sa il complic putin.

Scopul proiectului meu e sa demonstrez ca un joc simplu poate fi complicat (prin marirea dimensiunii) si ca poate fi implementat de oricine are la dispozitie o placuta de baza si un LCD.

Utilitate: In urma realizarii acestui proiect voi stapani mai bine tehnicile de programare ale unui microcontroller si ale unui LCD, ceea ce ma va ajuta in viitor.

Descriere generală

Vor fi 2 jucatori:

  • omul
  • calculatorul

Schema bloc este urmatoarea:

Voi folosi cele 25 de butoane pentru jucatorul uman. Prin apasarea unui buton se selecteaza casuta in care simbolul asociat acestuia va fi pus (simbolul poate fi fie X fie 0).

Pentru interactiunea cu utilizatorul voi folosi interfata seriala RS232.

De asemenea, evolutia jocului va putea fi observata pe LCD. In momentul in care unul dintre jucatori castiga, se afiseaza pe LCD jucator_alfa a castigat!, unde alfa este 1 pentru om si 0 pentru calculator.

Hardware Design

Componente:

  • Ecran LCD Hitachi HD44780
  • Placa de baza
  • 25 de butoane

Schema placii de baza este urmatoarea:

Pentru cuplarea LCD-ului voi folosi schema din laboratorul 1 de PM:

Software Design

Partea de software a acestui proiect va fi realizata in limbajul C folosind WinAvr.

Jocul propriu zis va fi construit dupa urmatoarii pasi:

Jocul incepe atunci cand ansamblul este conectat la un calculator real. Pentru a determina care jucator incepe (omul sau calculatorul) voi folosi o variabila generata random. Apoi jocul debuteaza. Intotdeauna, primul jucator va fi asociat cu simbolul 'x'.

  • Daca este randul jucatorului uman, atunci se asteapta apasarea unui buton din cele 25, iar in casuta indicata de buton se va pune 'x'. Calculatorul va calcula “mutarea” sa folosind un algoritm pentru jocuri invatat la Proiectarea Algoritmilor in anul 2 (minimax sau taiere alfa-beta). In pozitia calculata de el se va pune '0'. Acesti 2 pasi se repeta pana cand tabla de 5×5 patratele se umple (si atunci se verifica daca unul dintre jucatori a castigat, afisandu-se pe LCD un mesaj corespunzator) sau pana cand unul dintre cei doi a completat o linia/coloana/diagonala intreaga cu simbolul aferent lui. Daca nici unul nu a castigat, se afiseaza un mesaj corespunzator.
  • Daca este randul jucatorului calculator, atunci se aplica intai algoritmul pentru jocuri mentionat, apoi se asteapta input de la jucatorul uman. Se repeta acesti pasi pana cand unul dintre cei 2 castiga.

Pentru comunicatia cu LCD-ul, voi folosi functiile din laboratorul 1 de PM:

void LCD_init(); // Initializare modul LCD. 
                 // Trebuie apelata inainte de a se face orice operatie cu LCD-ul. 
                 // Initializarea este facuta considerand o interfatare pe 4 fire.
void LCD_writeInstruction(unsigned char _instruction); // Trimite o instructiune catre l.
void LCD_writeData(unsigned char _data); // Trimite date catre LCD pentru afisare.
void LCD_write(unsigned char _byte); // Trimite un byte catre LCD pe pinii D4-7 in 2 timpi.
                                     // Se trimit intai bitii mai semnificativi si apoi cei mai putin semnificativi.
void LCD_waitNotBusy(); // Functia asteapta pana cand lcd-ul devine disponibil pt o noua comanda.
void LCD_print(char* _msg); // Afiseaza imformatia pe LCD (doar 1 linie, primele 16 caractere din msg)
void LCD_print2(char* _msg1, char* _msg2); // Afisare pe 2 lini pe LCD. 
                                           // Pe prima linie afiseaza _msg1 si pe a 2-a _msg2.
void LCD_printDecimal2u(unsigned int _n);  // Afisare numar in baza 10 pe LCD
void LCD_printHexa(unsigned int _n);       // Afisare numar in baza 16 pe LCD
void LCD_waitInstructions(unsigned char _instructions); // Asteapta un numar de cicli de ceas

Rezultate Obţinute

In constructie.

Concluzii

Voi publica aceste concluzii dupa ce voi termina de implementat proiectul.

Bibliografie/Resurse

pm/prj2010/pgp/tictactoe5x5.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