This is an old revision of the document!


Implementare joc Battleship - Leahu Morie Robert Andrei 331 CB

Introducere

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 timer pe care îl folosesc pentru a avea timeout la miscări 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.

Î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. Buzzer-ul o să cânte și atunci când un jucător o să piardă. Dupa fiecare miscare am decis sa pun un timeout, pentru ca jucătorul să se gândească, folosind un timer.

Descriere Generala

SCHEMA_BLOC:

Hardware Design

Lista de piese:

  • Arduino UNO
  • 1 LCD cu I2C
  • Buzzer
  • rezistente
  • 10 fire
  • 2 LED-uri
  • buton MIC
  • modul adaptor micro SD
  • servomotor SG90
  • modul matrice LED MAX7219

Schema electrica:

Software Design

Pentru dezvoltare am folosit ArduinoIDE, si ca biblioteci am folosit:

  • Wire.h – pentru interfața serială I2C
  • LiquidCrystal_I2C.h – pentru modulul LCD
  • Keypad.h – pentru tastatură
  • LedControl.h – pentru matricea de LED-uri
  • Servo.h - pentru servomotor

Ca si implementare a programului:

  • setup() : generarea în mod aleator a celor două hărți, setarea poziției de

început, inițializarea modulelor (LCD, matricea de LED-uri)

void setup() {
  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.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;
}
  • loop() : cât timp jocul nu este câștigat, așteptăm ca jucătorul curent să

aleagă ce poziție va ataca;

  • se afișează pe matricea de LED-uri poziția
  • selectată de jucător prin apăsarea tastelor;
  • la apăsarea tastei 5 se verifică
  • pe harta adversarului dacă atacul este hit sau miss
  • generateMap: generează o matrice de 0 și 1 ce reprezintă navele de

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

  • checkHit: verifică pentru player-ul curent dacă pe harta adversarului, la

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;
  }
}
  • displayScore: afișează pe LCD scorul (numărul de hit-uri) fiecărui jucător
// 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);
}

Rezultate Obtinute

Concluzii

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.

Download

Jurnal

Bibliografie/Resurse

pm/prj2023/amocanu/implementare-joc-battleship/create-page.1684880366.txt.gz · Last modified: 2023/05/24 01:19 by robert_andrei.leahu
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