Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2024:tdicu:alexandra.alexe1305 [2024/05/25 21:26]
alexandra.alexe1305 [Software Design]
pm:prj2024:tdicu:alexandra.alexe1305 [2024/05/26 01:13] (current)
alexandra.alexe1305 [Rezultate Obţinute]
Line 45: Line 45:
 Adaug o poza a hardware-ului final, în care am stabilizat totul pe o placa de metal și am adăugat imagini sugestive pentru folosirea butoanelor. Adaug o poza a hardware-ului final, în care am stabilizat totul pe o placa de metal și am adăugat imagini sugestive pentru folosirea butoanelor.
  
-{{:​pm:​prj2024:​tdicu:​ale_hardware_final.png?500|}}+{{:​pm:​prj2024:​tdicu:​hardware.png?500|}}
  
  
Line 59: Line 59:
   * În partea de sus a tablei de joc este însemnat scorul jocului, acesta modificându-se în timp real în funcție de alegerile din joc.   * În partea de sus a tablei de joc este însemnat scorul jocului, acesta modificându-se în timp real în funcție de alegerile din joc.
   * Am ales să însoțesc fiecare apăsare de buton printr-un sunet scurt. Nu am făcut cea mai bună alegere în cumpărarea acestui tip de butoane deoarece sunt momente în care deși butonul este apăsat, nu face contact și acțiunea nu se îndeplinește. Astfel am considerat ca un sunet care validează fiecare acțiune este de ajutor.   * Am ales să însoțesc fiecare apăsare de buton printr-un sunet scurt. Nu am făcut cea mai bună alegere în cumpărarea acestui tip de butoane deoarece sunt momente în care deși butonul este apăsat, nu face contact și acțiunea nu se îndeplinește. Astfel am considerat ca un sunet care validează fiecare acțiune este de ajutor.
 +
 +
 +{{:​pm:​prj2024:​tdicu:​ale_flow.png?​500|}}
  
  
Line 74: Line 77:
 Matricea board reprezintă matricea în starea inițială, așa cum este văzută de către utilizator, în timp ce stateBoard reține pozițiile exacte ale minelor și reține valorile numerice din celule. Tot aici am declarat alte variabile necesare de-a lungul implementării. Matricea board reprezintă matricea în starea inițială, așa cum este văzută de către utilizator, în timp ce stateBoard reține pozițiile exacte ale minelor și reține valorile numerice din celule. Tot aici am declarat alte variabile necesare de-a lungul implementării.
  
-**2. Functia de setup **+**2. Funcția ​setup ** 
 + 
 +În funcția de setup am apelat funcțiile de inițializare pentru ecran, buzzer, joystick și butoane, având grijă să activez rezistențele de pullup din cod. De asemenea, m-am folosit de 2 funcții proprii pentru desenarea literelor și a chenarului în care va fi afișat numele.
  
   void setup() {   void setup() {
     TFTscreen.begin();​     TFTscreen.begin();​
     clean_background();​     clean_background();​
- 
     // initializare joystick-ul     // initializare joystick-ul
     pinMode(SW, INPUT);     pinMode(SW, INPUT);
     digitalWrite(SW,​ HIGH);     digitalWrite(SW,​ HIGH);
- 
     // initializare buzzer-ul     // initializare buzzer-ul
     pinMode(buzzerPin,​ OUTPUT);     pinMode(buzzerPin,​ OUTPUT);
     digitalWrite(buzzerPin,​ HIGH);     digitalWrite(buzzerPin,​ HIGH);
- 
     // initializare butoane     // initializare butoane
     pinMode(BUTTON_PIN_1,​ INPUT_PULLUP);​     pinMode(BUTTON_PIN_1,​ INPUT_PULLUP);​
Line 95: Line 97:
     pinMode(BUTTON_PIN_5,​ INPUT_PULLUP);​     pinMode(BUTTON_PIN_5,​ INPUT_PULLUP);​
     pinMode(BUTTON_PIN_6,​ INPUT_PULLUP);​     pinMode(BUTTON_PIN_6,​ INPUT_PULLUP);​
- 
     // desenare initiala tabla     // desenare initiala tabla
     drawAlphabetScreen();​     drawAlphabetScreen();​
Line 102: Line 103:
   }   }
   ​   ​
 +**3. Funcția loop**
  
 +Acestă funcție este împărțită in 2 părți, prima fiind responsabilă de ecranul care permite introducerea numelui jucătorului. Se citesc datele de la joystick și de la butoanele OK și X, modificând-se astfel indicii pentru cursor. Cursorul indica litera selectată și se evidențiază prin culoarea roșu. Accesarea literelor se face cu ajutorul matricei alphabetMatrix[cursorRow][cursorCol]. Butonul OK modifică string-ul enteredName care reține numele, iar butonul X apelează funcția clean_background();​ prin care este eliminată ultima litera introdusă.
 +Cea de-a doua parte se declanșează prin modificare variabilei startPage în false și reprezintă jocul propriu-zis de Minesweeper. Mă asigur de faptul că funcțiile de inițializare a matricilor și a variabilelor necesare sunt setate prin codul de mai jos:
 +
 +  if (!gameStarted) {
 +      score = 0;
 +      initializeMinesweeperBoard();​
 +      drawScore(enteredName);​
 +      gameStarted = true;
 +      prevCursorRow = tableCursorRow;​
 +      prevCursorCol = tableCursorCol;​
 +      redrawCursor();​
 +   }
 +
 +În fiecare moment primesc date de la cele 4 butoane ce indică direcțiile și modific variabilele ce rețin indicii cursorului. De această dată cursorul este indicat printr-un chenar de culoare distinctă. Butonul OK este sugestiv pentru descoperirea celulelor și prin apăsarea lui este apelată funcția revealCell(..) prin care se face descoperirea și funcția drawScore(enteredName) prin care este updatat scorul. Apăsarea butonului X duce la apelarea toggleFlag și drawFlag care sunt responsabile cu marcarea celului cu F (flag) sugerând prezența unei mine acolo. Nu uit să verific cu ajutorul funcției checkWin daca tabla de joc a fost completată corect, ceea ce ar duce la câștigarea jocului.
 +
 +**4. Funcții auxiliare**
 +
 +Următoarele funcții sunt utilizate pentru partea inițială în care se cere introducerea numelui. Trebuie menționat faptul că prin apăsarea directă a butonului OK, se poate evita acest pas.
 +  * clean_background()
 +  * drawAlphabetScreen()
 +  * drawBorder(String enteredName)
 +Următoarele funcții sunt responsabile de sunetele emise de buzzer pe parcursul jocului:
 +  * positiveSound()
 +  * negativeSound()
 +  * oneSound()
 +Următoarele funcții ajută la pregătirea jocului propriu-zis:​
 +  *initializeMinesweeperBoard()
 +  *redrawCursor()
 +  *drawScore(String enteredName)
 +  *placeMines(int board[][9], int rows, int cols)
 +  *calculateNeighborMines(int board[][9], int rows, int cols)
 +Următoarele funcții sunt utilizate în marcarea unei celule cu F(flag):
 +  *toggleFlag(int row, int col)
 +  *drawFlag(int row, int col)
 +Următoarele funcții ajută la descoperirea unei celule sau la descoperire în masă:
 +  *revealCell(int row, int col) 
 +  *revealAdjacentCells(int row, int col)
 +Următoarele funcții sunt utile în verificarea finalului jocului și în afișajele finale, în funcție de caz:
 +  *checkWin()
 +  *displayWinMessage()
 +  *displayGameOverMessage()
  
  
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +Am realizat tot ceea ce mi-am propus, cu precizarea că dacă aș schimba ceva ar fi buzzer-ul activ. Lucrând la acest proiect am învățat diferențele între un buzzer activ și unul pasiv, astfel că unul pasiv mi-ar fi permis să personalizez mai mult sunetul ce însoțește jocul. 
-Care au fost rezultatele obţinute ​în urma realizării proiectului vostru+Atașez poze în diferite momente ale jocului și un video demonstrativ:​ 
-</note>+  *[[https://​youtube.com/​shorts/​O9bJ0wwYK94?​si=5AxQNM21mXLe8OGW|Lost Game]] 
 +  ​*[[https://​youtube.com/​shorts/fXiUCEjHgo8?​feature=share|Won Game]]
  
-===== Concluzii ===== 
  
-===== Download =====+{{:​pm:​prj2024:​tdicu:​enter_the_name.png?​500|}}
  
-<note warning>​ +{{:pm:​prj2024:​tdicu:​playing.png?500|}}
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectuluisurse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).+
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. +{{:pm:prj2024:tdicu:game_over.png?500|}}
-</​note>​+
  
 +{{:​pm:​prj2024:​tdicu:​win.png?​500|}}
 +
 +
 +===== Concluzii =====
 +Acesta a fost un proiect din care am învățat noțiuni teoretice despre proiectarea cu microprocesoare,​ pe care la-am pus în practică, dar am învățat și ce de fapt nimic nu e ceea ce pare: deși am fost temătoare la început cu privire la realizarea acestui proiect, s-a dovedit a fi o plăcere să lucrez la el! 
 +===== Download =====
 +
 +{{:​pm:​prj2024:​tdicu:​alexe_alexandra.zip|}}
 ===== Jurnal ===== ===== Jurnal =====
  
-<note tip> +**26.04.2024** - Comandarea pieselor.
-26.04.2024 - Comandarea pieselor.+
  
-5.05.2024 - Realizarea documentației inițiale.+**5.05.2024** - Realizarea documentației inițiale.
  
-17.05.2024 - Realizarea hardware-ului +**17.05.2024** - Realizarea hardware-ului
-</​note>​+
  
-===== Bibliografie/​Resurse =====+**23.05.2024** - Finalizarea implmentarii software
  
-<​note>​ 
-Listă cu documente, datasheet-uri,​ resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. 
-</​note>​ 
  
-<​html><​a class="media mediafile mf_pdf"​ href="?do=export_pdf">​Export ​to PDF</a></html>+===== Bibliografie/​Resurse ===== 
 + 
 +**Resurse Hardware** 
 +  *https://​docs.arduino.cc/​resources/​datasheets/​A000066-datasheet.pdf 
 +  *https://​www.instructables.com/​How-to-Interface-With-Active-Buzzer-Sensor-Module/ 
 +  *https://​arduinogetstarted.com/​tutorials/​arduino-joystick?​utm_content=cmp-true
  
 +**Resurse Software**
 +  * https://​www.arduino.cc/​reference/​en/​language/​functions/​random-numbers/​random/​
 +  * https://​www.instructables.com/​HOW-TO-INTERFACE-AN-ACTIVE-BUZZER-WITH-ARDUINO/​
pm/prj2024/tdicu/alexandra.alexe1305.1716661564.txt.gz · Last modified: 2024/05/25 21:26 by alexandra.alexe1305
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