This shows you the differences between two versions of the page.
pm:prj2021:avaduva:minesweeper [2021/04/25 00:43] ana_maria.radu0306 created |
pm:prj2021:avaduva:minesweeper [2021/05/26 15:40] (current) ana_maria.radu0306 |
||
---|---|---|---|
Line 1: | Line 1: | ||
=====Minesweeper===== | =====Minesweeper===== | ||
- | ==Autor: Ana-Maria Radu== | + | ====Autor: Ana-Maria Radu==== |
===Introducere=== | ===Introducere=== | ||
- | Proiectul va implementa jocul Minesweeper pe o matrice de LED-uri. Initial, toate LED-urile sunt stinse, in afara de unul alb care indica pozitia curenta a jucatorului. Jucatorul se poate muta in cele 4 directii folosind butoane, si poate selecta un anumit LED pentru inspectare. Daca LED-ul se aprinde verde, inseamna ca nu exista o bomba pe acea pozitie, insa poate declansa aprinderea cu galben a LED-urilor din jurul sau daca ele sunt posibile bombe (daca se afla la mai putin de 2 pozitii de o bomba). Daca jucatorul selecteaza o casuta pe care se afla o bomba, LED-ul respectiv va lumina rosu. | + | Proiectul implementeaza o varianta minimalista a Minesweeper pe o matrice de LED-uri. Scopul sau este de a oferi o interfata intuitiva si usor de folosit pentru utilizator, pentru a face jocul una dintre acele activitati "no-brainer" pe care le poti face oricand, chiar si in timpul cursurilor^_^.\\ |
+ | ==Reguli si desfasurarea jocului== | ||
+ | Jucatorul are la dispozitie 5 butoane (select + 4 directii de deplasare) pe care le foloseste pentru a interactiona cu matricea de LED-uri. Initial, toate LED-urile sunt stinse, in afara unui cursor care lumineaza alb pentru a indica pozitia curenta.\\ | ||
+ | Jucatorul muta cursorul pana la pozitia dorita si apoi apasa butonul Select, care va "descoperi" pozitia, adica va lumina: | ||
+ | * Rosu, daca jucatorul a descoperit o bomba | ||
+ | * Galben, daca jucatorul se afla la distanta 1 de o bomba (distanta se calculeaza inclusiv pe diagonala) | ||
+ | * Verde, daca jucatorul a descoperit o casuta "safe" | ||
+ | Daca jucatorul selecteaza o bomba, jocul se considera pierdut, se afiseaza o animatie de final si mesajul "You lost! Try again?", urmat de un meniu in care are posibilitatea de a alege sa continue sau nu (meniul consta in doua LED-uri aprinse pe matrice, unul rosu si unul verde, semnificand cele doua decizii posibile; jucatorul poate selecta unul dintre ele folosind cursorul).\\ | ||
+ | \\ | ||
+ | Daca jucatorul a descoperit toate pozitiile in afara de bombe, jocul se considera castigat, se afiseaza o animatie de victorie si mesajul "You won! Try again?", urmat, din nou, de meniul cu cele doua decizii posibile.\\ | ||
+ | \\ | ||
+ | Daca se alege continuarea jocului, totul se reseteaza si utilizatorul poate incepe o runda noua. Daca, in schimb, se alege terminarea lui, se afiseaza mesajul "Goodbye!" si se sting toate LED-urile, mimand inchiderea dispozitivului. | ||
+ | ==Inspiratie si utilitate== | ||
+ | Am pornit de la implementarea clasica a jocului, insa am ales sa folosesc coduri de culori in loc de cifre pentru a indica proximitatea fata de o bomba. Cred ca acest proiect este util pentru ca poate fi folosit in viata reala ca un joc minimalist, iar pentru mine a fost folositor din perspectiva procesului de invatare prin care am trecut pe tot parcursul realizarii lui.\\ | ||
- | {{:pm:prj2021:avaduva:schema_bloc_minesweeper.png?nolink&700|}} | + | ===Descriere generala=== |
+ | Mai jos este schema bloc a proiectului:\\ | ||
+ | {{ :pm:prj2021:avaduva:schema_bloc_minesweeper.png?nolink&700 |}} | ||
===Hardware Design=== | ===Hardware Design=== | ||
- | * Arduino UNO | + | {{:pm:prj2021:avaduva:schema_electrica_minesweeper.png?nolink&700|}} |
- | * Matrice 8x8 de LED-uri | + | |
- | * BreadBoard | + | Schema electrica poate fi vizualizata si [[https://www.tinkercad.com/things/cJ1YH9AxvQu-frantic-snicket/editel?sharecode=IntEsWyf4N1idzXSIe-R5bWpcdam0W34bQAlzT7aSbc|aici]], folosind Tinkercad. |
- | * Butoane | + | |
- | * Buzzer | + | Componentele folosite sunt: |
- | * Rezistente | + | ^ Componenta ^ Cantitate ^ Alimentare ^ |
- | * Fire de legatura | + | | [[https://www.optimusdigital.ro/ro/placi-avr/656-uno-r3-atmega328p-atmega16u2-placa-de-dezvoltare-compatibila-cu-arduino-cablu-30-cm.html?search_query=Placa+de+Dezvoltare+Compatibila+cu+Arduino+UNO+R3+%28ATmega328p+++ATmega16u2%29+++Cablu+30+cm&results=2|Arduino UNO]] |1|5V| |
+ | | [[https://www.optimusdigital.ro/ro/optoelectronice-matrice-de-led-uri/4392-matrice-cu-led-uri-rgb-ws2812-8x8.html?search_query=Matrice+cu+LED-uri+RGB+WS2812+%288x8%29&results=2|Matrice 8x8 de LED-uri]]|1|5V| | ||
+ | |[[https://ardushop.ro/ro/electronica/33-breadboard-830.html?search_query=breadboard&results=15|BreadBoard]]|1| | | ||
+ | |[[https://www.optimusdigital.ro/ro/butoane-i-comutatoare/1119-buton-6x6x6.html?search_query=butoane&results=198|Butoane]]|5| | | ||
+ | |Fire de legatura tata-tata|16| | | ||
===Software Design=== | ===Software Design=== | ||
+ | Jocul a fost dezvoltat in Arduino Editor Online, folosind biblioteca | ||
+ | * [[https://github.com/adafruit/Adafruit_NeoMatrix|Adafruit_NeoMatrix.h]] | ||
+ | Pentru logica jocului se folosesc doua matrici, una de tip Adafruit_NeoMatrix care controleaza starea LED-urilor, iar alta interna de 8x8 intregi, care retine pozitia bombelor (pozitiile sunt generate folosind functia rand()). | ||
+ | |||
+ | La inceput, se initializeaza matricile si alte variabile globale si se seteaza cursorul pe pozitia (0, 0). La fiecare Select, se verifica starea jocului (daca este peirdut, castigat sau se continua). | ||
+ | |||
+ | Logica programului este urmatoarea:\\ | ||
+ | {{ :pm:prj2021:avaduva:schema_software_minesweeper.png?nolink&800 |}} | ||
+ | \\ | ||
+ | Implementare software: {{:pm:prj2021:avaduva:minesweeper.txt|}} | ||
===Rezultate=== | ===Rezultate=== | ||
+ | [[https://youtu.be/m28fmnfQop4|Link catre YouTube Demo]] | ||
+ | |||
+ | Jocul este fully functional, logica functioneaza asa cum s-ar astepta un utilizator normal. | ||
===Concluzii=== | ===Concluzii=== | ||
+ | Proiectul a fost o experienta foarte placuta. Pentru mine, a fost primul proiect in care am folosit si hardware astfel, deci mi-a placut sa invat sa lucrez practic. Cateva mici imbunatatiri pot fi aduse in urma utilizarii mai indelungate, de exemplu legat de sensibilitatea butoanelor, insa in final cred ca experienta mi-a depasit asteptarile. | ||
===Download=== | ===Download=== | ||
+ | {{:pm:prj2021:avaduva:minesweeper_anamariaradu_334ca.zip|}}\\ | ||
+ | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
===Jurnal=== | ===Jurnal=== | ||
+ | 22.04.2021 - Comandarea primului set de piese (Arduino, butoane, fire)\\ | ||
+ | 26.04.2021 - Comandarea celui de-al doilea set de piese (matrice de LED-uri, butoane aditionale)\\ | ||
+ | 27.04.2021 - Comandarea pieselor finale (breadboard)\\ | ||
+ | 03.05.2021 - Testarea pieselor individual\\ | ||
+ | 05.05.2021 - Familiarizarea cu bibliotecile necesare implementarii software a proiectului; testarea diferitelor comenzi pe matricea de LED-uri\\ | ||
+ | 07.05.2021 - Implementarea completa a cursorului pe matricea de LED-uri (miscare, select, coduri de culoare)\\ | ||
+ | 15.05.2021 - Implementarea logicii matricii de bombe (randomizarea bombelor, win/lose action, try again)\\ | ||
+ | 25.05.2021 - Retusuri finale; completare documentatie\\ | ||
===Bibliografie/Resurse=== | ===Bibliografie/Resurse=== | ||
+ | 1. [[https://pdf1.alldatasheet.com/datasheet-pdf/view/422610/ATMEL/ATMEGA328P.html|ATMEGA328P Datasheet]]\\ | ||
+ | 2. [[https://github.com/adafruit/Adafruit_NeoMatrix|Adafruit NeoMatrix GitHub Repository]]\\ | ||
+ | 3. [[https://learn.adafruit.com/adafruit-neopixel-uberguide/neomatrix-library|Adafruit NeoMatrix Tutorial]]\\ |