فهرست مطالب:

Minesweeper-Raspberry-Pi-Edition: 7 مرحله (همراه با تصاویر)
Minesweeper-Raspberry-Pi-Edition: 7 مرحله (همراه با تصاویر)

تصویری: Minesweeper-Raspberry-Pi-Edition: 7 مرحله (همراه با تصاویر)

تصویری: Minesweeper-Raspberry-Pi-Edition: 7 مرحله (همراه با تصاویر)
تصویری: Practical Bug Bounty Hunting for Hackers and Pentesters - Course Overview 2024, جولای
Anonim
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition
Minesweeper-Raspberry-Pi-Edition

آخرین پروژه من برای مجموعه CSC 130 در دانشگاه فناوری لوئیزیانا ، Minesweeper Raspberry Pi Edition است. در این پروژه ، من سعی کردم بازی کلاسیک مین روب را با استفاده از کتابخانه Tkinter زبان برنامه نویسی پایتون بازسازی کنم. شبکه ای که بازی مین روب شامل آن است ، هشت کاشی در عرض و پنج کاشی در ارتفاع دارد. قالب بندی پروژه مناسب برای استفاده از Raspberry Pi نصب شده با Python 2.7 است.

کد و تصاویر پروژه نهایی Minesweeper Raspberry Pi Edition را می توانید در لینک زیر بارگیری کنید:

Minesweeper-Raspberry-Pi-Edition

تدارکات

x1 تمشک پای

پایتون 2.7 بر روی رزبری پای نصب شده است

Microsoft Powerpoint (یا نرم افزار دیگری برای ایجاد تصاویر برای دکمه ها)

مرحله 1: ایجاد تصاویر دکمه ای

ایجاد تصاویر دکمه ای
ایجاد تصاویر دکمه ای

توضیح:

هر دکمه ای که GUI را تشکیل می دهد باید ایجاد شود. برای انجام این کار ، از پاورپوینت مایکروسافت برای ایجاد تصاویر مورد نیاز برای نمایش روی دکمه ها استفاده کردم.

ابتدا ، ده دکمه کاشی مورد نیاز برای ساخت شبکه مین روب (خالی ، bob ، صفر ، یک ، دو ، سه ، چهار ، پنج ، شش ، هفت و هشت) را با استفاده از Microsoft Powerpoint ایجاد کردم.

دوم ، من چهار تصویر مورد نیاز برای صفحه منو (نمایش منو ، دکمه سختی آسان ، دکمه سختی متوسط و دکمه سختی سخت) را با استفاده از Microsoft Powerpoint تهیه کردم.

سوم ، تصویر مورد نیاز برای دکمه راه اندازی مجدد و تصاویر مورد نیاز برای سایر دکمه های نمایش مختلف (نمایش "بازی روی صفحه" ، نمایش "شما برنده می شوید" و نمایش "قوانین") را با استفاده از Microsoft Powerpoint ایجاد کردم.

چهارم ، شما باید اندازه تصاویر خود را تغییر دهید تا در صفحه نمایش شما قرار گیرند. برای رزبری پای من از ابعاد زیر برای پنجره (اشاره به پیکسل ها در طول و عرض) استفاده کردم: 432x576.

مرحله 2: قالب بندی برنامه

برنامه قالب بندی
برنامه قالب بندی

توضیح:

قبل از شروع برنامه نویسی واقعی ، ما باید کتابخانه های مورد نیاز خود را وارد کرده و قسمت اصلی برنامه خود را بنویسیم.

ابتدا ، ما باید * کتابخانه Tkinter را وارد کرده و از کتابخانه تصادفی بر هم بزنیم. در مرحله دوم ، ما باید مراحل زیر را در قسمت اصلی برنامه در کد کامل کنیم: ایجاد پنجره ، تنظیم پنجره عنوان ، ایجاد GUI و نمایش GUI و منتظر تعامل کاربر. این کد با توجه به کتابخانه Tkinter با قالب بندی مناسب نوشته شده است (برای مشاهده قالب بندی مناسب به کد داده شده در دستورالعمل نگاه کنید).

مرحله 3: ایجاد GUI (منو و شبکه مین روب)

ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)
ایجاد GUI (منو و شبکه مین روب)

توضیح:

پس از راه اندازی برنامه ، صفحه منو راه اندازی می شود. پس از انتخاب مشکل (با کلیک روی یکی از دکمه های مشکل در صفحه منو) ، GUI باید با شبکه مین روب ، صفحه نمایش و دکمه راه اندازی مجدد تازه شود. از آنجا که شما در حال کار روی GUI هستید ، ما فقط باید منو را راه اندازی کنیم ، دکمه های مشکل منو فعال شوند و GUI با شبکه مین روب به صفحه بازی بازخوانی شود.

اول ، ما می توانیم با راه اندازی برنامه با فراخوانی متد "setupMenu" در سازنده کلاس MainGUI ، صفحه منو را نمایش دهیم.

ثانیاً ، ما می توانیم هر یک از دکمه های دشواری منو را در هر زمان که با افزودن یک متد "process" کلیک شود ، اجرا کند (همچنین باید دستور lambda: self.process ("returnButtonName") را در پارامترهای عملکرد دکمه مورد استفاده اضافه کند. در ایجاد هر دکمه دشواری). سه دستور if-else در روش "process" ایجاد می شود و برخی دیگر از روش ها و خطوط کد اضافی را بسته به مقدار دکمه برابر می کند (دکمه برابر با نام دکمه ای است که آخرین بار ثبت شده است).

سوم ، در حالی که صفحه منو بالا است و اگر کاربر روی یکی از دکمه های مشکل کلیک کند ، برنامه مقدار خاصی را در متغیر "دشواری" ذخیره می کند (سختی برابر با "آسان" ، "متوسط" یا "سخت" است) روی کدام دکمه دشواری کلیک می شود). این کلیک یک دکمه می داند که بر اساس نام دکمه ای که آخرین بار ثبت شده است کدام دستور if-else را دنبال کنید (چه دکمه ای برابر است). علاوه بر این ، برای تعیین مجدد متغیر "دشواری" ابتدا باید به صورت لحظه ای بنابراین قبل از ایجاد کلاس "MainGUI" ، متغیر "دشواری" را به عنوان یک رشته خالی قرار می دهیم.

چهارم ، GUI دکمه های ساخته شده توسط روش "setupMenu" را با ایجاد روش "clearMenu" (با استفاده از عملکرد button.destroy () در موارد متعدد) و فراخوانی روش "clearMenu" در روش "process" (زیر هر یک از دکمه های دشواری پس از تعیین متغیر دشواری ثبت می شود).

پنجم ، GUI را با ایجاد یک روش "setSLASHresetGUI" (دکمه ها همانند روش "setupMenu" ساخته می شوند) و فراخوانی روش "setSLASHresetGUI" در روش "process" (در زیر هر یک از دکمه های دشواری پس از تخصیص متغیر مشکل و فراخوانی روش "clearMenu").

علاوه بر این ، قبل از اختصاص همه دکمه ها در روش "setSLASHresetGUI" ، ما باید سطرها و ستون ها را در شبکه پیکربندی کنیم و پس از اختصاص همه دکمه ها در روش "setSLASHresetGUI" ، باید همه محتویات داخل شبکه را بسته بندی کنیم (نگاه کنید به کد داده شده در دستورالعمل برای مشاهده قالب بندی مناسب).

مرحله 4: دکمه های موجود در صفحه بازی را عملیاتی کنید

دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید
دکمه های موجود در صفحه بازی را عملیاتی کنید

توضیح:

برای اینکه دکمه ها خطوط خاصی از کد را هنگام کلیک اجرا کنند ، باید متدهایی را در متد "process" اجرا کنیم. برای این کار ، ما باید چندین روش ، متغیر و لیست جدید ایجاد کنیم.

ابتدا دو لیست تهیه می کنیم. لیستی به نام "grid" وجود خواهد داشت. این لیست "شبکه" فقط شامل اعداد صحیح 9 و 0 خواهد بود. در این لیست ، نه مورد نشان دهنده بمب ها و صفرها نشان دهنده غیر بمب ها هستند. به این ترتیب برنامه تشخیص می دهد که کاشی بمب است یا نه. لیست دوم ساخته می شود و "وضعیت" نامیده می شود. این لیست "وضعیت" تنها شامل یک رشته نویسه ("0" ، "1" ، "2" ، "3" ، "4" ، "5" ، "6" ، "7" ، "8" ، "b ") در این لیست ، هر رشته کاراکتر به یک تصویر خاص مربوط می شود. اینگونه است که برنامه می داند روی هر دکمه در شبکه مین جمع کن چه تصویری نمایش دهد. هر دکمه در شبکه مین روب بر اساس محل قرارگیری آن در شبکه ، یک فهرست مربوطه در هر لیست خواهد داشت. فهرست مربوطه با روش زیر (شماره دکمه - 1) تعیین می شود. به عنوان مثال ، شاخص مربوط به دکمه یکی در هر فهرست شاخص صفر است. در نهایت ، این دو لیست قبل از اجرای کلاس "MainGUI" اجرا می شوند و خارج از کلاس "MainGUI" ایجاد می شوند. کلاس "grid" به صورت یک لیست خالی (grid = ) و لیست "status" توسط یک تابع دامنه (اضافه کردن چهل رشته تک نویسه "n" به لیست "status") ایجاد می شود.

دوم ، ما روشهای مختلفی را ایجاد می کنیم که می تواند تعداد معادن اطراف آن را تشخیص دهد و با کلیک روی دکمه می توان آنها را فراخوانی کرد (تصمیم گیری در مورد اینکه کدام روش باید با قرار دادن دکمه تعیین شود). این روشها را تجزیه و تحلیل معدن ما می نامند. این روش ها شمارنده ای به نام "NumOfMines" را افزایش می دهد و از شاخص های خاصی در لیست "grid" برای تعیین تعداد بمب های اطراف کاشی استفاده می کند. رشته ای که در متغیر "NumOfMines" ذخیره می شود ، برای جایگزینی همان شاخص مربوطه در لیست "status" استفاده می شود. اکنون ممکن است تعجب کنید که چگونه برنامه می داند از کدام شاخص استفاده کند. هنگامی که یک دکمه در روش "process" ثبت می شود ، یک متغیر "index" ایجاد می شود/به یک عدد صحیح خاص واگذار می شود (بر اساس رشته ای که دکمه ثبت می کند). یکی از روشهای ایجاد شده از شاخص اختصاص داده شده به منظور آگاهی از محل کاشی و نمای کاشی های اطراف آن استفاده می کند (الگوریتم درون روش این را مشخص می کند). علاوه بر این ، برای تعیین مجدد متغیر "index" ، ابتدا باید آن را خارج از کلاس مثال بزنیم. بنابراین قبل از ایجاد کلاس "MainGUI" متغیر "index" را به عنوان صفر صحیح از پیش تعیین شده قرار می دهیم.

سوم ، روش های "عملیات" ایجاد می شود. هر بار که یک دکمه ثبت می شود ، یک روش "عملیات" اجرا می شود. این روش های "عملیات" در روش "روند" اجرا می شوند. در روش "process" ، چندین دستور if-else تعیین می کند که روی کدام دکمه کلیک شده است (بر اساس اینکه دکمه برابر است). اینجاست که از روش "عملیات" خاصی (در دستور if-else) استفاده می شود.

چهارم ، ما در واقع نحوه عملکرد دکمه ها را بررسی می کنیم. همانطور که قبلاً نیز گفته شد ، چندین دستور if-else در روش "process" قرار دارند و برخی از روش ها و خطوط کد اضافی دیگر را بسته به اینکه دکمه برابر است اجرا می کنند (دکمه برابر است با رشته ای که آخرین بار ثبت شده بود). در این دستورات if-else ، موارد زیر به ترتیب رخ می دهد: فهرست به طور جهانی اختصاص داده می شود ، که شاخص مربوطه در لیست "status" به رشته "b" واگذار می شود (اگر شاخص مربوط به لیست "grid" برابر باشد عدد صحیح نه) ، یک روش "عملیات" متناظر اجرا می شود (اگر شاخص مربوط به لیست "grid" برابر با صفر صحیح باشد) ، این شاخص مربوطه در لیست "status" به رشته ای معادل متغیر واگذار می شود "NumOfMines" (اگر شاخص مربوط به لیست "grid" برابر با صفر صحیح باشد) ، و GUI با فراخوانی روش "setSLASHresetGUI" تجدید می شود.

مرحله 5: روش "setDifficulty" و روش "restart"

تصویر
تصویر
تصویر
تصویر

توضیح:

در مرحله بعد ، یک روش "setDifficulty" باید ایجاد شود و دکمه راه اندازی مجدد که در پایین صفحه بازی قرار دارد ، باید عملیاتی شود (با ایجاد یک روش "راه اندازی مجدد" برای اجرا هنگامی که توسط کاربر کلیک می شود)

ابتدا ، روش "setDifficulty" باید در دستور if-else دکمه های مشکل در روش "process" و در روش "restart" پیاده سازی شود. خطوط کد و روشهای اجرا شده در این روش بسیار ساده است. در روش "setDifficulty" ، ما مقدار معینی صفر (غیر بمب) و نه (بمب) را به لیست "grid" (از طریق دو تابع محدوده در هر دستور if-else) اضافه می کنیم ، و سپس آن را به هم می زنیم لیست "grid" (با عملکرد مختلط کتابخانه تصادفی) در روش "setDifficulty" (پس از اجرای دستور if-else). نسبت صفر به نه بر اساس رشته ای که متغیر "دشواری" روی آن تنظیم شده است تعیین می شود ("آسان": 34-6 ، "متوسط": 28-12 ، "سخت": 16-24).

دوم ، در روش "راه اندازی مجدد" ، ما متغیرهای "index" و "NumOfMinesLEFT" را در سطح جهانی صفر می کنیم ، لیست "status" و "grid" را در سطح جهانی خالی می کنیم ، لیست "status" را با یک تابع محدوده (اضافه کردن چهل رشته تک کاراکتر "n" به لیست "status") ، و روش "setDifficulty" را فراخوانی کنید.

مرحله 6: سناریوهای پایان بازی

سناریوهای پایان بازی
سناریوهای پایان بازی
سناریوهای پایان بازی
سناریوهای پایان بازی
سناریوهای پایان بازی
سناریوهای پایان بازی
سناریوهای پایان بازی
سناریوهای پایان بازی

توضیح:

هر بازی مین روب دارای دو سناریوی پایان بازی است: برد و باخت. در این برنامه ، ما این دو سناریوی پایان بازی را با دو روش جدید پیاده سازی می کنیم: روش "You_A_Winner_Son" و روش "GameOver". قبل از اینکه GUI در روش "فرآیند" تجدید شود و بر اساس شاخص هایی که توسط دو روش سناریوی پایان بازی تغییر کرده اند ، دکمه نمایش تغییر می کند تا نتیجه را به درستی نشان دهد.

ابتدا ، وقتی کاربر روی آخرین کاشی مخفی بدون بمب کلیک می کند ، سپس روش "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" استفاده می شود ، الگوریتمی اجرا می شود که باعث می شود هر کاشی شروع شده بی فایده باشد (بازی تمام شده است) و کاشی های بمب پنهان آشکار می شوند (بر اساس نمایه های مربوطه در فهرست "grid" ، شاخص های خاص در لیست "status" به رشته تک کاراکتر "b" واگذار می شود).

سوم ، نمایش صفحه نمایش درون بازی هر بار که GUI با چند ویرایش جزئی در روش "setSLASHresetGUI" به روز می شود ، به روز می شود. پس از پیکربندی شبکه GUI ، ما سه دستور if-else را در محل اختصاص دکمه نمایش فعلی قرار می دهیم. یکی از سه عبارت if-else بر اساس متغیرهای زیر برابر است: متغیر. این متغیر درست قبل از اجرای دستور if-else در روش "setSLASHresetGUI" ایجاد می شود. متغیر "GameOverDETECTOR" برابر با عدد صحیحی است که با استفاده از الگوریتمی یافت می شود که تعداد ایندکس ها را در "grid" پیدا می کند. لیست به عدد صحیح نود و نه واگذار شده است (چگونه دکمه ها بی فایده می شوند). بر اساس آن شرایط if-else برآورده می شود ، تغییر مجدد مربوط به صفحه نمایش اتفاق می افتد.

مرحله 7: عملکرد دکمه راه اندازی مجدد

عملکرد دکمه راه اندازی مجدد
عملکرد دکمه راه اندازی مجدد

توضیح:

این مرحله به نظر می رسد کوتاه ترین است. بیشتر کارهای این مرحله قبلاً انجام شده است. تنها کاری که باید انجام دهیم این است که هر بار که کاربر روی دکمه راه اندازی مجدد کلیک می کند ، روش "restart" را اجرا کند.

ابتدا و در آخر ، ما روش "restart" را در روش "process" با یک دستور if-else اجرا می کنیم. اگر رشته "!" ثبت شده است ، سپس روش "راه اندازی مجدد" اجرا می شود. ما همچنین باید قبل از بسته شدن محتویات شبکه با هم ، دکمه ای به نام راه اندازی مجدد در پایان روش "setSLASHresetGUI" ایجاد کنیم. این دکمه راه اندازی مجدد رشته "!" (دستور lambda: self.process ("!")) و متد مربوط به "restart" را در روش "process" اجرا کنید.

توصیه شده: