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

لعبة كانسة الألغام-Raspberry-Pi-Edition: 7 خطوات (بالصور)
لعبة كانسة الألغام-Raspberry-Pi-Edition: 7 خطوات (بالصور)

فيديو: لعبة كانسة الألغام-Raspberry-Pi-Edition: 7 خطوات (بالصور)

فيديو: لعبة كانسة الألغام-Raspberry-Pi-Edition: 7 خطوات (بالصور)
فيديو: 50 Путеводитель в Буэнос-Айресе Путеводитель 2024, يونيو
Anonim
كاسحة ألغام-توت العليق- إصدار بي
كاسحة ألغام-توت العليق- إصدار بي
كاسحة ألغام-توت العليق- إصدار بي
كاسحة ألغام-توت العليق- إصدار بي

مشروعي الأخير لسلسلة CSC 130 في جامعة لويزيانا للتكنولوجيا هو كانسة الألغام Raspberry Pi Edition. في هذا المشروع ، سعيت إلى إعادة إنشاء لعبة كاسحة ألغام الكلاسيكية من خلال استخدام مكتبة Tkinter للغة برمجة Python. الشبكة التي تشملها لعبة كاسحة الألغام هي ثمانية بلاطات في العرض وخمسة بلاطات في الارتفاع. كان تنسيق المشروع مناسبًا ومتقنًا لاستخدام Raspberry Pi المثبت مع Python 2.7.

يمكن تنزيل الكود والصور الخاصة بالمشروع النهائي لـ Minesweeper Raspberry Pi Edition من الرابط التالي:

كاسحة ألغام-توت العليق- إصدار بي

اللوازم

x1 Raspberry Pi

Python 2.7 مثبت على Raspberry Pi

Microsoft Powerpoint (أو برنامج آخر لإنشاء صور للأزرار)

الخطوة 1: إنشاء صور الأزرار

إنشاء صور زر
إنشاء صور زر

تفسير:

يجب إنشاء كل زر يتكون من واجهة المستخدم الرسومية. لهذه المهمة ، استخدمت Microsoft Powerpoint لعمل الصور التي أحتاجها لعرضها على الأزرار.

أولاً ، قمت بإنشاء أزرار المربعات العشرة اللازمة لإنشاء شبكة كاسحة ألغام (فارغة ، وبوب ، وصفر ، وواحد ، واثنان ، وثلاثة ، وأربعة ، وخمسة ، وستة ، وسبعة ، وثمانية) باستخدام Microsoft Powerpoint.

ثانيًا ، قمت بعمل أربع صور مطلوبة لشاشة القائمة (عرض القائمة ، زر الصعوبة السهل ، زر الصعوبة المتوسطة ، زر الصعوبة الصعبة) باستخدام Microsoft Powerpoint.

ثالثًا ، قمت بإنشاء الصورة المطلوبة لزر إعادة التشغيل والصور المطلوبة لأزرار العرض المختلفة الأخرى (عرض "تجاوز اللعبة" ، وشاشة "تفوز" ، وعرض "القواعد") باستخدام Microsoft Powerpoint.

رابعًا ، سيتعين عليك تغيير حجم صورك لتلائم شاشتك. بالنسبة إلى Rasberry Pi الخاص بي ، استخدمت الأبعاد التالية للنافذة (بالإشارة إلى وحدات البكسل في الطول والعرض): 432 × 576.

الخطوة 2: تنسيق البرنامج

برنامج التنسيق
برنامج التنسيق

تفسير:

قبل أن تتم أي برمجة فعلية ، يجب علينا استيراد المكتبات التي نحتاجها وكتابة الجزء الرئيسي من برنامجنا.

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

الخطوة 3: إنشاء واجهة المستخدم الرسومية (قائمة وشبكة كاسحة الألغام)

إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)
إنشاء واجهة المستخدم الرسومية (القائمة وشبكة كاسحة الألغام)

تفسير:

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

أولاً ، يمكننا جعل شاشة القائمة تعرض نفسها عند بدء تشغيل البرنامج عن طريق استدعاء طريقة "setupMenu" داخل مُنشئ فئة MainGUI.

ثانيًا ، يمكننا جعل كل زر من أزرار صعوبة القائمة ينفذ سطورًا معينة من التعليمات البرمجية عند النقر فوقها عن طريق إضافة طريقة "عملية" (سيتعين علينا أيضًا إضافة الأمر lambda: self.process ("returnButtonName") داخل معلمات وظيفة الزر المستخدمة في إنشاء كل زر صعوبة). سيتم إنشاء ثلاث عبارات if-else في طريقة "العملية" وتنفيذ طرق وأسطر أخرى معينة من التعليمات البرمجية الإضافية اعتمادًا على ما يساوي الزر (الزر يساوي أيًا كان اسم الزر الذي تم تسجيله مؤخرًا).

ثالثًا ، أثناء تشغيل شاشة القائمة وإذا نقر المستخدم على أحد أزرار الصعوبة ، فسيقوم البرنامج بحفظ قيمة معينة لمتغير "الصعوبة" (الصعوبة تساوي "سهل" أو "متوسط" أو "صعب" إيقاف أي زر صعوبة تم النقر عليه). هذه النقرة على الزر تعرف أي عبارة "if-else" التي يجب اتباعها استنادًا إلى اسم الزر الذي تم تسجيله مؤخرًا (ما هو الزر الذي يساوي). بالإضافة إلى ذلك ، لإعادة تعيين متغير "الصعوبة" ، سنحتاج أولاً إلى إنشاء خارج الفصل. لذلك سنقوم بتعيين متغير "الصعوبة" كسلسلة نصية فارغة قبل إنشاء فئة "MainGUI".

رابعًا ، امسح واجهة المستخدم الرسومية للأزرار التي تم إجراؤها بواسطة طريقة "setupMenu" عن طريق إنشاء طريقة "clearMenu" (باستخدام وظيفة button.destroy () في حالات متعددة) واستدعاء طريقة "clearMenu" في طريقة "العملية" (تحت يسجل كل زر صعوبة بعد تعيين متغير الصعوبة).

خامسًا ، قم بتحديث واجهة المستخدم الرسومية عن طريق إنشاء طريقة "setSLASHresetGUI" (يتم عمل الأزرار بنفس الطريقة كما في طريقة "setupMenu") واستدعاء طريقة "setSLASHresetGUI" في طريقة "العملية" (تحت كل زر صعوبة يسجل بعد صعوبة تحديد المتغير واستدعاء طريقة "clearMenu").

بالإضافة إلى ذلك ، قبل تعيين جميع الأزرار ضمن طريقة "setSLASHresetGUI" ، يجب علينا تكوين الصفوف والأعمدة داخل الشبكة وبعد تعيين جميع الأزرار ضمن طريقة "setSLASHresetGUI" ، يجب علينا حزم جميع المحتويات داخل الشبكة (انظر إلى الكود الوارد في التعليمات لمعرفة التنسيق المناسب).

الخطوة 4: اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل

اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل
اجعل الأزرار الموجودة على الشاشة داخل اللعبة جاهزة للعمل

تفسير:

لجعل الأزرار تنفذ سطورًا معينة من التعليمات البرمجية عند النقر عليها ، سيتعين علينا تنفيذ طرق ضمن طريقة "العملية". لهذه المهمة ، سيتعين علينا إنشاء عدة طرق ومتغيرات وقوائم جديدة.

أولاً ، سنقوم بعمل قائمتين. ستكون هناك قائمة تسمى "الشبكة". ستتألف قائمة "الشبكة" هذه من الأعداد الصحيحة 9 و 0 فقط. في هذه القائمة ، ستمثل تسعة القنابل ، وستمثل الأصفار غير القنابل. هذه هي الطريقة التي سيميز بها البرنامج ما إذا كان البلاط عبارة عن قنبلة أم لا. سيتم عمل قائمة ثانية ، وسوف يطلق عليها "الحالة". تتكون قائمة "الحالة" هذه من سلاسل أحرف واحدة فقط ("0" ، "1" ، "2" ، "3" ، "4" ، "5" ، "6" ، "7" ، "8" ، "ب "). في هذه القائمة ، ستتوافق كل سلسلة أحرف مع صورة معينة. هذه هي الطريقة التي سيعرف بها البرنامج الصورة التي سيتم عرضها على كل زر في شبكة كاسحة الألغام. سيكون لكل زر في شبكة كاسحة الألغام فهرس مقابل في كل قائمة بناءً على موضعه في الشبكة. سيتم تعيين الفهرس المقابل من خلال الإجراء التالي (رقم الزر - 1). على سبيل المثال ، الفهرس المقابل للزر في كل قائمة هو الفهرس صفر. أخيرًا ، سيتم تنفيذ هاتين القائمتين قبل تنفيذ فئة "MainGUI" وسيتم إنشاؤها خارج فئة "MainGUI". سيتم إنشاء فئة "الشبكة" كقائمة فارغة (الشبكة = ) وسيتم إنشاء قائمة "الحالة" بواسطة دالة النطاق (إضافة أربعين حرفًا مفردًا من "n" إلى قائمة "الحالة").

ثانيًا ، سنقوم بعمل طرق مختلفة يمكنها اكتشاف عدد الألغام المحيطة بها ويمكن استدعاؤها عند النقر فوق الزر (يتم تحديد قرار الطريقة التي يجب تنفيذها من خلال وضع الزر). سيطلق على هذه الأساليب بالذات محللي الألغام لدينا. ستعمل هذه الطرق على زيادة عداد يسمى "NumOfMines" وستستخدم فهارس معينة ضمن قائمة "الشبكة" لتحديد عدد القنابل التي تحيط بالبلاط. سيتم استخدام السلسلة التي سيتم تخزينها داخل المتغير "NumOfMines" لاستبدال نفس الفهرس المقابل في قائمة "الحالة". الآن ، قد تتساءل كيف سيعرف البرنامج الفهرس الذي يجب استخدامه. عندما يتم تسجيل زر في طريقة "العملية" ، فسيتم إنشاء / إعادة تعيين "فهرس" متغير إلى عدد صحيح معين (بناءً على السلسلة التي يسجلها الزر). ستستخدم إحدى الطرق التي تم إنشاؤها هذا الفهرس المخصص لمعرفة موضع البلاط وفهارس المربعات المحيطة به (ستحدد الخوارزمية داخل الطريقة ذلك). بالإضافة إلى ذلك ، لإعادة تعيين متغير "index" ، سنحتاج أولاً إلى إنشاء مثيل له خارج الفصل الدراسي. لذلك سنقوم مسبقًا بتعيين متغير "index" على أنه العدد الصحيح صفر قبل إنشاء فئة "MainGUI".

ثالثًا ، سيتم إنشاء طرق "التشغيل". سيتم تنفيذ طريقة "العملية" في كل مرة يتم فيها تسجيل الزر. سيتم تنفيذ طرق "العملية" هذه في طريقة "العملية". في طريقة "العملية" ، ستحدد عبارات if-else المتعددة الزر الذي تم النقر عليه (بناءً على ما يعادله الزر). هذا هو المكان الذي سيتم فيه استدعاء طريقة "عملية" معينة (في عبارات if-else).

رابعًا ، سنتطرق بالفعل إلى كيفية تشغيل الأزرار. كما ذكرنا سابقًا ، توجد العديد من عبارات if-else في طريقة "العملية" وتقوم بتنفيذ طرق وأسطر معينة أخرى من التعليمات البرمجية الإضافية اعتمادًا على ما يساوي الزر (الزر يساوي أيًا كانت السلسلة التي تم تسجيلها مؤخرًا). ضمن عبارات if-else هذه ، سيحدث ما يلي بالترتيب: سيتم تعيين الفهرس عالميًا ، وسيتم إعادة تعيين هذا الفهرس المقابل في قائمة "الحالة" إلى السلسلة "b" (إذا كان الفهرس المقابل لقائمة "الشبكة" يساوي العدد الصحيح تسعة) ، سيتم تنفيذ طريقة "عملية" مقابلة (إذا كان الفهرس المقابل لقائمة "الشبكة" يساوي العدد الصحيح صفر) ، فسيتم إعادة تعيين هذا الفهرس المقابل في قائمة "الحالة" إلى سلسلة تساوي المتغير "NumOfMines" (إذا كان الفهرس المقابل لقائمة "الشبكة" يساوي العدد الصحيح صفر) ، وسيتم تحديث واجهة المستخدم الرسومية عن طريق استدعاء طريقة "setSLASHresetGUI".

الخطوة 5: طريقة "setDifficulty" الطريقة و "إعادة التشغيل"

صورة
صورة
صورة
صورة

تفسير:

بعد ذلك ، يجب إنشاء طريقة "setDifficulty" وسيحتاج زر إعادة التشغيل الموجود في الجزء السفلي من شاشة اللعبة إلى العمل (عن طريق إنشاء طريقة "إعادة التشغيل" ليتم تنفيذها عند نقر المستخدم عليها).

أولاً ، يجب تنفيذ طريقة "setDifficulty" في عبارات if-else لأزرار الصعوبة في طريقة "العملية" وفي طريقة "إعادة التشغيل". سطور الكود والطرق المنفذة بهذه الطريقة بسيطة للغاية. في طريقة "setDifficulty" ، سنلحق كمية معينة من الأصفار (غير القنابل) والتسعات (القنابل) بقائمة "الشبكة" (عبر وظيفتي نطاق داخل كل عبارة if-else) ، ثم نخلط قائمة "الشبكة" (مع وظيفة الخلط للمكتبة العشوائية) ضمن طريقة "setDifficulty" (بعد تنفيذ عبارات if-else). سيتم تحديد نسبة الأصفار إلى تسعة حسب السلسلة التي تم تعيين "صعوبة" المتغير عليها ("سهل": 34-6 ، "متوسط": 28-12 ، "صعب": 16-24).

ثانيًا ، في طريقة "إعادة التشغيل" ، سنقوم بتعيين المتغيرات "index" و "NumOfMinesLEFT" على صفر عالميًا ، وإفراغ كل من قائمتي "الحالة" و "الشبكة" بشكل عام ، وإعادة تعيين قائمة "الحالة" باستخدام وظيفة النطاق (إضافة أربعين حرفًا مفردًا من "n" إلى قائمة "الحالة") ، واستدعاء طريقة "setDifficulty".

الخطوة السادسة: سيناريوهات نهاية اللعبة

سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة
سيناريوهات نهاية اللعبة

تفسير:

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

أولاً ، عندما ينقر المستخدم على آخر بلاطة مخفية غير قنبلة ، فيجب تنفيذ طريقة "You_A_Winner_Son". سنكمل هذه المهمة عن طريق استدعاء طريقة "You_A_Winner_Son" في كل مرة يتم فيها النقر فوق أحد المربعات ووجد أن المربع عبارة عن بلاطة غير قابلة للقنابل (ضمن طرق "العملية" المنفذة في طريقة "العملية"). إذا تم استيفاء الشروط الفائزة ، فسيتم تنفيذ عبارتين if-else ضمن طريقة "You_A_Winner_Son". سيتم تنفيذ عبارة if-else الأولى دائمًا بغض النظر عما إذا كان اللاعب قد فاز أم لا عند استدعاء هذه الطريقة. بناءً على ما يساوي المتغير "صعوبة" ، خوارزمية معينة ستحدد عدد الألغام / القنابل المتبقية مخفية. سيتم حفظ العدد الصحيح الذي تم العثور عليه بواسطة هذه الخوارزمية في المتغير "NumOfMinesLEFT". بعد ذلك ، بين عبارتين if-else ، سيتم تنفيذ خوارزمية أخرى للعثور على عدد مربعات البداية المتبقية (البلاط غير المضغوط). سيتم حفظ العدد الصحيح الذي تم العثور عليه بواسطة هذه الخوارزمية في المتغير "NumOfStartingTilesLEFT". سيتم تنفيذ عبارة if-else الثانية دائمًا بغض النظر عما إذا كان اللاعب قد فاز أم لا عند استدعاء هذه الطريقة. بناءً على ما يساوي متغير "الصعوبة" ، يمكن تنفيذ إحدى عبارات if-else إذا تم استيفاء شروطها. سوف تستند الشروط إلى ما يساوي المتغيرين "NumOfMinesLEFT" و "NumOfStartingTilesLEFT". ضمن عبارات if-else الثلاثة ، سيتم تنفيذ خوارزمية تجعل كل زر عديم الفائدة (انتهت اللعبة).

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

ثالثًا ، سيتم تحديث شاشة العرض داخل اللعبة في كل مرة يتم فيها تحديث واجهة المستخدم الرسومية عن طريق إجراء عدد قليل جدًا من التعديلات الطفيفة على طريقة "setSLASHresetGUI". بعد تكوين شبكة واجهة المستخدم الرسومية ، سنضع ثلاث عبارات if-else حيث يتم وضع تعيين زر العرض الحالي. سيتم تنفيذ إحدى عبارات if-else الثلاثة بناءً على المتغيرات التالية: "GameOverDETECTOR" و "الصعوبة" و "NumOfMinesLEFT" و "NumOfStartingTilesLEFT". كما قد تتساءل ، فإن المتغير "GameOverDETECTOR" هو جديد متغير. سيتم إنشاء هذا المتغير مباشرة قبل تنفيذ عبارات if-else ضمن طريقة "setSLASHresetGUI". سيكون متغير "GameOverDETECTOR" مساويًا للعدد الصحيح الذي تم العثور عليه باستخدام خوارزمية تعثر على عدد الفهارس داخل "الشبكة" تم إعادة تخصيص القائمة إلى العدد الصحيح تسعة وتسعين (كيف تصبح الأزرار عديمة الفائدة). بناءً على شروط عبارة if-else ، ستحدث إعادة تعيين مقابلة للعرض.

الخطوة 7: تشغيل زر إعادة التشغيل

تشغيل زر إعادة التشغيل
تشغيل زر إعادة التشغيل

تفسير:

هذه الخطوة هي الأقصر. تم بالفعل إنجاز معظم العمل لهذه الخطوة. كل ما نحتاج إلى القيام به الآن هو تنفيذ طريقة "إعادة التشغيل" في كل مرة ينقر فيها المستخدم على زر إعادة التشغيل.

أولاً وأخيرًا ، سننفذ طريقة "إعادة التشغيل" في طريقة "العملية" بعبارة if-else. إذا كانت السلسلة "!" تم تسجيله ، ثم يتم تنفيذ طريقة "إعادة التشغيل". سيتعين علينا أيضًا إنشاء زر يسمى إعادة التشغيل في نهاية طريقة "setSLASHresetGUI" قبل تجميع محتويات الشبكة معًا. سيعالج زر إعادة التشغيل هذا السلسلة "!" (الأمر lambda: self.process ("!")) وتنفيذ طريقة "إعادة التشغيل" المقابلة ضمن طريقة "العملية".

موصى به: