İçindekiler:

Java ile Kendi 2048 Oyununuzu Programlayın: 8 Adım
Java ile Kendi 2048 Oyununuzu Programlayın: 8 Adım

Video: Java ile Kendi 2048 Oyununuzu Programlayın: 8 Adım

Video: Java ile Kendi 2048 Oyununuzu Programlayın: 8 Adım
Video: CANVAS + JAVASCRIPT kullanarak Yılan Oyunu yapalım (SNAKE GAME) 2024, Temmuz
Anonim

PranP1My (Tamamlanmamış) SiteTakip Yazar tarafından daha fazlası:

Kurtarılan PC Parçalarından Arduino CNC Makinesi
Kurtarılan PC Parçalarından Arduino CNC Makinesi
Kurtarılan PC Parçalarından Arduino CNC Makinesi
Kurtarılan PC Parçalarından Arduino CNC Makinesi
DIY Modern Ahşap Banklar
DIY Modern Ahşap Banklar
DIY Modern Ahşap Banklar
DIY Modern Ahşap Banklar
Temassız Kapı Açıcı (vSTEM)
Temassız Kapı Açıcı (vSTEM)
Temassız Kapı Açıcı (vSTEM)
Temassız Kapı Açıcı (vSTEM)

2048 oyununu seviyorum. Bu yüzden kendi versiyonumu programlamaya karar verdim.

Gerçek oyuna çok benziyor, ancak kendim programlamak bana istediğim zaman istediğim şeyi değiştirme özgürlüğü veriyor. Tipik 4x4 yerine 5x5 oyun istiyorsam, 'Board' yapıcısını kullanarak basit bir değişiklik yapmama izin verecek. Diyelim ki, oyunu rastgele değil de oyuncu için en karmaşık hale getirecek pozisyonlara parçalar ekleyerek oyunu daha zor hale getirmek istiyorum. Basit bir algoritma kullanarak, bunu yapabilirim. Bu Eğitilebilir Dosyadaki tüm bu değişiklikleri kapsamayacak olsam da, ilerledikçe daha fazlasını eklemeyi planlıyorum.

Ancak şimdilik, tipik 2048 oyununuzu programlayacağız.

Başlayalım!

(Bir yan not: Bu Eğitilebilir Kitap, orta düzeyde programlama bilgisi gerektirir - özellikle Java ile)

Adım 1: Malzemeler

Malzemeler
Malzemeler

Bu sadece bir programlama kılavuzu olduğu için bu proje için fazla bir şeye ihtiyacınız olmayacak.

Malzemeler:

  • dizüstü bilgisayar
  • Eclipse (veya seçtiğiniz herhangi bir IDE)

Aynen. Bu kadar.

2. Adım: Programı Tanıyın - Yönetim Kurulu

Tüm kodumu GitHub'a yükledim - buradan kontrol edin:

Oyunu 3 sınıfa ayırdım: Board, Tile ve Game.

Pano:

Açıklama: Board sınıfı oyun tahtası ile ilgilenir, bir dizi 'Döşeme' öğelerini ayarlar, mevcut puanı ve en yüksek kutucuğu alır ve diziyi bir dizgeye koyar (daha sonra 'Oyun'da kullanılacaktır). Mantığın çoğu da burada, sınıf rastgele konumlarda 2'li ve 4'lü yumurtlama, yukarı, aşağı, sola ve sağa hareket etme ve oyun bittiğinde oyunculara haber verme yöntemleri sağlıyor.

Yapıcılar:

/* Board için varsayılan kurucu - bir 4x4 matris kurar */

genel Kurul() {…}

/* Pano için Oluşturucu - belirtilen ızgara boyutuna sahip bir matris kurar */

public Board (int grids) {…}

Yöntemler:

/* Tahtayı döndüren Getter yöntemi */

genel Döşeme getBoard() {…}

/* Puanı döndüren Getter yöntemi */

public int getScore() {…}

/* Tahtadaki en yüksek döşemeyi bulur ve onu döndürür */

public int getHighTile() {…}

/* Tahtayı konsola yazdırır - test amaçlı */

public void print() {…}

/* Tahtayı bir Dize olarak döndürür - GUI'de kullanılır */

public String toString() {…}

/* Her hamle yapıldığında boş bir alana 2 (veya 4) verir */

public void spawn() {…}

/* Tahtanın tamamen kararmış olup olmadığını kontrol eder ve eğer öyleyse, oyuncuları yeniden başlamaya teşvik eder */

genel boolean blackOut() {…}

/* Oyunun bitip bitmediğini kontrol eder - tahta karardığında ve hiçbir taş birleşemezken */

public boolean gameOver() {…}

/* 'w' veya yukarı oka basıldığında çağrılır - 'yukarı' parametresiyle tahtadaki her karo için 'verticalMove'u çağırır */

public void up() {…}

/* 's' veya aşağı oka basıldığında çağrılır - 'down' parametresiyle tahtadaki her karo için 'verticalMove'u çağırır */public void down() {…}

/* 'd' veya sağ oka basıldığında çağrılır - 'right' parametresiyle tahtadaki her karo için 'horizontalMove'u çağırır */public void right() {…}

/* 'a' veya sol oka basıldığında çağrılır - 'left' parametresiyle tahtadaki her karo için 'horizontalMove'u çağırır */

public void left() {…}

/* İki döşemenin değerlerini birlikte karşılaştırır ve eğer aynıysa veya 0'a eşitse (düz döşeme) - değerleri eklenir (karşılaştırdığımız döşemelerin iki farklı döşeme olması ve uygun yöne doğru hareket etmeleri şartıyla) - özyinelemeli olarak satır boyunca hareket eder */

public void horizontalMove (int satır, int sütun, Dize yönü) {…}

/* İki döşemenin değerlerini birlikte karşılaştırır ve eğer aynıysa veya 0'a eşitse (düz döşeme) - değerleri eklenir (karşılaştırdığımız döşemelerin iki farklı döşeme olması ve uygun yöne doğru hareket etmeleri şartıyla) - yinelemeli olarak */ sütununda hareket eder

public void verticalMove (int satır, int sütun, Dize yönü) {…}

Evet, pek çok yöntem var - ama merak etmeyin, çoğunu anlamak son derece kolaydır. Bunun da ötesinde, 'Board' sınıfı en karmaşık olanıdır, dolayısıyla bundan sonraki her şey nispeten basit olacaktır.

Adım 3: Programı Tanıyın - Döşeme

Fayans:

Açıklama: Döşeme sınıfı, tek tek döşemelerle ilgilenir ve tüm sınıfların en küçüğüdür. Her döşemenin bir tamsayı değeri ve bir rengi vardır. 0 değerinde (varsayılan) veya # değerinde Döşemeler oluşturan iki kurucuya sahiptir. Yöntemler çoğunlukla kendi kendini açıklayıcıdır ve 'alıcı' ve 'ayarlayıcı' yöntemler toplamın büyük bir kısmını oluşturur.

Yapıcılar:

/* 0 değerinde temel bir döşeme oluşturur */

genel Döşeme() {…}

/* Sayı değerinde bir döşeme oluşturur */

genel Kutucuk (int numarası) {…}

Yöntemler:

/* Döşemenin değerini alır */

public int getValue() {…}

/* Döşemenin değerini ayarlar - iki döşemeyi birbirine eklerken kullanılır */

public void setValue (int değeri) {…}

/* Dize olarak döşemeyi temsil eder - GUI'de kullanılır */

public String toString() {…}

/* Değerine göre döşemenin rengini ayarlar */

public void setColor() {…}

/* Döşemenin rengini alır */

public void getColor() {…}

Adım 4: Programı Tanıyın - Oyun

oyun

Açıklama: Oyun Sınıfı, ana yöntemi, GUI yöntemlerinin çoğunu ve Anahtar etkileşimlerini barındırır. Hem Tile hem de Board sınıflarını alır ve birlikte çalışmalarını sağlar.

Yapıcılar:

Hiçbiri

Yöntemler:

/* GUI'yi uygun boyutlarda kurar ve bir Anahtar Dinleyici ekler */

genel statik boşluk setUpGUI() {…}

/* wasd veya ok tuşlarına basılıp basılmadığını kontrol eder ve uygun eylemleri gerçekleştirir - her harekette JFrame'i günceller */

public void keyPressed (KeyEvent e) {…}

/* GUI'yi bir dizi dizi, tahta, fayans ile boyar ve oyun bittiğinde yeniden boyanmalarını sağlar */

genel boşluk boyası (Grafik g) {…}

/* tek bir döşeme çizer - boyama yönteminden çağrılır */

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

/* Ana yöntem - GUI'yi kurar ve oyunu başlatır */

public static void main(String args) {…}

Adım 5: Önemli Yöntemler - Hareket

Hareket yöntemleri, anlaşılması gereken en önemli yöntemlerdir, ancak iyi haber şu ki, dikey hareketleri anladıktan sonra, bu anlayışı yatay hareketlere uygulayabilirsiniz. Aslında, üç dikey hareket yöntemi, biri satırlar ve diğeri sütunlar arasında hareket dışında, üç yatay yöntem hareketiyle tamamen aynıdır. Bu nedenle sadece dikey hareket yöntemlerine odaklanalım.

private void verticalMove(int satır, int sütun, Dize yönü)

{ Tile first = board[border][col]; Karo karşılaştırma = tahta[satır][sütun]; if (initial.getValue() == 0 || initial.getValue() == karşılaştırma.getValue()) { if (satır > kenar || (direction.equals("aşağı") && (satır < kenar))) { int addScore = initial.getValue() + karşılaştırma.getValue(); if (initial.getValue() != 0) { puan += addScore; } initial.setValue(addScore); karşılaştırma.setValue(0); } } else { if (direction.equals("aşağı")) { border--; } başka { sınır++; } verticalMove(satır, sütun, yön); } }

Yukarıdaki yöntem, verticalMove, 'yukarı' ve 'aşağı' yöntemlerle çağrılır. Şimdi 'yukarı' yöntemine bir göz atalım.

genel boşluk ()

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

Bu yöntem tüm panodan geçer ve "yukarı" parametresiyle her döşeme için dikey Hareket'i çağırır. verticalMove daha sonra 'j' ve 'i' konumundaki döşemeyi 'border' ve 'i' konumundaki döşemeyle karşılaştırır. İkisi eşitse, birleştirilirler. Değillerse, sınır döşemesi 1 artırılır (yerinde parametre 'yukarı' olduğundan) ve dikeyMove yeniden çağrılır.

Önerilen: