Cuprins:

Programează-ți propriul joc 2048 W / Java !: 8 pași
Programează-ți propriul joc 2048 W / Java !: 8 pași

Video: Programează-ți propriul joc 2048 W / Java !: 8 pași

Video: Programează-ți propriul joc 2048 W / Java !: 8 pași
Video: Tutorial 1: Introducere JAVA 2024, Decembrie
Anonim

De PranP1My (Incomplete) Site Urmăriți mai multe de la autor:

Mașină CNC Arduino de la piese recuperate pentru PC
Mașină CNC Arduino de la piese recuperate pentru PC
Mașină CNC Arduino de la piese recuperate pentru PC
Mașină CNC Arduino de la piese recuperate pentru PC
Bănci moderne din lemn DIY
Bănci moderne din lemn DIY
Bănci moderne din lemn DIY
Bănci moderne din lemn DIY
Deschidere ușă fără contact (vSTEM)
Deschidere ușă fără contact (vSTEM)
Deschidere ușă fără contact (vSTEM)
Deschidere ușă fără contact (vSTEM)

Îmi place jocul 2048. Așa că am decis să-mi programez propria versiune.

Este foarte asemănător cu jocul propriu-zis, dar programarea mea îmi oferă libertatea de a schimba orice vreau oricând vreau. Dacă vreau un joc 5x5 în loc de 4x4 tipic, o simplă schimbare folosind constructorul „Board” îmi va permite să fac acest lucru. Spuneți că vreau să îngreunez jocul, adăugând piese la poziții care îl vor face cel mai complex pentru jucător, mai degrabă decât la întâmplare. Folosind un algoritm simplu, pot face exact asta. Deși nu voi acoperi toate aceste modificări în acest instructabil, intenționez să adaug mai multe pe măsură ce merg.

Deocamdată, însă, vă vom programa jocul tipic din 2048.

Să începem!

(O notă laterală: acest instructabil necesită cunoștințe moderate de programare - în special cu Java)

Pasul 1: Materiale

Materiale
Materiale

Nu veți avea nevoie de mult pentru acest proiect, deoarece este doar un pas de pas de programare.

Materiale:

  • Laptop
  • Eclipse (sau orice IDE la alegere)

Da. Asta e.

Pasul 2: Cunoașteți programul - Consiliul

Am încărcat tot codul meu pe GitHub - verificați-l aici:

Am împărțit jocul în 3 clase: Board, Tile și Game.

Bord:

Descriere: Clasa Board se ocupă de tabla de joc, configurarea unei matrice de elemente „Tile”, obținerea scorului curent și cea mai mare țiglă și punerea matricei într-un șir (pentru a fi folosită mai târziu în „Joc”). Cea mai mare parte a logicii este, de asemenea, aici, clasa furnizând metode pentru a genera 2 și 4 în locații aleatorii, deplasându-se în sus, în jos, la stânga și la dreapta și informând jucătorii când jocul sa încheiat.

Constructori:

/ * Constructor implicit pentru bord - configurează o matrice 4x4 * /

consiliu public () {…}

/ * Constructor pentru bord - setează o matrice cu dimensiunea grilei specificată * /

Consiliul public (grile int) {…}

Metode:

/ * Metoda Getter care returnează placa * /

public Tile getBoard () {…}

/ * Metoda Getter care returnează scorul * /

public int getScore () {…}

/ * Găsește cea mai înaltă țiglă de pe tablă și o returnează * /

public int getHighTile () {…}

/ * Tipărește placa pe consolă - în scopul testării * /

public nul print () {…}

/ * Returnează placa ca un șir - utilizat în GUI * /

public String toString () {…}

/ * Apare 2 (sau 4) într-un spațiu gol chiar când se face o mișcare * /

public void spawn () {…}

/ * Verifică dacă placa este complet oprită și dacă este, va împinge jucătorii să repornească * /

public boolean blackOut () {…}

/ * Verifică dacă jocul s-a terminat - când tabla este înnegrită și niciuna dintre piese nu se poate combina * /

public boolean gameOver () {…}

/ * Apelat când se apasă „w” sau săgeata sus - apelează „verticalMove” pentru fiecare țiglă de pe tablă cu parametrul „sus” * /

public void up () {…}

/ * Apelat când se apasă „s” sau săgeata în jos - apelează „verticalMove” pentru fiecare țiglă de pe tablă cu parametrul „jos” * / public void jos () {…}

/ * Apelat când este apăsată „d” sau săgeata spre dreapta - apelează „horizontalMove” pentru fiecare țiglă de pe tablă cu parametrul „dreapta” * / public void right () {…}

/ * Apelat când este apăsată „o” sau săgeata stânga - apelează „horizontalMove” pentru fiecare țiglă de pe tablă cu parametrul „left” * /

gol public lăsat () {…}

/ * Compară valorile a două plăci împreună și dacă sunt aceleași sau dacă una este egală cu 0 (placă simplă) - valorile lor sunt adăugate (cu condiția ca plăcile pe care le comparăm să fie două plăci diferite și să se deplaseze spre direcția corespunzătoare) - se mișcă recursiv prin rând * /

public void horizontalMove (int rând, int col, direcție șir) {…}

/ * Compară valorile a două plăci împreună și dacă sunt aceleași sau dacă una este egală cu 0 (placă simplă) - valorile lor sunt adăugate (cu condiția ca plăcile pe care le comparăm să fie două plăci diferite și să se deplaseze spre direcția corespunzătoare) - se deplasează recursiv prin coloana * /

public void verticalMove (int rând, int col, direcție șir) {…}

Da, sunt o mulțime de metode - dar nu vă faceți griji, majoritatea sunt extrem de ușor de înțeles. În plus, clasa „Board” este cea mai complexă, deci totul după aceasta va fi relativ simplu.

Pasul 3: Cunoașteți programul - Placi

Ţiglă:

Descriere: Clasa Tile se ocupă de plăcile individuale și este cea mai mică dintre toate clasele. Fiecare țiglă are o valoare întreagă și o culoare. Are doi constructori care creează plăci de valoare 0 (implicit) sau valoare #. Metodele se explică în mare parte, metodele „getter” și „setter” constituind o mare parte din total.

Constructori:

/ * Construiește o țiglă de bază cu o valoare de 0 * /

placă publică () {…}

/ * Construiește o țiglă cu o valoare de număr * /

Placă publică (număr int) {…}

Metode:

/ * Obține valoarea plăcii * /

public int getValue () {…}

/ * Setează valoarea plăcii - utilizată la adăugarea a două plăci împreună * /

public void setValue (valoare int) {…}

/ * Reprezintă țiglă ca un șir - utilizat în GUI * /

public String toString () {…}

/ * Setează culoarea plăcii pe baza valorii acesteia * /

public void setColor () {…}

/ * Obține culoarea plăcii * /

public nul getColor () {…}

Pasul 4: Cunoașteți Programul - Joc

Joc

Descriere: Clasa de joc găzduiește metoda principală, majoritatea metodelor GUI și interacțiunile cheie. Este nevoie atât de clasele Tile, cât și de cele Board și le permite să lucreze împreună.

Constructori:

Nici unul

Metode:

/ * configurează GUI cu dimensiuni adecvate și adaugă un Key Listener * /

public static void setUpGUI () {…}

/ * Verifică dacă sunt apăsate tastele WASD sau săgeată și efectuează acțiunile corespunzătoare - actualizează JFrame cu fiecare mișcare * /

public void keyPressed (KeyEvent e) {…}

/ * Pictează interfața grafică cu o serie de șiruri, tablă, plăci și se asigură că acestea sunt repictate la sfârșitul jocului * /

vopsea de vid public (grafică g) {…}

/ * desenează o țiglă individuală - apelată din metoda de vopsire * /

public void drawTiles (Graphics g, Tile tile, int x, int y) {…}

/ * Metoda principală - configurează GUI și începe jocul * /

public static main main (String args) {…}

Pasul 5: Metode importante - Mișcare

Metodele de mișcare sunt cele mai importante de înțeles, dar vestea bună este că, odată ce înțelegeți mișcările verticale, puteți aplica această înțelegere mișcărilor orizontale. De fapt, cele trei metode de mișcare verticală sunt exact aceleași cu cele trei mișcări orizontale, cu excepția uneia care se deplasează pe rânduri, iar cealaltă pe coloane. Din acest motiv, să ne concentrăm doar asupra metodelor de mișcare verticală.

private void verticalMove (rând int, col int, direcția șirului)

{Tile initial = board [border] [col]; Compararea plăcilor = bord [rând] [col]; if (initial.getValue () == 0 || initial.getValue () == compare.getValue ()) {if (rând> border || (direction.equals ("jos") && (rând <border))) {int addScore = initial.getValue () + compare.getValue (); if (initial.getValue ()! = 0) {score + = addScore; } initial.setValue (addScore); compare.setValue (0); }} else {if (direction.equals ("down")) {border--; } else {border ++; } verticalMove (rând, col, direcție); }}

Metoda de mai sus, verticalMove, este numită prin metodele „sus” și „jos”. Să aruncăm o privire la metoda „sus”.

public nul ()

{pentru (int i = 0; i <grile; i ++) {border = 0; for (int j = 0; j <grile; j ++) {if (board [j] .getValue ()! = 0) {if (border <= j) {verticalMove (j, i, "up"); }}}}}

Această metodă trece prin întreaga placă și apelează verticalMove pentru fiecare țiglă cu parametrul „sus”. verticalMove compară apoi țiglă la poziția 'j' și 'i' cu țiglă la poziția 'chenar' și 'i'. Dacă cele două sunt egale, ele sunt combinate. Dacă nu sunt, țiglă de margine este mărită cu 1 (deoarece parametrul în loc este „sus”), iar verticalMove este apelat din nou.

Recomandat: