Агуулгын хүснэгт:

Java 2048 тоглоомыг өөрийн гараар програмчлах: Java: 8 алхам
Java 2048 тоглоомыг өөрийн гараар програмчлах: Java: 8 алхам

Видео: Java 2048 тоглоомыг өөрийн гараар програмчлах: Java: 8 алхам

Видео: Java 2048 тоглоомыг өөрийн гараар програмчлах: Java: 8 алхам
Видео: RTX 3090 Ti vs RTX 3060 Ultimate Showdown for Stable Diffusion, ML, AI & Video Rendering Performance 2024, Арваннэгдүгээр
Anonim

By PranP1My (Бүрэн бус) SiteFollow Зохиогчийн дэлгэрэнгүй:

Arduino CNC машиныг аврагдсан компьютерийн хэсгүүдээс
Arduino CNC машиныг аврагдсан компьютерийн хэсгүүдээс
Arduino CNC машиныг аврагдсан компьютерийн хэсгүүдээс
Arduino CNC машиныг аврагдсан компьютерийн хэсгүүдээс
DIY орчин үеийн модон вандан сандал
DIY орчин үеийн модон вандан сандал
DIY орчин үеийн модон вандан сандал
DIY орчин үеийн модон вандан сандал
Контактгүй хаалга онгойлгогч (vSTEM)
Контактгүй хаалга онгойлгогч (vSTEM)
Контактгүй хаалга онгойлгогч (vSTEM)
Контактгүй хаалга онгойлгогч (vSTEM)

Би 2048 тоглоомд дуртай. Тэгээд би өөрийнхөө хувилбарыг програмчлахаар шийдсэн.

Энэ нь бодит тоглоомтой маш төстэй боловч өөрөө програмчлах нь надад хүссэн бүхнээ хүссэн үедээ өөрчлөх эрх чөлөөг өгдөг. Хэрэв би ердийн 4x4 -ийн оронд 5х5 хэмжээтэй тоглоом хүсч байвал 'Board' конструктор ашиглан хийсэн энгийн өөрчлөлт надад үүнийг хийх боломжийг олгоно. Тоглоомыг санамсаргүй байдлаар биш харин тоглогчийн хувьд хамгийн төвөгтэй болгоно. Энгийн алгоритмыг ашиглан би үүнийг хийж чадна. Энэхүү зааварчилгаанд би эдгээр бүх өөрчлөлтийг хамруулахгүй ч гэсэн би явж байхдаа нэмж оруулахаар төлөвлөж байна.

Гэхдээ одоогоор бид таны ердийн тоглоом болох 2048 оныг програмчлах болно.

Эхэлцгээе!

(Хажуугийн тэмдэглэл: Энэхүү зааварчилгаа нь програмчлалын талаар дунд зэргийн мэдлэг шаарддаг - ялангуяа Java дээр)

Алхам 1: Материал

Материал
Материал

Энэ төслийн хувьд танд маш их зүйл хэрэггүй болно, учир нь энэ бол зүгээр л програмчлалын алхам юм.

Материал:

  • Зөөврийн компьютер
  • Eclipse (эсвэл таны хүссэн IDE)

Тийм ээ. Ингээд л боллоо.

Алхам 2: Хөтөлбөртэй танилцана уу

Би бүх кодоо GitHub дээр байршуулсан - эндээс үзээрэй:

Би тоглоомыг самбар, хавтан, тоглоом гэсэн 3 ангилалд хуваасан.

Удирдах зөвлөл:

Тайлбар: Удирдах зөвлөлийн анги нь тоглоомын самбар, 'Хавтан' элементүүдийн массивыг тохируулах, одоогийн оноо, хамгийн өндөр хавтанг авах, массивыг мөрөнд оруулах (дараа нь 'Тоглоом' хэсэгт ашиглах болно). Ихэнх логикууд энд байдаг бөгөөд 2, 4 -ийг санамсаргүй байдлаар байрлуулах, дээш, доош, зүүн, баруун тийш шилжүүлэх, тоглоом дуусах үед тоглогчдод мэдэгдэх аргуудыг өгдөг анги юм.

Барилгачид:

/ * Удирдах зөвлөлийн үндсэн бүтээгч - 4х4 хэмжээтэй матрицыг тохируулдаг */

олон нийтийн зөвлөл () {…}

/ * Удирдах зөвлөлд зориулсан конструктор - заасан торны хэмжээтэй матрицыг тохируулна */

олон нийтийн зөвлөл (int grids) {…}

Аргууд:

/ * Самбарыг буцаах Getter арга */

нийтийн хавтан getBoard () {…}

/ * Оноог буцаах Getter арга */

public int getScore () {…}

/ * Самбар дээрх хамгийн өндөр хавтанг олоод буцааж өгнө */

public int getHighTile () {…}

/ * Туршилтын зорилгоор самбарыг консол дээр хэвлэнэ */

нийтийн хоосон хэвлэх () {…}

/ * Самбарыг String хэлбэрээр буцаана - GUI -д ашиглагдана */

public String toString () {…}

/ * Хөдлөх үед хоосон орон зайд 2 (эсвэл 4) үржүүлдэг */

нийтийн хоосон төрөлт () {…}

/ * Самбар бүрэн харанхуй болсон эсэхийг шалгадаг бөгөөд хэрэв тийм бол тоглогчдыг дахин эхлүүлэхэд түлхэц өгөх болно */

public boolean blackOut () {…}

/ * Тоглоом дууссан эсэхийг шалгана - самбарыг харлуулж, хавтангуудын аль нь ч нэгтгэж чадахгүй бол */

нийтийн логик тоглоомOver () {…}

/ * 'W' эсвэл дээш сум дарагдсан үед дууддаг - 'up' параметртэй самбар дээрх хавтан бүрийн хувьд 'verticalMove' гэж дууддаг */

public void up () {…}

/ * 'S' эсвэл доош сум дарагдсан үед дууддаг - 'down' параметртэй самбар дээрх хавтан бүрийн хувьд 'verticalMove' гэж дууддаг */public void down () {…}

/ * 'D' эсвэл баруун сумыг дарахад дууддаг - 'right' параметртэй самбар дээрх хавтан бүрийн хувьд 'horizontalMove' гэж дууддаг */public void right () {…}

/ * 'A' эсвэл зүүн сум дарагдсан үед дууддаг - 'зүүн' параметртэй самбар дээрх хавтан бүрийн хувьд 'horizontalMove' гэж дууддаг */

нийтийн хоосон орон зай () {…}

/* Хоёр хавтангийн утгыг хооронд нь харьцуулж, хэрэв тэдгээр нь ижил эсвэл нэг нь 0 -тэй тэнцүү бол (энгийн хавтан) - тэдгээрийн утгыг нэмнэ (бидний харьцуулж буй хавтан нь хоёр өөр хавтан бөгөөд тэдгээр нь зохих чиглэл рүү явж байгаа тохиолдолд) - эгнээний дундуур рекурсив шилжих */

public void horizontalMove (int row, int col, String direction) {…}

/* Хоёр хавтангийн утгыг хооронд нь харьцуулж, хэрэв тэдгээр нь ижил эсвэл нэг нь 0 -тэй тэнцүү бол (энгийн хавтан) - тэдгээрийн утгыг нэмнэ (бидний харьцуулж буй хавтан нь хоёр өөр хавтан бөгөөд тэдгээр нь зохих чиглэл рүү явж байгаа тохиолдолд) - баганын дундуур рекурсив шилжих */

public void verticalMove (int row, int col, String direction) {…}

Тийм ээ, энэ бол маш олон арга боловч санаа зовох хэрэггүй, ихэнхийг нь ойлгоход маш хялбар байдаг. Дээрээс нь 'Board' анги нь хамгийн төвөгтэй тул үүнээс хойшхи бүх зүйл харьцангуй энгийн байх болно.

Алхам 3: Хөтөлбөртэй танилцана уу - Хавтан

Хавтан:

Тодорхойлолт: Хавтангийн анги нь тус тусдаа хавтанцартай харьцдаг бөгөөд бүх ангийн хамгийн жижиг нь юм. Хавтан бүр нь бүхэл тоо, өнгөтэй байна. Энэ нь 0 (анхдагч) эсвэл #утга бүхий хавтанг үүсгэдэг хоёр бүтээгчтэй. Аргууд нь ихэвчлэн өөрөө тайлбарладаг бөгөөд 'getter' ба 'setter' гэсэн аргуудын нийлбэрийг бүрдүүлдэг.

Барилгачид:

/ * 0 * гэсэн утгатай үндсэн хавтанг бүтээдэг/

нийтийн хавтан () {…}

/ * Тооны утгатай хавтанг бүтээдэг */

нийтийн хавтан (int дугаар) {…}

Аргууд:

/ * Хавтангийн үнэ цэнийг авна */

public int getValue () {…}

/ * Хавтанцарын утгыг тохируулна - хоёр хавтанг хамтад нь нэмэхэд ашигладаг */

public void setValue (int утга) {…}

/ * Хавтанг String хэлбэрээр илэрхийлнэ - GUI -д ашиглагддаг */

public String toString () {…}

/ * Хавтанцарын өнгийг үнэ цэнээр нь тохируулна */

public void setColor () {…}

/ * Хавтангийн өнгийг авна */

public void getColor () {…}

Алхам 4: Хөтөлбөртэй танилцах - Тоглоом

Тоглоом

Тодорхойлолт: Тоглоомын анги нь үндсэн арга, ихэнх GUI арга, гол харилцан үйлчлэлийг агуулдаг. Энэ нь Хавтан ба ТУЗ -ийн ангиудыг хоёуланг нь авч, хамтран ажиллах боломжийг олгодог.

Барилгачид:

Аль нь ч биш

Аргууд:

/ * GUI -ийг зохих хэмжээгээр тохируулж, Түлхүүр сонсогчийг нэмнэ */

нийтийн статик хоосон зай setUpGUI () {…}

/ * Ward эсвэл сумтай товчлуурууд дарагдсан эсэхийг шалгаж, зохих үйлдлүүдийг хийдэг - JFrame -ийг алхам тутамд шинэчилдэг */

нийтийн хоосон түлхүүр дарагдсан (KeyEvent e) {…}

/ * GUI -ийг цуврал мөр, самбар, хавтангаар будаж, тоглоом дуусахад дахин будахыг баталгаажуулдаг */

нийтийн хоосон будаг (График g) {…}

/ * бие даасан хавтан зурдаг - будгийн аргаар дууддаг */

нийтийн хоосон зургийн хавтан (График g, Хавтанцарын хавтан, int x, int y) {…}

/ * Үндсэн арга - GUI -ийг тохируулж тоглоомыг эхлүүлнэ */

нийтийн статик хоосон үндсэн (String args) {…}

Алхам 5: Чухал арга - Хөдөлгөөн

Хөдөлгөөний аргуудыг ойлгох нь хамгийн чухал боловч сайн мэдээ бол босоо хөдөлгөөнийг ойлгосны дараа та энэ ойлголтыг хэвтээ хөдөлгөөнд ашиглаж болно. Үнэн хэрэгтээ босоо чиглэлд шилжих гурван арга нь хэвтээ аргын гурван хөдөлгөөнтэй яг адилхан бөгөөд нэг нь мөр, нөгөө нь баганаар хөндлөн хөдөлдөг. Ийм учраас босоо хөдөлгөөн хийх аргуудыг л анхаарч үзье.

private void verticalMove (int row, int col, String direction)

{Хавтанцарын эхлэл = самбар [хил] [col]; Хавтан харьцуулах = самбар [эгнээ] [col]; if (initial.getValue () == 0 || initial.getValue () == харьцуулах.getValue ()) {if (мөр> хил || (чиглэл. тэгш ("доош") && (мөр <хил))) {int addScore = initial.getValue () + харьцуулах.getValue (); if (initial.getValue ()! = 0) {оноо += addScore; } initial.setValue (addScore); харьцуулах.setValue (0); }} else {if (direction.equals ("down")) {border--; } өөр {хил ++; } verticalMove (мөр, col, чиглэл); }}

Дээрх verticalMove аргыг 'дээш' ба 'доош' аргуудаар нэрлэдэг. "Дээш" аргыг авч үзье.

нийтийн хоосон байдал ()

{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"); }}}}}

Энэ арга нь самбарыг бүхэлд нь дамжуулж, "дээш" гэсэн параметр бүхий хавтан бүрт verticalMove гэж дууддаг. verticalMove дараа нь 'j' ба 'i' байрлал дахь хавтанг 'border' ба 'i' байрлал дахь хавтантай харьцуулна. Хэрэв хоёулаа тэнцүү бол тэдгээрийг нэгтгэдэг. Хэрэв тийм биш бол хилийн хавтанг 1 -ээр нэмэгдүүлнэ (байрлал дахь параметр нь 'дээш' байх тул), verticalMove -ийг дахин дуудна.

Зөвлөмж болгож буй: