Mündəricat:

Öz 2048 Oyununuzu W/Java ilə Proqramlaşdırın: 8 Addım
Öz 2048 Oyununuzu W/Java ilə Proqramlaşdırın: 8 Addım

Video: Öz 2048 Oyununuzu W/Java ilə Proqramlaşdırın: 8 Addım

Video: Öz 2048 Oyununuzu W/Java ilə Proqramlaşdırın: 8 Addım
Video: Аниматор против Анимации 4 (оригинал) 2024, Noyabr
Anonim

PranP1My (Tamamlanmamış) SiteFollow Müəllif tərəfindən daha çox:

Xilas edilmiş PC hissələrindən Arduino CNC Maşını
Xilas edilmiş PC hissələrindən Arduino CNC Maşını
Xilas edilmiş PC hissələrindən Arduino CNC Maşını
Xilas edilmiş PC hissələrindən Arduino CNC Maşını
DIY Müasir Taxta Tezgahlar
DIY Müasir Taxta Tezgahlar
DIY Müasir Taxta Tezgahlar
DIY Müasir Taxta Tezgahlar
Kontaktsiz Qapı Açacağı (vSTEM)
Kontaktsiz Qapı Açacağı (vSTEM)
Kontaktsiz Qapı Açacağı (vSTEM)
Kontaktsiz Qapı Açacağı (vSTEM)

2048 oyununu sevirəm. Buna görə də öz versiyamı proqramlaşdırmağa qərar verdim.

Əsl oyuna çox bənzəyir, amma özüm proqramlaşdırmaq mənə istədiyimi istədiyim şeyi dəyişdirmə azadlığı verir. Tipik 4x4 əvəzinə 5x5 oyun istəsəm, 'Board' konstruktorundan istifadə edərək sadə bir dəyişiklik bunu etməyə imkan verəcək. Təsadüfi deyil, oyunçu üçün ən mürəkkəb hala gətirəcək mövqelər əlavə edərək oyunu çətinləşdirmək istədiyimi söyləyin. Sadə bir alqoritmdən istifadə edərək bunu edə bilərəm. Bu Təlimat kitabında bütün bu dəyişiklikləri əhatə etməsəm də, getdikcə daha çox əlavə etməyi planlaşdırıram.

Ancaq hələlik, tipik 2048 oyununu proqramlaşdıracağıq.

Gəlin başlayaq!

(Yan qeyd: Bu Təlimat proqramlaşdırma üzrə orta bilik tələb edir - xüsusən Java ilə)

Addım 1: Materiallar

Materiallar
Materiallar

Bu proqram üçün çox şeyə ehtiyacınız olmayacaq, çünki bu, sadəcə bir proqramlaşdırma yoludur.

Materiallar:

  • Noutbuk
  • Eclipse (və ya seçdiyiniz hər hansı bir IDE)

Bəli Bu belədir.

Addım 2: Proqramla tanış olun - İdarə Heyəti

Bütün kodumu GitHub -a yüklədim - buradan yoxlayın:

Oyunu 3 sinfə ayırdım: Board, Tile və Game.

Lövhə:

Təsvir: Board sinfi oyun lövhəsi ilə məşğul olur, bir sıra 'Çini' elementləri qurur, cari hesab və ən yüksək kafel alır və serialı bir simə qoyur (daha sonra 'Oyunda' istifadə ediləcək). Məntiqin çoxu da burada, təsadüfi yerlərdə 2 və 4 -ü yumurtlamaq, yuxarı, aşağı, sola və sağa hərəkət etmək və oyun bitdikdə oyunçulara bildirmək üçün üsullar verən sinifdir.

Konstruktorlar:

/ * Board üçün standart qurucu - 4x4 matris qurur */

ictimai idarə heyəti () {…}

/ * İdarə Heyəti üçün Konstruktor - müəyyən edilmiş ızgara ölçüsü olan bir matris qurur */

ictimai idarə heyəti (int ızgaraları) {…}

Metodlar:

/ * Lövhəni qaytaran Getter metodu */

ümumi kirəmit getBoard () {…}

/ * Hesabını qaytaran Getter metodu */

ictimai int getScore () {…}

/ * Lövhədə ən yüksək kafel tapır və geri qaytarır */

public int getHighTile () {…}

/ * Lövhəni konsola yazdırır - test məqsədi ilə */

public void print () {…}

/ * Lövhəni String olaraq qaytarır - GUI -də istifadə olunur */

ictimai String toString () {…}

/ * Hərəkət edildikdə boş bir yerdə 2 (və ya 4) əmələ gətirir */

ictimai boşluq yumurtası () {…}

/ * Lövhənin tamamilə qaraldığını yoxlayır və əgər varsa, oyunçuları yenidən başlatmağa sövq edəcək */

public boolean blackOut () {…}

/ * Oyunun bitib -bitmədiyini yoxlayır - lövhə qaralanda və plitələrdən heç biri birləşə bilmədikdə */

ictimai boolean oyunuOver () {…}

/ * 'W' və ya yuxarı ox basıldığında çağırılır - 'yuxarı' parametri olan lövhədəki hər bir kafel üçün 'verticalMove' çağırır */

ictimai boşluq () {…}

/ * 'S' və ya aşağı oxu basıldıqda çağırılır - 'down' parametri olan lövhədəki hər bir kafel üçün 'verticalMove' çağırır */public void down () {…}

/ * 'D' və ya sağ oxu basıldığında çağırılır - 'right' */public void right () {…} parametri ilə lövhədəki hər bir kafel üçün 'HorizontalMove' çağırılır.

/ * 'A' və ya sol oxu basıldığında çağırılır - 'sol' parametri olan lövhədəki hər bir kafel üçün 'HorizontalMove' çağırır */

ictimai boşluq sol () {…}

/* İki kafelin dəyərlərini bir -biri ilə müqayisə edir və əgər onlar eynidirsə və ya 0 -a bərabərdirsə (düz kafel) - dəyərləri əlavə olunur (müqayisə etdiyimiz plitələr iki fərqli plitələrdir və müvafiq istiqamətə doğru hərəkət edir) - rekursiv olaraq sıra boyunca hərəkət edir */

ictimai boşluq üfüqiMove (int satır, int col, String istiqaməti) {…}

/* İki kafelin dəyərlərini bir -biri ilə müqayisə edir və əgər onlar eynidirsə və ya 0 -a bərabərdirsə (düz kafel) - dəyərləri əlavə olunur (müqayisə etdiyimiz plitələr iki fərqli plitələrdir və müvafiq istiqamətə doğru hərəkət edir) - rekursiv olaraq sütunda hərəkət edir */

public void verticalMove (int sıra, int col, String istiqaməti) {…}

Bəli, bu bir çox metoddur - amma narahat olmayın, əksəriyyətini başa düşmək çox asandır. Bunun üzərinə 'Board' sinfi ən mürəkkəbdir, buna görə bundan sonra hər şey nisbətən sadə olacaq.

Addım 3: Proqramla tanış olun - Çini

Çini:

Təsvir: Çini sinfi fərdi plitələrlə məşğul olur və bütün siniflərin ən kiçiyidir. Hər bir kafel bir tam ədəd və bir rəngə malikdir. 0 (defolt) və ya #dəyərli Fayans yaradan iki konstruktor var. Metodlar əsasən özünü izah edir, 'getter' və 'setter' üsulları ilə cəminin böyük bir hissəsini təşkil edir.

Konstruktorlar:

/ * 0 * dəyəri olan əsas bir kafel qurur/

ümumi kirəmit () {…}

/ * Sayı dəyəri olan bir kafel qurur */

ümumi kirəmit (int nömrəsi) {…}

Metodlar:

/ * Kafelin dəyərini alır */

public int getValue () {…}

/ * Kafelin dəyərini təyin edir - iki plitəni bir yerə əlavə edərkən istifadə olunur */

ictimai boşluq setValue (int dəyəri) {…}

/ * Kafel String kimi təmsil olunur - GUI -də istifadə olunur */

ictimai String toString () {…}

/ * Kafelin rəngini dəyərinə görə təyin edir */

ictimai boşluq setColor () {…}

/ * Kafelin rəngini alır */

ictimai boşluq getColor () {…}

Addım 4: Proqramla tanış olun - Oyun

Oyun

Təsvir: Game Class əsas metodu, GUI metodlarının çoxunu və Əsas qarşılıqlı əlaqələri özündə cəmləşdirir. Həm Tile, həm də Board siniflərini alır və birlikdə işləmələrini təmin edir.

Konstruktorlar:

Heç biri

Metodlar:

/ * uyğun ölçülü GUI qurur və Açar Dinləyici əlavə edir */

ümumi statik boşluq setUpGUI () {…}

/ * Ward və ya ox düymələrinin basıldığını yoxlayır və müvafiq hərəkətləri yerinə yetirir - hər hərəkətində JFrame -i yeniləyir */

public void key Pressed (KeyEvent e) {…}

/ * GUI -ni bir sıra simlər, lövhə, plitələrlə boyayır və oyun bitdikdə yenidən rənglənməsini təmin edir */

ictimai boş boya (Grafika g) {…}

/ * fərdi bir kafel çəkir - boya üsulundan çağırılır */

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

/ * Əsas metod - GUI qurur və oyuna başlayır */

ümumi statik boşluq əsas (String args) {…}

Addım 5: Mühüm Metodlar - Hərəkət

Anlamaq üçün ən vacib olan hərəkət üsullarıdır, amma yaxşı xəbər şaquli hərəkətləri anladığınız zaman, bu anlayışı üfüqi hərəkətlərə tətbiq edə bilərsiniz. Əslində, üç şaquli hərəkət üsulu, üç üfüqi üsul hərəkəti ilə eynidır, yalnız biri satırda, digəri isə sütunlarda hərəkət edir. Bu səbəbdən yalnız şaquli hərəkət üsullarına diqqət edək.

şəxsi boşluq şaquliMove (int sıra, int col, String istiqaməti)

{Çini ilkin = lövhə [haşiyə] [col]; Çini müqayisə = lövhə [satır] [col]; if (initial.getValue () == 0 || initial.getValue () == müqayisə.getValue ()) {if (satır> haşiyə || (istiqamət. bərabərdir ("aşağı") && (satır <haşiyə))) {int addScore = initial.getValue () + müqayisə.getValue (); if (initial.getValue ()! = 0) {hesab += addScore; } initial.setValue (addScore); müqayisə.setValue (0); }} başqa {əgər (istiqamət. bərabərdir ("aşağı")) {haşiyə--; } başqa {sərhəd ++; } vertikalMove (satır, sütun, istiqamət); }}

Yuxarıda göstərilən verticalMove metodu 'yuxarı' və 'aşağı' üsulları ilə çağırılır. Gəlin 'yuxarı' üsuluna nəzər salaq.

ictimai boşluq ()

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

Bu üsul bütün lövhədən keçir və "yuxarı" parametri olan hər bir kafel üçün verticalMove çağırır. verticalMove sonra 'j' və 'i' mövqesindəki kafel'i 'border' və 'i' mövqesindəki kafel ilə müqayisə edir. İkisi bərabərdirsə, birləşdirilir. Əks təqdirdə, sərhəd plitəsi 1 artırılır (yerdəki parametr 'yuxarı' olduğu üçün) və verticalMove yenidən çağırılır.

Tövsiyə: