Mundarija:

O'zingizning 2048 o'yinini W/Java bilan dasturlashtiring: 8 qadam
O'zingizning 2048 o'yinini W/Java bilan dasturlashtiring: 8 qadam

Video: O'zingizning 2048 o'yinini W/Java bilan dasturlashtiring: 8 qadam

Video: O'zingizning 2048 o'yinini W/Java bilan dasturlashtiring: 8 qadam
Video: Qaysi biri yaxshiroq - o'zingizning biznesingiz yoki ishlash? | Bobir Akilkhanov 2024, Iyul
Anonim

PranP1My (tugallanmagan) SiteFollow tomonidan muallifning yana:

Kompyuterning qutqarilgan qismlaridan Arduino CNC mashinasi
Kompyuterning qutqarilgan qismlaridan Arduino CNC mashinasi
Kompyuterning qutqarilgan qismlaridan Arduino CNC mashinasi
Kompyuterning qutqarilgan qismlaridan Arduino CNC mashinasi
DIY zamonaviy yog'och dastgohlar
DIY zamonaviy yog'och dastgohlar
DIY zamonaviy yog'och dastgohlar
DIY zamonaviy yog'och dastgohlar
Kontaktsiz eshik ochuvchi (vSTEM)
Kontaktsiz eshik ochuvchi (vSTEM)
Kontaktsiz eshik ochuvchi (vSTEM)
Kontaktsiz eshik ochuvchi (vSTEM)

Men o'yinni yaxshi ko'raman 2048. Shunday qilib, men o'z versiyamni dasturlashga qaror qildim.

Bu haqiqiy o'yinga juda o'xshaydi, lekin uni o'zim dasturlashim menga xohlagan narsani o'zgartirish huquqini beradi. Agar men odatdagi 4x4 o'rniga 5x5 o'yinni xohlasam, "Board" konstruktoridan foydalangan holda oddiy o'zgarish qilishimga imkon beradi. Ayting -chi, men o'yinni tasodifiy emas, balki o'yinchi uchun eng murakkab holga keltiradigan qismlarni qo'shib, o'yinni qiyinlashtirmoqchiman. Oddiy algoritmdan foydalanib, men buni qila olaman. Men ushbu ko'rsatmalarda bu o'zgarishlarning barchasini qamrab olmagan bo'lsam -da, men borgan sari ko'proq qo'shishni rejalashtirmoqdaman.

Hozircha, biz sizning 2048 yilgi odatiy o'yiningizni dasturlashtiramiz.

Qani boshladik!

(Yon eslatma: bu ko'rsatma dasturlash bo'yicha o'rtacha ma'lumotni talab qiladi - ayniqsa Java bilan)

1 -qadam: materiallar

Materiallar
Materiallar

Bu loyiha uchun sizga ko'p narsa kerak bo'lmaydi, chunki bu shunchaki dasturlash usuli.

Materiallar:

  • Noutbuk
  • Tutilish (yoki siz tanlagan IDE)

Ha. Bo'ldi shu.

2 -qadam: Dastur - doska bilan tanishing

Men barcha kodimni GitHub -ga yukladim - bu erda tekshiring:

Men o'yinni 3 sinfga ajratdim: taxta, kafel va o'yin.

Kengash:

Tavsif: Kengash klassi o'yin taxtasi bilan shug'ullanadi, "Tile" elementlari majmuasini o'rnatadi, joriy ball va eng yuqori plitkani oladi va qatorni qatorga qo'yadi (keyinchalik "O'yin" da ishlatiladi). Mantiqning ko'p qismi ham shu erda, tasodifiy joylarda 2 va 4 -chi urug'larni o'stirish, yuqoriga, pastga, chapga va o'ngga siljish va o'yin tugagandan so'ng o'yinchilarga xabar berish usullarini ta'minlaydigan sinf.

Konstruktorlar:

/ * Kengash uchun standart konstruktor - 4x4 matritsani o'rnatadi */

jamoatchilik kengashi () {…}

/ * Kengash konstruktori - belgilangan katak o'lchamiga ega matritsani o'rnatadi */

jamoatchilik kengashi (int tarmoqlari) {…}

Usullari:

/ * Kengashni qaytaradigan Getter usuli */

umumiy kafel getBoard () {…}

/ * Hisobni qaytaradigan Getter usuli */

public int getScore () {…}

/ * Taxtadagi eng baland plitkani topib, qaytaradi */

public int getHighTile () {…}

/ * Sinov maqsadida taxtani konsolga chop etadi */

public void print () {…}

/ * Kengashni String sifatida qaytaradi - GUIda ishlatiladi */

public String toString () {…}

/ * Harakat paytida bo'sh joyda 2 (yoki 4) ni tug'diradi */

ommaviy bo'shliq paydo bo'lishi () {…}

/ * Kengash to'liq qoralanganligini tekshiradi va agar shunday bo'lsa, u o'yinchilarni qayta ishga tushirishga undaydi */

ommaviy boolean blackOut () {…}

/ * O'yin tugaganmi yoki yo'qligini tekshiradi - taxta qorong'i bo'lganda va plitalarning hech biri birlashtira olmaydi */

ommaviy boolean o'yinOver () {…}

/ * "W" yoki yuqoriga o'q bosilganda chaqiriladi - "yuqoriga" parametri bo'lgan taxtadagi har bir plitka uchun 'vertikalMove' chaqiriladi */

ommaviy bo'shliq () {…}

/ * 'S' yoki pastga o'qi bosilganda chaqiriladi - 'vertikal' */public void down () {…} parametrli har bir plitka uchun 'vertikalMove' chaqiriladi.

/ * 'D' yoki o'ng o'qi bosilganda chaqiriladi - 'o'ng' */public void right () {…} parametrli har bir plitka uchun 'GorizontalMove' chaqiriladi.

/ * 'A' yoki chap o'q bosilganda chaqiriladi - 'chap' parametri bo'lgan taxtadagi har bir plitka uchun 'GorizontalMove' chaqiriladi */

umumiy bo'sh joy chap () {…}

/* Ikkita kafelning qiymatlarini birgalikda taqqoslaydi va agar ular bir xil bo'lsa yoki 0 ga teng bo'lsa (oddiy plitka) - ularning qiymatlari qo'shiladi (agar biz taqqoslayotgan plitalar ikki xil plitka bo'lsa va ular to'g'ri yo'nalishga qarab harakatlansa). - rekursiv ravishda qator bo'ylab harakatlanadi */

umumiy bo'shliq GorizontalMove (int qator, int col, String yo'nalishi) {…}

/* Ikkita kafelning qiymatlarini birgalikda taqqoslaydi va agar ular bir xil bo'lsa yoki 0 ga teng bo'lsa (oddiy plitka) - ularning qiymatlari qo'shiladi (agar biz taqqoslayotgan plitalar ikki xil plitka bo'lsa va ular to'g'ri yo'nalishga qarab harakatlansa). - rekursiv ravishda ustun bo'ylab harakatlanadi */

public void verticalMove (int qator, int col, String yo'nalishi) {…}

Ha, bu juda ko'p usullar, lekin xavotir olmang, aksariyatini tushunish juda oson. Buning ustiga, "Board" klassi eng murakkab, shuning uchun bundan keyin hamma narsa nisbatan sodda bo'ladi.

3 -qadam: Dastur bilan tanishing - Tile

Plitka:

Tavsif: "Plitka" klassi alohida plitalar bilan shug'ullanadi va barcha sinflarning eng kichigi hisoblanadi. Har bir kafel butun sonli qiymat va rangga ega. U 0 (standart) yoki #qiymatli plitkalarni yaratadigan ikkita konstruktorga ega. Usullar, asosan, o'z -o'zidan tushunarli bo'lib, "getter" va "setter" usullari umumiy miqdorni tashkil qiladi.

Konstruktorlar:

/ * 0 * qiymatli asosiy kafelni quradi.

umumiy kafel () {…}

/ * Raqam qiymatiga ega kafel yasaydi */

umumiy kafel (int raqami) {…}

Usullari:

/ * Plitka qiymatini oladi */

public int getValue () {…}

/ * Plitka qiymatini belgilaydi - ikkita plitkani bir -biriga qo'shganda ishlatiladi */

public void setValue (int qiymati) {…}

/ * Plitkani String sifatida ifodalaydi - GUIda ishlatiladi */

public String toString () {…}

/ * Plitka rangini uning qiymatiga qarab belgilaydi */

umumiy bo'shliq setColor () {…}

/ * Plitka rangini oladi */

public void getColor () {…}

4 -qadam: Dastur - O'yin bilan tanishing

O'yin

Tavsif: O'yin sinfida asosiy usul, GUI usullarining aksariyati va asosiy o'zaro ta'sirlar mavjud. Bu "Tile" va "Board" sinflarini oladi va birgalikda ishlashga imkon beradi.

Konstruktorlar:

Hech kim

Usullari:

/ * kerakli o'lchamdagi GUIni o'rnatadi va kalit tinglovchini qo'shadi */

umumiy statik bo'shlik setUpGUI () {…}

/ * Vard yoki o'q tugmachalari bosilganligini tekshiradi va tegishli amallarni bajaradi - JFrame -ni har bir harakat bilan yangilaydi */

public void keyPressed (KeyEvent e) {…}

/ * GUI -ni bir qator chiziqlar, taxtalar, plitkalar bilan bo'yaydi va o'yin tugagandan so'ng ularni qayta bo'yashini ta'minlaydi */

ommaviy bo'sh bo'yoq (Grafika g) {…}

/ * individual kafelni chizadi - bo'yoq usulidan chaqiriladi */

umumiy bo'sh joy DrawTiles (Grafika g, Tile kafel, int x, int y) {…}

/ * Asosiy usul - GUIni o'rnatadi va o'yinni boshlaydi */

umumiy statik void asosiy (String args) {…}

5 -qadam: Muhim usullar - harakat

Harakat usullarini tushunish eng muhim, lekin xushxabar - vertikal harakatlarni tushunganingizdan so'ng, siz buni gorizontal harakatlarga qo'llashingiz mumkin. Aslida, uchta vertikal harakat usuli uchta gorizontal usul harakati bilan bir xil, faqat bitta satr bo'ylab, ikkinchisi esa ustunlar bo'ylab. Shuning uchun, keling, vertikal harakat usullariga to'xtalib o'tamiz.

private void verticalMove (int qator, int col, String yo'nalishi)

{Tile boshlang'ich = taxta [chegara] [col]; Tile solishtirish = taxta [qator] [col]; if (initial.getValue () == 0 || initial.getValue () == solishtirish.getValue ()) {if (qator> chegara || (yo'nalish. teng ("pastga") && (qator <chegara))) {int addScore = initial.getValue () + solishtirish.getValue (); if (initial.getValue ()! = 0) {ball += addScore; } initial.setValue (addScore); solishtiring. setValue (0); }} else {if (direction.equals ("pastga")) {chegara--; } boshqa {chegara ++; } verticalMove (qator, ustun, yo'nalish); }}

Yuqoridagi vertikalMove usuli "yuqoriga" va "pastga" usullari bilan chaqiriladi. Keling, "yuqoriga" usulini ko'rib chiqaylik.

ommaviy bo'shliq ()

{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 usul butun taxtadan o'tadi va "yuqoriga" parametrli har bir plitka uchun verticalMove -ni chaqiradi. vertikal ravishda "j" va "i" pozitsiyalaridagi plitkani "chegara" va "i" pozitsiyasidagi plitka bilan taqqoslaydi. Agar ikkalasi teng bo'lsa, ular birlashtiriladi. Agar ular bo'lmasa, chegara katakchasi 1 ga ko'payadi (chunki parametr "yuqoriga") va verticalMove yana chaqiriladi.

Tavsiya: