This shows you the differences between two versions of the page.
|
pm:prj2021:agrigore:connect4 [2021/05/18 11:58] mihaela.nuta1207 |
pm:prj2021:agrigore:connect4 [2021/06/03 14:38] (current) mihaela.nuta1207 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Connect4 ====== | ====== Connect4 ====== | ||
| + | |||
| ===== Autor ===== | ===== Autor ===== | ||
| [[mihaela.nuta1207@stud.acs.upb.ro|Nuță Mihaela-Mădălina]] | [[mihaela.nuta1207@stud.acs.upb.ro|Nuță Mihaela-Mădălina]] | ||
| + | |||
| + | |||
| ===== Introducere ===== | ===== Introducere ===== | ||
| * Scopul proiectului este de a implementa, folosind un ecran LCD, jocul Connect4 | * Scopul proiectului este de a implementa, folosind un ecran LCD, jocul Connect4 | ||
| Line 8: | Line 11: | ||
| * Ideea de pornire a fost implementarea unui joc 1 vs. 1 care să fie cât de cât interactiv. =) | * Ideea de pornire a fost implementarea unui joc 1 vs. 1 care să fie cât de cât interactiv. =) | ||
| * Modul de control al jocului va fi: butonul verde, fiind un buton de selecție, va fi folosit pentru a selecta meniurile jocului și pentru a selecta coloana în care jucătorul va dori să dea drumul discului. Pentru a schimba coloana, jocătorul va apăsa pe butonul roșu din stânga sau pe butonul roșu din dreapta. | * Modul de control al jocului va fi: butonul verde, fiind un buton de selecție, va fi folosit pentru a selecta meniurile jocului și pentru a selecta coloana în care jucătorul va dori să dea drumul discului. Pentru a schimba coloana, jocătorul va apăsa pe butonul roșu din stânga sau pe butonul roșu din dreapta. | ||
| - | ==== Poză reprezentativă ==== | + | |
| + | ==== Poză descriptivă ==== | ||
| {{:pm:prj2021:agrigore:connect4.jpg|}} | {{:pm:prj2021:agrigore:connect4.jpg|}} | ||
| + | * Link către reguli: [[https://www.gamesver.com/the-rules-of-connect-4-according-to-m-bradley-hasbro/]] | ||
| + | |||
| + | |||
| + | |||
| + | |||
| ===== Descriere generală ===== | ===== Descriere generală ===== | ||
| + | |||
| ==== Schemă bloc ==== | ==== Schemă bloc ==== | ||
| - | {{:pm:prj2021:agrigore:diagrama.png?500|}} | + | {{:pm:prj2021:agrigore:conect4diag.png?500|}} |
| ==== Funcționalitate ==== | ==== Funcționalitate ==== | ||
| Plăcuța va primi input de la 3 butoane de control: | Plăcuța va primi input de la 3 butoane de control: | ||
| Line 27: | Line 37: | ||
| * dupa câteva secunde, jucătorii sunt anunțați că pot da **replay** la joc apăsând butonul verde | * dupa câteva secunde, jucătorii sunt anunțați că pot da **replay** la joc apăsând butonul verde | ||
| * butonul de replay duce jocul în starea inițială (meniul principal de unde se poate alege începerea jocului) | * butonul de replay duce jocul în starea inițială (meniul principal de unde se poate alege începerea jocului) | ||
| + | |||
| Outputul va fi realizat cu ajutorul: | Outputul va fi realizat cu ajutorul: | ||
| * un modul LCD SPI | * un modul LCD SPI | ||
| Line 44: | Line 55: | ||
| * un buzzer pasiv cu diverse sunete | * un buzzer pasiv cu diverse sunete | ||
| * leduri care vor fi in sincronizare cu starea jocului (doar de decor) | * leduri care vor fi in sincronizare cu starea jocului (doar de decor) | ||
| + | |||
| + | |||
| + | |||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| + | |||
| ==== Listă de piese ==== | ==== Listă de piese ==== | ||
| * Arduino | * Arduino | ||
| Line 53: | Line 68: | ||
| * leduri | * leduri | ||
| * 2 x breadbord | * 2 x breadbord | ||
| + | |||
| ==== Schema conectare LCD - Uno r3 și butoane ==== | ==== Schema conectare LCD - Uno r3 și butoane ==== | ||
| {{:pm:prj2021:agrigore:schema_placa-lcd-v2.jpg?600|}} | {{:pm:prj2021:agrigore:schema_placa-lcd-v2.jpg?600|}} | ||
| + | * După cum se observă și în imagine, ecranul LCD trebuie conectat astfel: | ||
| + | |||
| + | ^ Pin LCD ^ Pin Arduino ^ | ||
| + | |LED |3.3V| | ||
| + | |SCK |13 | | ||
| + | |SDA |11 | | ||
| + | |A0 sau DC|9 | | ||
| + | |RESET |8 | | ||
| + | |CS |10 | | ||
| + | |GND |GND | | ||
| + | |VCC |5V | | ||
| + | |||
| + | |||
| ===== Software Design ===== | ===== Software Design ===== | ||
| * mediu de dezvoltare - **Arduino Ide** | * mediu de dezvoltare - **Arduino Ide** | ||
| Line 61: | Line 90: | ||
| * **TFT.h** - librărie Arduino pentru ecran tft | * **TFT.h** - librărie Arduino pentru ecran tft | ||
| * **SPI.h** - librărie Arduino pentru comunicare SPI având ca master plăcuța Arduino | * **SPI.h** - librărie Arduino pentru comunicare SPI având ca master plăcuța Arduino | ||
| - | * algoritmi şi structuri | + | * Un exemplu Arduino built-in: [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody]] |
| - | * surse şi funcţii implementate | + | |
| + | ==== Diagrama stărilor ==== | ||
| + | {{:pm:prj2021:agrigore:semnaleconnect4.png?700|}} | ||
| + | * **BEGIN**: se afișează pe ecran mesajul: __Press green to play__ | ||
| + | * **GAMEPLAY**: fiecare jucător, rând pe rând, se mișcă stânga dreapta cu cele 2 butoane roșii. Selectează coloana preferată cu butonul verde. Pe ecran este afișat un grid de 6x7, discul care urmează a fi pus in grid, cât și un mesaj care informează despre rândul curent. Acest mesaj este: **Player turn: 0/1**, unde 0 și 1 sunt colorate corespunzător. După ce discul este pus, noul disc se va repoziționa în mijlocul gridului | ||
| + | * **WIN SCREEN**: după ce un jucător căștigă, după un delay, se șterge rândul curent și se afișează cine este câștigătorul printr-un mesaj intermitent. Totodată, câștigul este anunțat printr-o melodie | ||
| + | * **REPLAY SCREEN**: dupa câteva secunde, pe ecran apare: **PRESS GREEN TO PLAY**. După ce se apasă pe butonul verde, jocul repornește, iar starea va deveni starea inițială, adică **BEGIN** | ||
| + | |||
| + | ==== Implementare ==== | ||
| + | * Pe baza butoanelor, jocul poate fi urmărit ca un automat de stări. | ||
| + | * În loop se pot observa aceste stări: GAME_INIT, GAME_BEGINS, GAME_STARTED, cât și alte variabile de stare: player_switched (care imi spune dacă un player și-a realizat tura, eu ar trebui să afișez pe ecran ceea ce el a făcut, iar următorul jucător poate continua) | ||
| + | * Am ales să folosesc destul de multe variabile de stări, înafară de acestea, deoarece am dorit să nu desenez la fiecare apel de loop încontinuu aceleași forme care oricum erau desenate. | ||
| + | * În funcție de starea jocului, în anumite situații, am ales să redesenez ceea ce voiam să șterg cu culoarea background-ului, deoarece era mai costisitor să dau clear la ecran, după care să redesenez totul (în primul rând ar fi trebui să țin minte ce am desenat și în al 2-lea rând ecranul ar fi făcut un flicker constant, ceea ce ar fi fost urât). | ||
| + | * Se poate observa că în cod sunt foarte multe define-uri, deoarece am vrut să economisesc cât mai multă memorie, define-urile fiind folosite doar in etapa de preprocesare | ||
| + | |||
| ===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
| + | * {{:pm:prj2021:agrigore:1.jpeg?400|}} | ||
| + | * {{:pm:prj2021:agrigore:2.jpeg?400|}} | ||
| + | * {{:pm:prj2021:agrigore:3.jpeg?400|}} | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | * Jocul este unul practic, realizat destul de low-cost. Am reușit să realizez tot ce mi-am propus, ba chiar am adăugat și lucruri în plus (la nivel de efect/software) | ||
| + | * Dacă nu ai jocuri, îți faci LOL | ||
| ===== Download ===== | ===== Download ===== | ||
| + | {{:pm:prj2021:agrigore:nuta_mihaela_madalina_334cb_connect4.zip|}} | ||
| ===== Jurnal ===== | ===== Jurnal ===== | ||
| * 26 aprilie - creare pagină pe ocw | * 26 aprilie - creare pagină pe ocw | ||
| Line 76: | Line 124: | ||
| * Funcționalitate | * Funcționalitate | ||
| * Listă de piese | * Listă de piese | ||
| - | * 15 mai - prototip butoane (butoanele sunt funcționale) | + | * 15 mai |
| - | * 16 mai - Hello World pe ecranul lcd controlat de butoane | + | *prototip butoane (butoanele sunt funcționale) |
| - | * 17 mai | + | * Hello World pe ecranul lcd controlat de butoane |
| + | * 16 mai | ||
| * ecran de start | * ecran de start | ||
| * ecran de joc | * ecran de joc | ||
| * chenarul jocului (tabla) | * chenarul jocului (tabla) | ||
| * grid-ul jocului (al tablei) | * grid-ul jocului (al tablei) | ||
| - | * 18 mai - funcționalitatea jocului e completă | + | * 17 mai - funcționalitatea jocului e completă |
| * bilele cad în locul selectat | * bilele cad în locul selectat | ||
| * fiecare jucător are acum culoarea lui asignată | * fiecare jucător are acum culoarea lui asignată | ||
| Line 90: | Line 139: | ||
| * funcționalitate de replay | * funcționalitate de replay | ||
| * {{:pm:prj2021:agrigore:connect4_-_functional.jpeg?500|}} | * {{:pm:prj2021:agrigore:connect4_-_functional.jpeg?500|}} | ||
| + | * 18 mai | ||
| + | * led RGB care se colorează în funcție de rândul jucătorilor si starea jocului | ||
| + | * buzzer care se alătură apăsării butoanelor | ||
| + | * se aude un sunet atunci când există o victorie | ||
| + | * {{:pm:prj2021:agrigore:led.jpeg?300|}} | ||
| ===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
| Line 95: | Line 149: | ||
| * documentație librărie tft.h: [[https://www.arduino.cc/en/Reference/TFTLibrary]] | * documentație librărie tft.h: [[https://www.arduino.cc/en/Reference/TFTLibrary]] | ||
| * librăria PinChangeInt: [[https://code.google.com/archive/p/arduino-pinchangeint/downloads]] | * librăria PinChangeInt: [[https://code.google.com/archive/p/arduino-pinchangeint/downloads]] | ||
| + | * sunete: [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody]] | ||
| + | * PDF pagina wiki: [[https://ocw.cs.pub.ro/courses/pm/prj2021/agrigore/connect4?do=export_pdf|Connect4]] | ||