Sisällysluettelo:

Ohjelmoi oma 2048 -peli W/Java !: 8 vaihetta
Ohjelmoi oma 2048 -peli W/Java !: 8 vaihetta

Video: Ohjelmoi oma 2048 -peli W/Java !: 8 vaihetta

Video: Ohjelmoi oma 2048 -peli W/Java !: 8 vaihetta
Video: MEGA Chia GPU Farming and Plotting Guide for Linux - Gigahorse Start to Finish - 2023 2024, Marraskuu
Anonim

Tekijä PranP1My (Incomplete) SiteFollow Lisää kirjoittajalta:

Arduinon CNC -kone pelastetuista PC -osista
Arduinon CNC -kone pelastetuista PC -osista
Arduinon CNC -kone pelastetuista PC -osista
Arduinon CNC -kone pelastetuista PC -osista
DIY modernit puupenkit
DIY modernit puupenkit
DIY modernit puupenkit
DIY modernit puupenkit
Kosketukseton ovenavaaja (vSTEM)
Kosketukseton ovenavaaja (vSTEM)
Kosketukseton ovenavaaja (vSTEM)
Kosketukseton ovenavaaja (vSTEM)

Rakastan peliä 2048. Ja niin päätin ohjelmoida oman versioni.

Se on hyvin samanlainen kuin varsinainen peli, mutta sen itse ohjelmointi antaa minulle vapauden muuttaa mitä haluan milloin tahansa. Jos haluan 5x5 -pelin tyypillisen 4x4 -pelin sijaan, yksinkertainen muutos Board -konstruktorin avulla mahdollistaa sen. Sano, että haluan tehdä pelistä vaikeamman lisäämällä kappaleita paikkoihin, jotka tekevät siitä monimutkaisimman pelaajan kannalta eikä satunnaisesti. Yksinkertaisen algoritmin avulla voin tehdä juuri sen. Vaikka en kata kaikkia näitä muutoksia tässä Instructable -ohjelmassa, aion lisätä niitä lisää.

Toistaiseksi ohjelmoimme kuitenkin tyypillisen pelisi vuodelle 2048.

Aloitetaan!

(Sivuhuomautus: Tämä Instructable vaatii maltillista ohjelmointitaitoa - erityisesti Javan kanssa)

Vaihe 1: Materiaalit

Materiaalit
Materiaalit

Et tarvitse paljon tähän projektiin, koska se on vain ohjelmoinnin läpikäynti.

Materiaalit:

  • Kannettava tietokone
  • Eclipse (tai mikä tahansa valitsemasi IDE)

Jep. Se siitä.

Vaihe 2: Tutustu ohjelmaan - Hallitus

Latasin koko koodini GitHubiin - katso se täältä:

Jaoin pelin kolmeen luokkaan: lauta, laatta ja peli.

Hallitus:

Kuvaus: Board -luokka käsittelee pelilautaa, asettaa joukon 'Tile' -elementtejä, hakee nykyisen pistemäärän ja korkeimman laatan ja asettaa taulukon merkkijonoon (käytettäväksi myöhemmin 'Game' -pelissä). Suurin osa logiikasta on myös tässä, luokka tarjoaa menetelmiä 2: n ja 4: n kutelemiseksi satunnaisissa paikoissa, ylös, alas, vasemmalle ja oikealle ja ilmoittaa pelaajille, kun peli on ohi.

Rakentajat:

/ * Taulukon oletusrakentaja - määrittää 4x4 -matriisin */

julkinen hallitus () {…}

/ * Taulukon rakentaja - määrittää matriisin, jolla on määritetty ruudukon koko */

julkinen hallitus (int ruudukot) {…}

Menetelmät:

/ * Getter -menetelmä, joka palauttaa levyn */

julkinen laatta getBoard () {…}

/ * Getter -menetelmä, joka palauttaa pisteet */

julkinen int getScore () {…}

/ * Etsii taulun korkeimman laatan ja palauttaa sen */

public int getHighTile () {…}

/ * Tulostaa levyn konsolille - testausta varten */

public void print () {…}

/ * Palauttaa levyn merkkijonona - käytetään graafisessa käyttöliittymässä */

public String toString () {…}

/ * Kutoo 2 (tai 4) tyhjään tilaan heti siirron aikana */

public void spawn () {…}

/ * Tarkistaa, onko lauta kokonaan pimennetty ja jos on, se kannustaa pelaajia käynnistämään uudelleen */

public boolean blackOut () {…}

/ * Tarkistaa, onko peli ohi - kun lauta on pimennetty eikä mikään laatta voi yhdistyä */

public boolean gameOver () {…}

/ * Soitetaan, kun w- tai ylös -nuolta painetaan - kutsuu "verticalMove" jokaiselle levylle ruudulla parametrilla "up" */

public void up () {…}

/ * Soitetaan, kun 's' tai alanuolta painetaan - kutsuu "verticalMove" jokaiselle levylle, jonka parametri on "down" */public void down () {…}

/ * Soitetaan, kun "d" tai oikeaa nuolta painetaan - kutsuu "horizontalMove" jokaiselle levylle ruudulla parametrilla "right" */public void right () {…}

/ * Soitetaan, kun "a" tai vasen nuoli painetaan - kutsuu "horizontalMove" jokaiselle levylle ruudulla parametrilla "left" */

public void left () {…}

/* Vertaa kahden laatan arvoja yhteen ja jos ne ovat samat tai jos yksi on 0 (tavallinen laatta) - niiden arvot lisätään (edellyttäen, että vertailtavat laatat ovat kaksi eri laattaa ja ne siirtyvät oikeaan suuntaan) - liikkuu rekursiivisesti rivin läpi */

public void horizontalMove (int rivi, int col, merkkijonon suunta) {…}

/* Vertaa kahden laatan arvoja yhteen ja jos ne ovat samat tai jos yksi on 0 (tavallinen laatta) - niiden arvot lisätään (edellyttäen, että vertailtavat laatat ovat kaksi eri laattaa ja ne siirtyvät oikeaan suuntaan) - liikkuu rekursiivisesti sarakkeen läpi */

public void verticalMove (int rivi, int col, merkkijonon suunta) {…}

Joo, se on paljon menetelmiä - mutta älä huoli, useimmat ovat erittäin helppoja ymmärtää. Lisäksi Board -luokka on monimutkaisin, joten kaikki tämän jälkeen on suhteellisen yksinkertaista.

Vaihe 3: Tutustu ohjelmaan - laatta

Laatta:

Kuvaus: Laattaluokka käsittelee yksittäisiä laattoja ja on pienin kaikista luokista. Jokaisella laatalla on kokonaislukuarvo ja väri. Siinä on kaksi konstruktoria, jotka luovat laatat, joiden arvo on 0 (oletus) tai arvo #. Menetelmät ovat enimmäkseen itsestään selviä, ja getter- ja setter -menetelmät muodostavat suurimman osan kokonaismäärästä.

Rakentajat:

/ * Luo peruslaatan, jonka arvo on 0 */

julkinen laatta () {…}

/ * Luo laatan, jonka arvo on numero */

julkinen laatta (int -numero) {…}

Menetelmät:

/ * Saa laatan arvon */

public int getValue () {…}

/ * Asettaa laatan arvon - käytetään, kun lisätään kaksi laattaa yhteen */

public void setValue (int -arvo) {…}

/ * Edustaa laattaa merkkijonona - käytetään graafisessa käyttöliittymässä */

public String toString () {…}

/ * Asettaa laatan värin sen arvon perusteella */

public void setColor () {…}

/ * Saa laatan värin */

public void getColor () {…}

Vaihe 4: Tutustu ohjelmaan - Peli

Peli

Kuvaus: Peliluokka sisältää päämenetelmän, useimmat graafiset käyttöliittymämenetelmät ja tärkeimmät vuorovaikutukset. Se kestää sekä laatta- että hallituksen luokat ja mahdollistaa niiden työskentelyn yhdessä.

Rakentajat:

Ei mitään

Menetelmät:

/ * määrittää sopivan kokoisen graafisen käyttöliittymän ja lisää avainkuuntelijan */

public staattinen void setUpGUI () {…}

/ * Tarkistaa, painetaanko wasd- tai nuolinäppäimiä, ja suorittaa tarvittavat toimenpiteet - päivittää JFrame -kehyksen jokaisella liikkeellä */

public void keyPainettu (KeyEvent e) {…}

/ * Maalaa graafisen käyttöliittymän sarjalla merkkijonoja, levyn ja laatat ja varmistaa, että ne maalataan uudelleen pelin päätyttyä */

public void paint (Grafiikka g) {…}

/ * piirtää yksittäisen laatan - kutsutaan maalausmenetelmästä */

public void drawTiles (Grafiikka g, laattalaatta, int x, int y) {…}

/ * Päämenetelmä - määrittää käyttöliittymän ja aloittaa pelin */

public staattinen void main (String args) {…}

Vaihe 5: Tärkeitä menetelmiä - liike

Liikkumismenetelmät ovat tärkeimpiä ymmärtämään, mutta hyvä uutinen on, että kun ymmärrät pystysuuntaiset liikkeet, voit soveltaa tätä ymmärrystä vaakasuoriin liikkeisiin. Itse asiassa kolme pystysuoraa siirtomenetelmää ovat täsmälleen samat kuin kolme vaakasuuntaista liikettä, paitsi että yksi liikkuu rivien ja toinen sarakkeiden poikki. Tästä syystä keskitytään vain pystysuoriin liikkeen menetelmiin.

private void verticalMove (int rivi, int col, merkkijonon suunta)

{Laattakirjain = lauta [reunus] [col]; Laattojen vertailu = lauta [rivi] [sarake]; if (initial.getValue () == 0 || initial.getValue () == vertaa.getValue ()) {if (rivi> raja || (direction.equals ("alas") && (rivi <raja))) {int addScore = initial.getValue () + vertaa.getValue (); if (initial.getValue ()! = 0) {score += addScore; } initial.setValue (addScore); vertaile.setValue (0); }} else {if (direction.equals ("down")) {border--; } muu {raja ++; } verticalMove (rivi, sarake, suunta); }}

Edellä kuvattua vertikaalista liikettä kutsutaan "ylös" ja "alas" -menetelmiksi. Katsotaanpa "ylös" -menetelmää.

julkinen mitätöinti ()

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

Tämä menetelmä kulkee koko levyn läpi ja kutsuu vertikaalimovea jokaiselle ruudulle parametrilla "ylös". verticalMove vertaa sitten laattaa kohdissa 'j' ja 'i' laattaan kohdissa 'border' ja 'i'. Jos nämä kaksi ovat yhtä suuret, ne yhdistetään. Jos ne eivät ole, reunusruutua suurennetaan yhdellä (koska paikalla oleva parametri on 'ylös') ja verticalMove kutsutaan uudelleen.

Suositeltava: