جدول المحتويات:

قم ببرمجة لعبة 2048 الخاصة بك مع جافا!: 8 خطوات
قم ببرمجة لعبة 2048 الخاصة بك مع جافا!: 8 خطوات

فيديو: قم ببرمجة لعبة 2048 الخاصة بك مع جافا!: 8 خطوات

فيديو: قم ببرمجة لعبة 2048 الخاصة بك مع جافا!: 8 خطوات
فيديو: اتعلمو معنا فنون القتال 😂 2024, شهر نوفمبر
Anonim

بواسطة PranP1My (غير مكتمل) Site

آلة Arduino CNC من أجزاء الكمبيوتر التي تم إنقاذها
آلة Arduino CNC من أجزاء الكمبيوتر التي تم إنقاذها
آلة Arduino CNC من أجزاء الكمبيوتر التي تم إنقاذها
آلة Arduino CNC من أجزاء الكمبيوتر التي تم إنقاذها
مقاعد خشبية حديثة DIY
مقاعد خشبية حديثة DIY
مقاعد خشبية حديثة DIY
مقاعد خشبية حديثة DIY
فتاحة باب بدون تلامس (vSTEM)
فتاحة باب بدون تلامس (vSTEM)
فتاحة باب بدون تلامس (vSTEM)
فتاحة باب بدون تلامس (vSTEM)

أحب لعبة 2048. ولذا قررت أن أبرمج نسختي الخاصة.

إنها مشابهة جدًا للعبة الفعلية ، لكن برمجتها بنفسي تمنحني الحرية في تغيير ما أريد وقتما أريد. إذا كنت أريد لعبة 5 × 5 بدلاً من 4 × 4 النموذجية ، فإن التغيير البسيط باستخدام مُنشئ "اللوحة" سيسمح لي بالقيام بذلك. لنفترض أنني أريد أن أجعل اللعبة أكثر صعوبة ، بإضافة القطع في المواضع التي تجعلها أكثر تعقيدًا بالنسبة للاعب وليس بشكل عشوائي. باستخدام خوارزمية بسيطة ، يمكنني فعل ذلك. على الرغم من أنني لن أغطي كل هذه التعديلات في Instructable ، فإنني أخطط لإضافة المزيد أثناء التنقل.

لكن في الوقت الحالي ، سنبرمج لعبتك النموذجية لعام 2048.

هيا بنا نبدأ!

(ملاحظة جانبية: هذا Instructable يتطلب معرفة معتدلة بالبرمجة - خاصة مع Java)

الخطوة 1: المواد

المواد
المواد

لن تحتاج إلى الكثير لهذا المشروع لأنه مجرد تجول في البرمجة.

المواد:

  • حاسوب محمول
  • كسوف (أو أي IDE من اختيارك)

نعم. هذا كل شيء.

الخطوة 2: تعرف على البرنامج - المجلس

لقد قمت بتحميل كل الكود الخاص بي على GitHub - تحقق من ذلك هنا:

لقد قسمت اللعبة إلى 3 فئات: لوحة ، تجانب ، ولعبة.

مجلس:

الوصف: تتعامل فئة اللوحة مع لوحة الألعاب ، وتقوم بإعداد مجموعة من عناصر "المربعات" ، والحصول على الدرجة الحالية وأعلى قطعة ، ووضع المصفوفة في سلسلة (لاستخدامها لاحقًا في "اللعبة"). معظم المنطق موجود هنا أيضًا ، حيث يوفر الفصل طرقًا لتوليد 2 و 4 في مواقع عشوائية ، والتحرك لأعلى ولأسفل ولليسار ولليمين ، وإعلام اللاعبين عندما تنتهي اللعبة.

المنشئون:

/ * المُنشئ الافتراضي للوحة - يُنشئ مصفوفة 4x4 * /

لوحة عامة () {…}

/ * مُنشئ اللوحة - يُنشئ مصفوفة بحجم الشبكة المحدد * /

لوحة عامة (شبكات int) {…}

أساليب:

/ * طريقة Getter التي تُرجع اللوحة * /

تجانب عام getBoard () {…}

/ * طريقة Getter التي تُرجع النتيجة * /

getScore int العامة () {…}

/ * يبحث عن أعلى بلاطة على السبورة ويعيدها * /

getHighTile int العامة () {…}

/ * طباعة اللوحة على وحدة التحكم - لأغراض الاختبار * /

طباعة باطلة عامة () {…}

/ * إرجاع اللوحة كسلسلة - مستخدمة في واجهة المستخدم الرسومية * /

سلسلة toString العامة () {…}

/ * يولد 2 (أو 4) في مساحة فارغة في الوقت الذي يتم فيه التحرك * /

تفرخ الفراغ العام () {…}

/ * يتحقق لمعرفة ما إذا كانت اللوحة محجوبة تمامًا وإذا كانت كذلك ، فسوف تدفع اللاعبين لإعادة التشغيل * /

blackOut المنطقية العامة () {…}

/ * يتحقق لمعرفة ما إذا كانت اللعبة قد انتهت - عندما يتم تعتيم اللوحة ولا يمكن دمج أي من المربعات * /

gameOver المنطقية العامة () {…}

/ * يُستدعى عند الضغط على "w" أو سهم لأعلى - يستدعي "verticalMove" لكل بلاطة على السبورة مع المعلمة "up" * /

فراغ عام () {…}

/ * يتم الاتصال به عند الضغط على "s" أو السهم لأسفل - يستدعي "verticalMove" لكل بلاطة على اللوحة مع المعلمة "down" * / public void down () {…}

/ * يتم الاستدعاء عند الضغط على "d" أو السهم الأيمن - استدعاء "أفقي الحركة" لكل بلاطة على اللوحة مع المعلمة "right" * / public void right () {…}

/ * يتم الاستدعاء عند الضغط على "a" أو السهم الأيسر - استدعاء "الأفقي" لكل بلاطة على اللوحة مع المعلمة "يسار" * /

ترك فراغ عام () {…}

/ * يقارن قيمتي البلاط معًا وإذا كانت متطابقة أو إذا كانت واحدة تساوي 0 (بلاطة عادية) - تتم إضافة قيمها (بشرط أن تكون المربعات التي نقارنها عبارة عن قطعتين مختلفتين وتتحركان نحو الاتجاه المناسب) - يتحرك بشكل متكرر خلال الصف * /

نقل أفقي فارغ عام (int row ، int col ، string direction) {…}

/ * مقارنة قيمتي البلاط معًا وإذا كانت متطابقة أو إذا كانت واحدة تساوي 0 (بلاطة عادية) - تتم إضافة قيمها (بشرط أن تكون المربعات التي نقارنها عبارة عن قطعتين مختلفتين وتتحركان نحو الاتجاه المناسب) - يتحرك بشكل متكرر خلال العمود * /

نقل عمودي فارغ عام (int row ، int col ، string direction) {…}

نعم ، هذه طرق كثيرة - لكن لا تقلق ، فمعظمها سهل الفهم للغاية. علاوة على ذلك ، فإن فئة "Board" هي الأكثر تعقيدًا ، لذا فإن كل شيء بعد ذلك سيكون بسيطًا نسبيًا.

الخطوة 3: تعرف على البرنامج - Tile

البلاط:

الوصف: يتعامل فئة البلاط مع البلاط الفردي ، وهو الأصغر بين جميع الفئات. كل بلاطة لها قيمة ولون صحيحان. يحتوي على مُنشئين يقومان بإنشاء مربعات ذات قيمة 0 (افتراضي) أو قيمة #. معظم الأساليب تشرح نفسها بنفسها ، حيث تشكل أساليب "getter" و "setter" الجزء الأكبر من الإجمالي.

المنشئون:

/ * يُنشئ تجانبًا أساسيًا بقيمة 0 * /

مربع عام () {…}

/ * يُنشئ بلاطة بقيمة رقم * /

تجانب عام (رقم int) {…}

أساليب:

/ * الحصول على قيمة البلاط * /

public int getValue () {…}

/ * يضبط قيمة البلاط - تُستخدم عند إضافة مربعين معًا * /

setValue العامة الباطلة (قيمة int) {…}

/ * يمثل التجانب كسلسلة - مستخدمة في واجهة المستخدم الرسومية * /

سلسلة toString العامة () {…}

/ * يضبط لون البلاط بناءً على قيمته * /

setColor باطل عام () {…}

/ * الحصول على لون البلاط * /

getColor باطل عام () {…}

الخطوة 4: تعرف على البرنامج - اللعبة

لعبة

الوصف: تضم فئة اللعبة الطريقة الرئيسية ومعظم طرق واجهة المستخدم الرسومية والتفاعلات الرئيسية. يستغرق كلاً من فصول Tile و Board ، ويمكّنهما من العمل معًا.

المنشئون:

لا أحد

أساليب:

/ * إعداد واجهة المستخدم الرسومية بأحجام مناسبة وإضافة مستمع رئيسي * /

setUpGUI العامة باطلة ثابتة () {…}

/ * يتحقق لمعرفة ما إذا كان قد تم الضغط على مفتاحي الوسادة أو مفاتيح الأسهم ويقوم بالإجراءات المناسبة - يقوم بتحديث JFrame مع كل حركة * /

ضغط مفتاح عام باطل (KeyEvent e) {…}

/ * يرسم واجهة المستخدم الرسومية بسلسلة من الأوتار واللوحة والبلاط ويضمن إعادة طلاءها عند انتهاء اللعبة * /

طلاء الفراغ العام (الرسومات ز) {…}

/ * يرسم بلاطة فردية - تسمى من طريقة الطلاء * /

مربعات الرسم الفارغة العامة (رسومات g ، تجانب تجانب ، int x ، int y) {…}

/ * الطريقة الرئيسية - إعداد واجهة المستخدم الرسومية وبدء اللعبة * /

الرئيسي العام الثابت الفارغ (سلسلة وسائط) {…}

الخطوة 5: طرق مهمة - الحركة

تعتبر طرق الحركة هي الأكثر أهمية لفهمها ، ولكن الخبر السار هو أنه بمجرد فهمك للحركات الرأسية ، يمكنك تطبيق هذا الفهم على الحركات الأفقية. في الواقع ، فإن طرق الحركة العمودية الثلاثة هي نفسها تمامًا حركات الطريقة الأفقية الثلاثة ، باستثناء واحدة تتحرك عبر الصفوف والأخرى عبر الأعمدة. لهذا السبب ، دعنا نركز فقط على طرق الحركة العمودية.

نقل عمودي فارغ خاص (int row ، int col ، string direction)

{المربع الأولي = اللوحة [الحدود] [العمود] ؛ مقارنة البلاط = اللوحة [الصف] [العمود] ؛ if (initial.getValue () == 0 || initial.getValue () == Compar.getValue ()) {if (row> border || (direction.equals ("down") && (row <border))) {int addScore = initial.getValue () + Compar.getValue () ؛ إذا (initial.getValue ()! = 0) {الدرجة + = addScore ؛ } initial.setValue (addScore) ؛ قارن.setValue (0) ، }} else {if (direction.equals ("down")) {border--؛ } else {border ++؛ } VerticalMove (صف ، عمود ، اتجاه) ؛ }}

يتم استدعاء الطريقة أعلاه ، VerticalMove ، بواسطة طريقتي "up" و "down". دعنا نلقي نظرة على طريقة "up".

الفراغ العام ()

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

تمر هذه الطريقة عبر اللوحة بأكملها وتستدعي VerticalMove لكل بلاطة مع المعلمة "up". VerticalMove ثم يقارن التجانب الموجود في الموضعين "j" و "i" مع التجانب الموجود في الموضعين "الحدود" و "i". إذا كان الاثنان متساويين ، يتم الجمع بينهما. إذا لم تكن كذلك ، فسيتم زيادة تجانب الحدود بمقدار 1 (حيث تكون المعلمة في المكان "up") ، ويتم استدعاء VerticalMove مرة أخرى.

موصى به: