Am decis sa fac implementarea jocului Battleship, folosind un microcontroller, o matrice cu LED-uri, m-am gândit sa folosesc un ecran LCD pentru scor, un servomotor care indica ce player ataca si un buzzer pe care îl folosesc atunci cand câstigi/pierzi, eventual dupa fiecare miscare.
Afișajul se va împărți în două regiuni egale, una pentru fiecare jucător si se vor genera cel puțin două forme diferite de nave / vapoare pentru fiecare jucător, plasate aleator pe spațiul de joc.
Poziția de lovire va fi selectată de un jucător folosind 4 butoane pentru direcțiile stânga, dreapta, sus, jos sau un joystick. Confirmarea poziției se va realiza folosind un alt buton.
Odata ce un „vapor” a fost lovit și scufundat, led-urile aferente lui se vor aprinde într-o anumită culoare și vor rămâne aprinse pe toată durata jocului.
Pozițiile de pe matrice unde s-a încercat o lovire, însă ele au fost libere, vor rămâne aprinse pe toată durata jocului înt-o anumită culoare(rosu).
În momentul în care un jucător câștigă se va afișa un mesaj corespunzător, precum și scorul, iar buzzer-ul o sa inceapa sa cante.
Lista de piese:
Schema electrica:
Completarea schemei electrice:
Pentru dezvoltare am folosit ArduinoIDE, si ca biblioteci am folosit:
Ca si implementare a programului:
început, inițializarea modulelor (LCD, matricea de LED-uri)
void setup() { const int buzzer = 9; //buzzer to arduino pin 9 randomSeed(analogRead(0)); // seeds the random number generator by a value obtained from doing AnalogRead on pin A0 myServo.attach(13); // attaches the servo on pin 9 to the servo object lcd.backlight(); // turn on backlight //lcd.init(); lcd.begin(); // initialize the lcd lc.shutdown(0, false); // turns the display on lc.setIntensity(0, 10); // set the brightness lc.clearDisplay(0); // clear the display Serial.begin(9600); // initialize serial communication // start position for attack xPos = 0; yPos = 7; // display on LED matrix lc.setRow(0, 0, B10000000); //setting the leds from the first row (index=0) // first player - player 0 PLAYER = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("PLAYER #0"); displayScore(); delay(700); // generate maps and backup maps generateMaps(); // game is won when WON != -1 WON = -1; }
aleagă ce poziție va ataca;
lungimi 2, 3 și 4 așezate random; pentru fiecare navă nouă, folosim funcția random pentru a genera poziția de start și direcția, pe baza acestor date verificăm dacă nava nu intersectează alte nave deja amplasate
poziția atacată se găsește o navă și returnează 1 la hit, 0 la miss; la fiecare hit, se marchează acea poziție pe hartă
int checkWin(int player) { // if the matrix is full of 0's, then current player wins if (player == 0) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (B[i][j] == 1) { // no win yet return 0; } } } // win return 1; } else { // same thing, but for player 1 on map A for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if (A[i][j] == 1) { // no win yet return 0; } } } // win return 1; } }
// function to display the score on the LCD void displayScore() { lcd.setCursor(0, 1); lcd.print("SCORE: "); lcd.print(scoreP0); lcd.print("-"); lcd.print(scoreP1); }
player-ului 0, respectiv 1
A[7][0], iar acesta daca o doboara o sa fie WIN
Link functionalitate joc: https://drive.google.com/file/d/1RmKv85lGWfdCYsZFTIDbRUb7dYbA8ft5/view?usp=sharing
Pot afirma că a fost o experiență plăcută și provocatoare, deoarece am întâlnit elemente noi, precum asamblarea pieselor și principiile de funcționare corespunzătoare. Am invatat sa aplic conceptele de electronică în contextul real și noțiunile aduse în discuție în cadrul acestei discipline. Prin intermediul acestui proiect, am reușit să pun în practică funcționalitățile planificate, consolidându-mi cunoștințele acumulate în timpul cursurilor și laboratoarelor.