Ion Oana-Roxana - Jocul X și 0 pe LCD

Autorul poate fi contactat la adresa de email: oana_roxana_97@yahoo.com

Introducere

Proiectul meu constă în implementarea jocului X si O pe LCD.
Am ales să implementez acest joc, deoarece este foarte cunoscut, mi se pare distractiv, scopul proiectului fiind acela de a crea o modalitate plăcută de a petrece timpul liber. Am pornit de la ideea de a realiza un joc relaxant și interactiv, care să poată fi jucat de cât mai multe persoane și, care, în același timp, mă va ajuta să exersez lucrul cu hardware-ul și cu tot ceea ce înseamnă folosirea unui microcontroller. Jocul va putea fi jucat atât jucător vs jucător, cât și un singur jucător, împotriva inteligenței artificiale, iar interacțiunea cu acesta se va realiza prin intermediul a 5 butoane: Up, Down, Right si Left și un buton de Enter/Select. La finalul jocului, în cazul în care un jucător câștigă se va aprinde un led de culoare verde, iar dacă este egalitate se va aprinde un led roșu.

Descriere generală

Schema bloc

Jocul se va desfășura în felul următor: se va afișa un mesaj în care user-ul este întrebat cum dorește să joace: împotriva unui alt user uman sau împotriva calculatorului, iar el va face selecția. Apoi, va începe jocul. Jucătorii se vor deplasa prin matricea 3 x 3 cu ajutorul butoanelor: Up, Down, Left, Right și vor introduce simbolul corespunzător prin intermediul butonului “Select”. Jocul se va termina în momentul în care un jucător reușește să completeze o linie, coloană sau diagonală cu același simbol. Dacă niciun jucător nu câștigă, va fi remiză. În momentul încheierii jocului, în funcție de rezultat, se va aprinde led-ul verde (dacă există un câștigător) sau roșu (dacă nu a câștigat nimeni).

Hardware Design

-Placa de bază
-Componentele de bază
-LCD SPI 1.8” (128 x 160)
-LED-uri rosii si verzi cu lentile difuze
-Butoane (4 butoane 6x6x6 si un buton cu capacul rosu)
-Placa test (70mm x 50mm)
-Rezistente (pentru leduri)
-Fire mama-mama si legaturi

Schema electrica

Software Design

Mediul de dezvoltare: Editor de text, pe Linux, iar compilarea in linie de comanda folosind un Makefile
Librarii si surse 3rd-party: Am folosit bibliotecile avr/io.h, util/delay.h, iar pentru LCD le-am folosit pe cele din laboratorul 5: ST7735R_TFT.h, spi.h
Funcțiile pentru LCD existente în librăria ST7735R_TFT.h, și pe care le-am folosit pentru implementarea jocului sunt:
-ST7735R_SendCommandList
-ST7735R_Begin
-ST7735R_Line
-ST7735R_DrawMonoSprite
-ST7735R_DrawText
-ST7735R_Circle
-ST7735R_FilledCircle

Pentru implementarea jocului am creat multiple funcții pentru a permite interacțiunea utilizatorului cu LCD-ul și butoanele și pentru a trata opțiunile introduse de acesta. Pentru început, am creat o pagină inițială (funcția draw_initial_page()), unde jucătorul își poate alege modul de joc: 2-players sau single-player, prin apăsarea butonului corespunzător. Am creat funcția mark_selected_square(), pentru a marca în ce căsuța se află jucătorul, funcție pe care am apelat-o în funcția check_selected_square(), în care identific patratelul în care player-ul s-a mutat. Apoi, în funcție de căsuța selectată de user, introduc simbolul corespunzător, cu ajutorul funcției put_symbol(). Identific faptul că jucătorul dorește introducerea simbolului prin apăsarea de către acesta a butonului “select”.
Pentru situația în care se alege varianta cu un singur player, calculatorul va alege o căsuța random, dintre cele libere, în care va introduce simbolul corespunzător, iar pentru această am creat funcția computer_choice().
În funcția check_winner(), verific dacă există un câștigător sau dacă este remiză, iar în funcția main() apelez această funcție și în funcție de rezultat afisez mesajul și aprind ledul corespunzător: led-ul verde în cazul în care există un câștigător și ledul roșu în cazul în care este egalitate. Inițial, voiam să folosesc și un buzzer, însă m-am gândit să nu încarc prea mult plăcuta de test care este destul de mică și am renunțat la el.

Rezultate obtinute

Proiectul este funcțional. Am atașat poze în diverse etape ale jocului.

ansamblu.jpg

Pagină inițială cu alegerea modului de joc.

msginitial.jpg

Joc câștigat.

winnerphoto.jpg

Afisez câștigătorul.

winnermsg.jpg

Remiză: nu există un câștigător.

drawphoto.jpg

Mesaj de remiză.

drawmsg.jpg

Partea din spate a placutei, cu lipituri.

parteadinspateplaca.jpg

Concluzii

A fost un proiect care mi-a plăcut foarte mult, la care am lucrat cu mare plăcere și din care am învățat multe lucruri. La început mi-a fost puțin teamă că nu voi reuși să realizez un joc funcțional, întrucât este primul proiect la care am lucrat efectiv la partea de hardware, care părea destul de dificil de realizat. S-a dovedit a fi nevoie de multă răbdare, îndemânare, iar la final, rezultatele pot fi extrem de plăcute. Cât despre partea de software, pot fi aduse îmbunătățiri variantei de joc cu un singur jucător, întrucât are cateva bug-uri, și cu siguranță mă voi ocupă de acest aspect in viitor.
Deși la început mi s-a părut destul de complicat, mi-a plăcut tare mult să lucrez la proiect și sunt încântată că am reușit să duc la îndeplinire ceea ce mi-am propus și anume, să creez un joc X și O funcțional. =)

Download

Schema electrică: schemafinalapm.sch
Arhiva cod: ionoanaroxana_336cb_xsi0_lcd.zip

Jurnal

25 aprilie - Am terminat de lipit plăcuta de bază
6 mai - Am făcut lista cu componentele necesare și le-am comandat
10 mai - Am început să lipesc componentele pe plăcută adițională: butoane, LED-uri și rezistente
17 mai - Am terminat de lipit componentele pe plăcută adițională, am testat faptul că acestea funcționează
17 mai - 23 mai - Am conectat LCD-ul, am scris codul pentru joc si l-am testat constant

Bibliografie/Resurse

pm/prj2019/rbarbascu/xsior336.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