جدول المحتويات:
فيديو: قم ببرمجة لعبة 2048 الخاصة بك مع جافا!: 8 خطوات
2025 مؤلف: John Day | [email protected]. آخر تعديل: 2025-01-13 06:56
بواسطة PranP1My (غير مكتمل) Site
أحب لعبة 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 مرة أخرى.