Battleship
Introducere
Implementarea jocului Battleship pentru 2 jucatori, fiecare jucator trebuind sa gaseasca navele adversarului.
Descriere generală
Fiecare jucator are o harta cu 3 nave de lungimi diferite dispuse random pe o matrice 8×8. Pe rand, fiecare jucator va ataca navele de pe harta adversarului, prin alegerea unui pozitii folodind tastele de pe keypad. Interfata cu jucatorii se face prin intermediul unui ecran LCD - pe care se va afisa al cui este randul si un mesaj atunci cand un jucator a atacat o pozitie - daca este hit sau miss. In timpul jocului, matricea de LED-uri este folosita pentru a-i arata jucatorului curent pe ce pozitie se afla (prin aprinderea unui LED), iar la castigarea jocului, va fi afisata
harta cu navele doborate ale adversarului.
Schema Bloc
Arduino Uno R3
Membrane 4×4 Keypad
Jucatorul foloseste tastele 2 (sus), 8(jos), 4(stanga), 6(dreapta) pentru a alege pozitia de pe harta ce poate fi atacata folosind tasta 5.
Matrice de LED-uri
In timpul jocului, fiecare jucator poate vedea pe matricea de LED-uri pozitia pe care este prin luminarea LED-ului corespunzator (si poate vizuliza cum se deplaseaza pe harta prin apasarea tastelor numerice). Daca decide sa atace o celula, pozitia aratata pe matrice este mapata la harta adversarului si se decide daca este hit sau miss.
La finalul jocului, pentru castigator, va fi afisata pe matricea de LED-uri harta doborata a adversarului.
LCD-I2C
Afiseaza care este jucatorul curent (jucatorul 0 sau 1) si, la fiecare apasare a unei taste, este afisata directia deplasarii.
La apasarea tastei 5(atac) este afisat pe ecran daca a fost hit sau miss.
La sfarsitul jocului (cand un jucator a doborat toate navele adversarului), este afisat pe ecran mesajul “Player 0/1 won”.
Hardware Design
Lista de piese
Nume | Numar piese |
Arduino Uno R3 | 1 |
Keypad | 1 |
Matrice de LED-uri | 3 |
LCD | 1 |
Fire tata-tata | |
Fire mama-tata | |
Schema electrica
Conectare Membrane 4x4 Keypad
Folosesc doar 6 pini din cei 8 ai Keypad-ului (Keypad-ul are cate un pin pentru fiecare rand si pentru fiecare coloana, din care folosesc doar primele 3 randuri si primele 3 coloane - corespunzatoare cifrelor.)
Am conectat pinii 8, 7, 6, 4, 3, 2 de la keypad la pinii digitali 7, 6, 5, 4, 3, 2 de la Arduino.
Conectare modul matrice de LED-uri
Am folosit o matrice de LED-uri 8×8 cu driver-ul MAX7219. Am conectat pinii VCC, GND, DIN, CS, CLK la pinii corespunzatori de pe Arduino.
Conectare LCD 16x2 I2C
Am folosit un LCD cu modulul I2C conectat si astfel am avut de conectat doar pinii GND, VCC, SDA, SCL la pinii corespunzatori de la Arduino.
Software Design
Implementare
Biblioteci folosite
Wire.h - pentru interfata seriala I2C
LiquidCrystal_I2C.h - pentru modulul LCD
Keypad.h - pentru Keypad
LedControl.h - pentru matricea de LED-uri
Program
- setup()
Initializarea variabilelor: hartile, pozitia de inceput de atac (stanga sus), WON(id-ul jucatorului castigator, initial -1).
Initializarea modulelelor: LCD, matricea de LED-uri, keypad.
- loop()
Cat timp jocul nu este castigat, astept ca jucatorul curent sa aleaga ce pozitie va ataca: afisez pe matricea de LED-uri pozitia selectata de jucator prin apasarea tastelor (si deplasarea) pana cand este apasata tasta 5 - cand se va verifica pe harta adversarului (o matrice de 0 si 1) daca atacul este hit sau miss.
Daca a fost hit, se pastreaza acelasi player, iar daca a fost miss, se marcheaza pe harta adversarului si se trece la player-ul urmator.
Jocul a fost castigat atunci cand harta adversarului este complet nula, moment in care este afisat un mesaj pe LCD si pe matricea de LED-uri apare harta “doborata” a adversarului.
Functiile folosite pentru logica jocului:
- generateMap
Genereaza o matrice de 0 si 1 ce reprezinta o harta cu nave de lungime 2, 3 si 4 aseazate random (navele sunt marcate cu 1 in matrice).
Pentru fiecare noua nava, folosesc functia random pentru a gasi pozitia de start si directia. Pe baza acestor date verific daca nava nu intersecteaza cu alte nave deja amplasate.
- checkHit
Verifica pentru player-ul curent daca pe harta adversarului, la pozitia atacata se gaseste o nava si returneaza 1 la hit, 0 la miss.
La fiecare hit, se marcheaza acea pozitie pe harta.
- checkWin
Rezultate Obţinute
Am obtinut un joc Battleship functional pentru 2 jucatori. Fiecare jucator alege pozitia de atac prin apasarea tastelor de la keypad. Interfata cu ultilizatorul este intuitiva, folosind o matrice de LED-uri pe care, in timpul jocului, jucatorul poate alege ce pozitie va ataca si un ecran LCD ce va arata rezultatul atacului pentru player-ul curent. La sfarsitul jocului, pe matricea de LED-uri va fi afisata harta doborata a adversarului. Pe LCD se poate vizualiza de asemenea al cui este randul, informatii despre tastele apasate si, la sfarsitul jocului, ce player a castigat.
Video: https://www.youtube.com/watch?v=DhTAVobn_Z4
Concluzii
Proiectul este realizat in intregime si functional. Mi-a placut sa lucrez la acest proiect, pentru ca am putut sa vad si o implementare in harware a unui joc. Am invatat sa folosesc keypad-ul, modulele de LCD si matricea de LED-uri, folosind in partea de software functiile din bibliotecile corespunzatoare.
Download
Jurnal
30 aprilie: alegere tema proiect, creare pagina de documentatie
4 mai: achizitionare piese
10 mai: asamblare piese hardware, testare componente
17 mai: implementarea jocului
30 mai: schema electrica
4 iunie: finalizare pagina de documentatie
Bibliografie