یکی از پروژههای جذاب و چالشی برای تقویت مهارت کدنویسی برنامهنویسان، ساخت بازی منچ با پایتون است. همینطور که این بازی را با دوستانمان انجام میدهیم میتوانیم برنامه مناسبی برای آن با کمک زبان پایتون توسعه دهیم و در کامپیوتر هم بازی کرد. در این مطلب بازی ludo را توضیح دادهایم. این بازی شباهت بسیار زیادی به منچ دارد با این تفاوت که کمی سختتر است و نکات پیچیدهتری را شامل میشود. از آن جهت بازی ludo را پیادهسازی کردهایم تا با نکات برنامه نویسی بیشتری آشنا شویم. این بازی به شکل چندنفره انجام میشود. هر بازیکن مهره خود را بر اساس شماره نشان داده شده توسط تاس حرکت میدهد.
در این مطلب از مجله فرادرس، بازی منچ را با استفاده از زبان برنامه نویسی پایتون پیادهسازی کردهایم. ابتدا پیشنیازهای انجام این پروژه را معرفی کرده و سپس مراحل توسعه آن را به بخشهای کوچکتری تقسیم کردیم. در نهایت هم کدهای بازی خود را بر اساس مراحل نمایش داده شده نوشتیم.
ساخت بازی منچ با پایتون چگونه است؟
ساخت بازی منچ در پایتون، پروژهای است که باید بر اساس رابط کاربری گرافیکی کار کند. بنابراین، برای حل این پروژه تصمیم به استفاده از ماژولهای Tkinter و PIL گرفتیم. هدف از اجرای این پروژه، ساختن بازی منچ به شکلی است که کیفیت انجام آن با کامپیوتر به اندازه انجام آن با دوستان سرگرم کننده باشد. همیشه تعداد بازیکنهای این بازی از ۲ تا ۴ نفر است. وقتی که بازی را شروع کنیم، پنجرهای در صفحه نمایش داده میشود که درباره تعداد بازیکنها و اینکه بازیکنها کامپیوتری هستند یا انسانی سوال میپرسد. ۵ ثانیه بعد از پاسخ به این سوالات، بازی شروع خواهد شد.
در هربار بازی بین ۲ تا ۴ بازیکن، بازی میکنند. هر بازیکن دارای ۴ مهره با رنگهای یکسان است. البته رنگ بازیکنها با یکدیگر تفاوت داشته و شامل قرمز، آبی، سبز و زرد میشود. وقتی که بر روی دکمه Predict کلیک کنیم، تاس شروع به چرخش کرده و عدد تصادفی را بین ۱ تا ۶ نشان میدهد. هر بازیکنی که ۶ بیاورد مهره خود را از محوطه مهرهها خارج کرده و شروع به حرکت در صفحه بازی میکند. به اندازه عدد نمایش داده شده توسط تاس مهرهها باید روی صفحه حرکت کنند. اولین نفری که به خانه «Home» برسد برنده بازی است و بازی تمام میشود.
پیش نیازهای ساخت بازی منچ با پایتون
پیادهسازی این پروژه نیازمند داشتن دانش خوب در حوزه پایتون و کتابخانه Tkinter است. کتابخانه Tkinter در پایتون ابزاری برای کار با Tk toolkit است. مجموعه ابزار Tk toolkit در زبانهای برنامه نویسی زیادی برای ساخت «رابط کاربری گرافیکی» ( Graphical User Interface | GUI) به کار برده میشوند.
برای ساخت این بازی به استفاد از ماژول PIL هم نیاز داریم. PIL، ماژولی از کتابخانه Pillow است. این ماژول به ایجاد، استفاده، تغییر و ذخیره شکلهای مختلف کمک میکند. برای استفاده از PIL باید ماژول Pillow را با کمک کد زیر نصب کنیم.
python -m pip install pillow
توجه: تمام کدهای مربوط به ساخت بازی منچ در پایتون را میتوانید از لینک (+) دانلود کنید.
افزایش مهارت در برنامه نویسی با پایتون
بازیسازی با پایتون یکی از حوزههای فعالیت این زبان است. زبان پایتون به دلیل قدرت، انعطافپذیری و توانایی برای توسعه برنامههای بزرگ، طرفداران بسیاری داشته و در حوزههای متنوعی فعالیت میکند. در صورت احساس نیاز به آشنایی بیشتر با زبان برنامهنویسی پایتون و علاقهمندی به آموزش نکات حرفهای در این زبان برنامهنویسی قدرتمند و انعطافپذیر، فیلمهای آموزشی تهیه شده در فرادرس را مشاهده کنید. اما اگر در مراحل مقدماتی و آشنایی با این زبان برنامهنویسی هستید، بهتر است که با فیلم آموزش رایگان پایتون در ۱۴۰ دقیقه از فرادرس شروع کنید.
وبسایت آموزشی فرادرس، فیلمهای بسیار خوب و با کیفیتی را برای آموزش انواع زبانهای برنامهنویسی تهیه کرده است. تلاش فرادرس بر این بوده به ازای هر زبان – به عنوان مثال پایتون – که آموزش میدهد، انواع جنبههای آن را نیز پوشش داده و تمام نیازهای علمی مخاطبان خود را برطرف کند. به همین دلیل فیلمهای آموزشی خوبی را درباره مفاهیم سطح بالای زبان پایتون تهیه کرده است که چند مورد را در فهرست زیر نشان دادهایم.
برای مشاهده گزینههای بیشتر میتوانید به وبسایت فرادرس مراجعه کنید یا با کلیک بر روی تصویر بالا به صفحه مخصوص فیلمهای آموزش زبان برنامهنویسی پایتون رفته و گزینههای بیشتری را نیز ببینید.
مراحل ساخت بازی منچ در پایتون
بهترین کار برای ساخت هر نرمافزار یا الگوریتم کامپیوتری این است که از قبل مراحل ساخت را بر روی کاغذ یا جایی به صورت مشخص یادداشت کرده و بعدا مرحله به مرحله شروع به پیادهسازی برنامه خود کنیم. فرایند ساخت این بازی هم مانند نحوه نوشتن الگوریتم در برنامه نویسی است. باید قدمبهقدم و به صورت منظم طی شود.
در این مورد هم از همین استراتژی استفاده میکنیم. بنابراین تمام مراحل توسعه بازی منچ در پایتون را در فهرست زیر به صورت مرحلهبهمرحله ارائه کردهایم.
- وارد کردن ماژولهای ضروری
- ایجاد کلاس سازنده بازی منچ در پایتون
- تعریف عملکرد ساخت صفحه بازی
- ساخت مهرهها
- تابعی برای انجام کنترل اولیه در بازی
- تابعی برای شبیهسازی انداختن تاس
- تابعی برای ساخت دکمههای عملکرد بازی
- تابع مخصوص اجرای فرمانهای بازی
- ساخت دکمههای اجرای دستورات با رنگهای قرمز، سبز، زرد و آبی
- توابعی برای نشان دادن حالت شروع بازی
- تابعی برای ساخت کنترل کننده اصلی جریان بازی
- تابعی برای نمایش حرکات مهرهها
- تابعی برای همپوشانی مختصات صفحه بازی و مهرهها
- ساخت تابع مخصوص حرکت هر مهره بر روی صفحه – تفاوت این مورد و شماره ۱۲ را در ادامه مطلب توضیح دادهایم.
- نوشتن تابع اعلام برنده و نایب قهرمان بازی
- بقیه کدها
- تابع اصلی
مرحله اول: وارد کردن ماژول های ضروری
در این مرحله از کدنویسی مربوط به ساخت بازی منچ با پایتون باید ماژولها و کتابخانههای ضروری پایتون برای اجرای پروژه را به محیط برنامهنویسی وارد کنیم.
تمام ماژولهای ایمپورت شده در بالا برای ساخت برنامه ضروری هستند. معمولا روال کار به این صورت است که از برنامه بسیار سادهای که کار میکند شروع کرده و کم کم امکانات بیشتری به آن میافزایند. اما در این مطلب از قبل برنامه توسعه داده شده است و فقط کدها را نمایش داده و سپس کارکرد هر بلوک از کد را به صورت مشخص، بیان میکنیم. در ادامه توضیحات مربوط به کدهای بالا را نوشتهایم.
توضیح کدها
در این قسمت تمام کدهای پیادهسازی شده در کادر بالا را به صورت کامل توضیح دادهایم.
- کتابخانه Tkinter: کتابخانه Tkinter در پایتون، ابزار استانداردی است که برای ساخت رابط کاربری گرافیکی به کار برده میشود.
- tkinter import * : در این خط کد، همه چیز را از ماژول Tkinter به محیط کدنویسی وارد کردهایم.
- from tkinter import messagebox: این خط کد، فقط « جعبه پیام» (Message Box) را به محیط برنامه نویسی پایتون اضافه میکند. از این ابزار برای نمایش پیام در صفحه نمایش به کاربر استفاده میکنیم.
- ماژول PIL : این ماژول از کتابخانه Pillow ساخته شده و برای کار با اشکال استفاده میشود. با کمک این ماژول میتوان انواع اشکال مختلف را به برنامه اضافه کرده و ساختارشان را تغییر داد. در نهایت هم میتوانیم این اشکال را در برنامه ذخیره کنیم.
- import ImageTk: ماژول ImageTk برای ساخت و دستکاری در تصاویر اختصاصی کتابخانه Tkinter و PIL استفاده میشود.
- کتابخانه Random: کتابخانه Random یکی از کتابخانههای درونی پایتون است که برای تولید اعداد تصادفی یا انتخاب عناصر از درون لیستها به صورت تصادفی به کار برده میشود.
- time: کتابخانه time برای کار با زمان در پایتون استفاده میشود.
مرحله دوم: ایجاد کلاس سازنده بازی منچ در پایتون
در این مرحله از فرایند ساخت بازی منچ، کلاس اصلی را به نام Ludo_Game تعریف کردهایم. این کلاس مرجع اصلی تمامی توابع و کلاسهای دیگر است. ابتدا کدهای اولیه کلاس را نمایش داده و بعد از آن به بررسی این کدها پرداختهایم.
در ادامه به توضیح مختصر و کامل کدهای نوشته شده در بالا پرداختهایم.
توضیح کدها
کدهای بالا مربوط به ساخت کلاس سازنده بازی منچ در پایتون است. کدهای این بازی برای پروژههای دانشجویی، تقریبا طولانی است. به همین دلیل تلاش کردهایم که تا حد امکان تمام کدها را به صورت بخش به بخش توضیح دهیم.
- LudoGame(): تعریف کلاس اصلی برای ساخت بازی منچ در پایتون را با این کد شروع میکنیم.
- def __init__: در این قسمت سازنده کلاس را تعریف کرده و سپس پارامترهای ورودی و مورد نیاز را نیز برای آن تعریف کردهایم.
- make_board: از این کد برای ساخت صفحه بازی منچ و رنگآمیزی پسزمینه این صفحه استفاده کردهایم. در پارامترهای width و height هم به ترتیب عرض و ارتفاع صفحه بازی مشخص شدهاند.
- مهرهها: تمام مهرهها را به صورت لیست خالی و به نام رنگشان در کدهای Red_coin و Green_coin و Yellow_coin و Blue_coin تعریف کردهایم.
- برچسبها: برچسب مربوط به چهار بخش اصلی از صفحه بازی را نیز به صورت لیست خالی و با نامهای Red_label و Green_label و Yellow_label و Blue_label تعریف کردهایم. تمام این نامها را – مانند نام مهرهها – برابر با لیست خالی گذاردهایم. موارد مطرح شده در این بخش، ظرفهایی هستند که برای ذخیرهسازی دادهها مورد استفاده قرار میگیرند.
- Dice_side: این لیست برای ذخیرهسازی همه جهتهای تاس به کار برده میشود.
- مختصات اولیه مهرهها: هر چهار لیست Red_coord و Green_coord و Yellow_coord و Blue_coord برابر با [-1, -1, -1, -1] تعریف شدهاند.
- Position_Red_coin = [0, 1, 2, 3]: کد Position_Red_coin = [0, 1, 2, 3] و بقیه کدهای همسان آن برای نشان دادن مخصات مربوط به شروع حرکت مهرهها استفاده میشوند. سپس برای مشخص کردن موقعیت دقیق هر مهره – به صورت پیشفرض -1 - از حلقه For در پایتون استفاده میکنیم.
- در نهایت هم کلاس سازنده تمام توابع مورد نیاز خود را برای راهاندازی بازی فراخوانی میکند.
مرحله سوم: تعریف عملکرد ساخت صفحه بازی
در این قسمت از بازی تابع مخصوص ساخت صفحه بازی منچ را تعریف کردهایم. در کادر زیر، تمام کدهای مربوط به این تابع را مشاهده میکنید. بعد از آن کدها را توضیح دادهایم.
توضیح کدها
در فهرست زیر بخشهای مهم کدهای بالا را به صورت کلی توضیح دادهایم.
- def Board(): در خط اول، تعریف تابعی است که صفحه بازی منچ را ایجاد میکند.
- چهار بخش اصلی صفحه: اکنون در این تابع از چهار مستطیل بزرگ در بالا سمت چپ، بالا سمت راست، پایین سمت چپ و پایین سمت راست برای ساخت شکل کلی صفحه بازی استفاده کردهایم. هم مختصات مربوط به این مربعات را تعریف کرده و هم رنگ مربوط به پس زمینه تصویر را مشخص کردهایم. یعنی هر چهار مربع را با رنگ پس زمینه پر کردیم.
- خطوط جداگانه چهار طرف صفحه: سپس با استفاده از حلقه for خطوط چپ، راست، بالا و پایین صفحه را با هدف شکل دادن به صفحه رسم کردهایم.
- Make_board.create_polygon : از این کد برای ساخت مثلث در وسط صفحه استفاده کردهایم.
مرحله چهارم: ساخت مهره ها
برای ساخت بازی در پایتون علاوه بر استفاده از کتابخانه Tkinter کتابخانه تخصصی دیگری نیز به نام Pygame تعریف شده است. کتابخانه Tkinter بر روی رابطهای کاربری گرافیکی کار میکند. اما کتابخانه Pygame به شکل تخصصی برای توسعه بازیها توسط پایتون طراحی و تولید شده است. به منظور آموزش کار با این کتابخانه، فیلم آموزش بازی سازی در پایتون با کتابخانه Pygame را از فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار دادهایم.
در این مرحله ابتدا کدهای مربوط به ساخت مهرهها را نمایش دادهایم. سپس به بیان توضیح کلی درباره این کدها پرداختهایم.
توضیح کدها
- Red1_Coin: این کد برای تعریف اولین مهره قرمز رنگ و به شکل بیضی نوشته شده است. در ابتدا مختصات مهره مشخص شده است، سپس اندازه و در نهایت هم رنگ پسزمینه مهره را تعریف کردهایم.
- سپس همانند کار بالا را برای هر چهار مهره مختلف از چهار رنگ مختلف – قرمز، سبز، زرد و آبی – انجام دادهایم.
- Red1_label: این کد و کدهای مشابه این مورد برای برچسبگذاری بر روی مهره با شمارههای ۱ و ۲ و ۳ و ۴ به کار برده میشوند. در این کدها فونت، اندازه فونت، رنگ پسزمینه و رنگ فونت را تعریف کردهایم.
- Red1_label.place: این کد و موراد مشابه این کد برای قرار دادن هر برچسب در سر جای خودش بر روی صفحه به کار برده میشوند.
- تمام برچسبهای مهرههای چهارگانه در رنگهای مختلف به روش یکسانی ساخته شدهاند.
- append(): این کد عنصر مجزایی را به لیست موجود اضافه میکند.
مرحله پنجم: تابعی برای انجام کنترل اولیه در بازی
در این مرحله به منظور انجام کنترل اولیه در بازی باید تابعی را بنویسیم.
این تابع فضای گرافیکی دارد و از کاربر سوالهای اساسی اولیه بازی، مثل تعداد بازیکنها و انسانی یا کامپیوتری بودن رقیبان را میپرسد.
توضیح کدها
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- Initial_Control() : این تابع برای اعمال کنترل اولیه در بازی تعریف شده است. در واقع، اکنون در حال تعریف پنجره دیگری برای اعمال کنترل اولیه در بازی هستیم.
- Toplevel() : متد Toplevel() یکی از ابزارهای کتابخانه Tkinter است که برای ظاهر شدن پنجره فرعی بر روی پنجره اصلی به کار برده میشود.
- top.geometry() : این تابع برای تعریف ابعاد پنجره استفاده میشود.
- config() : این تابع برای تنظیم رنگ پسزمینه پنجره بازشده به کار برده میشود.
- iconbitmap(): از این تابع برای تنظیم کردن آیکون پنجره با استفاده از فرمت Bitmap استفاده میشود.
- head: این کد برچسبی به پنجره فرعی اضافه میکند که نشاندهنده تعداد کل بازیکنان – با عبارت «Total number of players» – است. البته در این بخش باید تنظیمات مربوط به فونت برچسب را هم مرتب کنیم.
- .place: این متد برای جایگذاری صحیح پنجره فرعی در موقعیت مناسب استفاده میشود.
- take_entry: تعداد بازیکنان شرکت کننده در بازی را دریافت میکند.
- Filter_value(): این تابع برای فیلتر کردن مقدارهای ورودی برای مشخص کردن تعداد کل بازیکنان است.
- input_filter_value(): دادههای ورودی را فیلتر میکند. با استفاده از بلوک کد Try-Except تعداد بازیکنان را بررسی میکند که بین ۲ تا ۴ باشند.
- take_Response: پاسخهای مربوط به تعداد بازیکنان را تحویل میگیرد. اگر عدد معتبری باشد تابع command_maker را فراخوانی میکند. در غیر این صورت، پیغام خطایی را نمایش میدهد که بیان میکند، عدد وارد شده باید از ۲ تا ۴ باشد «Input the number between 2 to 4». سپس تابع destroy() را فراخوانی کرده و دوباره کنترل اولیه را برمیگرداند.
- submit_btn: دکمه تایید، با نام submit را به همراه رنگ، فونت، مختصات قرارگیری، اندازه و دستور مربوط به فیلتر کردن ایجاد میکند.
- Operate(): این تابع عملیات مربوط به بازیکنهای کامپیوتری را مدیریت میکند. در این تابع از ساختار عبارت شرطی If در پایتون استفاده کردهایم. به صورت تکمیلتر معمولا ساختار If-Else استفاده میشود.
- delay_instruction(): این تابع برای ارسال دستورالعملها بعد از زمان شروع بازی بین بازیکن و حریف کامپیوتری کار میکند. در این بخش نیز از ساختار if-else برای مدیریت دستورات ارسالی استفاده کردهایم.
- time_is: این تکه کد برای اعمال تاخیر در روند اجرای برنامه به کار برده شده است. در کدهای این مثال، مقدار تاخیر را بر روی ۵ ثانیه « 5 msec» تنظیم کردهایم.
- btn_PC: این کد دکمه بازی با کامپیوتر «Play with Computer» را ساخته است. رنگ پسزمینه برای آن دکمه تعبیه شده، فونت، اندازه فونت، رنگ فونت، اندازه و عرض دکمه و دستور مورد نظر را در این کد نوشتهایم.
- btn_PF: این کد دکمه بازی با دوستان «Play with Friends»، یعنی شخصیت انسانی را ساخته است. رنگ پسزمینه برای آن دکمه تعبیه شده، فونت، اندازه فونت، رنگ فونت، اندازه و عرض دکمه و دستور مورد نظر را در این کد نوشتهایم.
مرحله ششم: تابعی برای شبیه سازی انداختن تاس
در این مرحله از فرایند توسعه بازی، باید تاس را شبیهسازی کنیم. نوشتن کدهای تاس ساده است. در کادر زیر کدهای مربوط به تاس بازی را پیادهسازی کردهایم.
توضیح کدها
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- Prediction_Maker() : بعد از اینکه عملیات انداختن تاس انجام شد و عدد مورد نظر بر اساس احتمالات، کشف شد، مقدار مورد نظر – مقدار بلوک – برای ارسال به سمت مهرهها مشخص میشود.
- Predict_Blockvalue: با هدف پیشبینی مقدار بلوک به کار برده میشود.
- try-except: درون قطعه کد Try-Except از عبارت شرطی if-else استفاده کرده و رنگ هر مهره را بررسی میکنیم. در واقع شاخص رنگ را برای دستههای چهارتایی مهرهها مشخص میکنیم. سپس مقدار بلوک با کمک تابع تاس پیشبینی میشود.
- randint: این تابع یکی از ابزارهای «درونی» (In-Built) کتابخانه random است. تابع randint برای انتخاب عدد تصادفی و با نوع Integer استفاده میشود. تابع randint این قابلیت را دارد که عدد تصادفی را فقط از محدوده مشخص شده توسط برنامهنویس انتخاب کند.
- Temp_counter: از طریق نمایش مهرههای در حال حرکت بین موقعیتهای صفحه بازی، شناور بودن مهرهها را شبیهسازی میکند. این گزینه نمایش تصویری از انیمیشنسازی حرکات مهرهها است.
- Permanent_Dice_num: آخرین مقدار پیشبینی شده توسط تاس را ذخیره کرده و به عنوان تصویر ثابت نمایش میدهد.
- شکست بلوک Try: اگر بلوک try اجرا نشود، بلوک exception ، خطای Force stop را برگردانده و فرایند پیشبینی توسط تاس را متوقف میکند.
مرحله هفتم: تابعی برای ساخت دکمه های عملکرد بازی
در این قسمت از فرایند توسعه بازی، باید دکمههای مورد نظر برای ساخت بازی منچ با پایتون را در صفحه نمایش پیادهسازی کنیم.
در کادر زیر تمام این دکمهها را تعریف کرده و دستور مربوط به هر کدام را نوشتهایم.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر، توضیح دادهایم.
- Instructional_button(): در این بخش از کدها، بر اساس موقعیت صحیح در زمان بازی، دکمه Instructional_button را ساخته و سفارشیسازی میکنیم.
- Robo_Operator = None: این خط از کد، مقدار متغیر robo_operator را برابر با None قرار میدهد.
- all_in = 1: این متغیر به معنای آن است که همه مهرهها در موقعیت اولیه جایگاه خود در زمین بازی قرار دارند.
- all_in = 0: این متغیر به معنای آن است که همه مهرهها در موقعیت اولیه جایگاه خود در زمین بازی قرار ندارند.
- Disable: این متغیر به معنای غیر فعال بودن دکمه پیشبینی با تاس Predict است. در این شرایط، هیچ بازی کنی نمیتواند از تاس استفاده کند.
- Active: این متغیر به معنای آن است که بازیکنان میتوانند با استفاده از تاس پیشبینی کنند.
مرحله هشتم: تابع مخصوص اجرای فرمان های بازی
در این بخش از کدها، تابع کلی و مخصوصی را برای ساخت دستورات بازی پیادهسازی کردهایم.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- Command_Maker(): این تابع را تعریف کردهایم تا دستورهای مورد نظر در بازی را اعمال کند.
- time_for: اگر مقدار متغیر time_for برابر با ۱- باشد، شرط برقرار بوده و دستورالعملهای تعیین شده اجرا خواهند. در غیر این صورت، روند اجرای بازی، غیرفعال میشود.
- robo: اگر مقدار متغیر robo برابر با ۱ بوده و time_for برابر با صفر باشد، دکمه مربوط به predict، فرمانی گرفته و اجرا میشود. در غیر این صورت تابع Robo_Judge را فراخوانی میکنیم. در واقع اگر بازیکن کامپیوتری فعال بود و بازیکن انسانی اجازه بازی نداشت، پس نوبت کامپیوتر است که تاس انداخته و بازی کند.
مرحله نهم: ساخت دکمه های اجرای دستورات در همه رنگ ها
در این قسمت از مطلب، کدهای مربوط به دکمههای اجرای دستورات مربوط به هر بخش از صفحه بازی و با رنگهای قرمز، سبز، زرد و آبی را پیادهسازی کردهایم.
در کادر زیر کدهای مربوط به پیادهسازی این دکمهها نوشته شدهاند.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
Instructional_Button_Red
این تابع برای ساخت دکمه آموزش مربوط به مهرههای قرمز به کار برده شده است.
- Predict_Red: این تابع دکمه Predict را برای مهره قرمز راهاندازی میکند. بعد زدن بر روی این دکمه، تاس مربوط به رنگ قرمز، میچرخد و عدد تصادفی بین ۱ تا ۶ تولید میشود.
- btn_1 و btn_2 و btn_3 و btn_4: از آنجا که هر رنگی دارای چهار مهره است، این کدها ۴ دکمه مختلف را به نمایندگی از این مهرهها ایجاد میکنند. هر دکمهای توسط رنگ پسزمینه، رنگ فونت، فونت، عرض محدوده و دستوری سفارشیسازی شده است که از تابع lambda برای عملیات مشخص شده استفاده میکند.
- .place : دکمهها را در مختصات صحیح خود در صفحه قرار میدهد.
Instructional_Button_Blue
همان منطق برای سایر توابعی هم به همین صورت کار میکند که نماینده باقی رنگهای بازی هستند.
- Predict_Blue: این تابع دکمه Predict را برای مهره آبی راهاندازی میکند. بعد زدن بر روی این دکمه، تاس مربوط به رنگ آبی، میچرخد و عدد تصادفی بین ۱ تا ۶ تولید میشود.
- btn_1 و btn_2 و btn_3 و btn_4: از آنجا که هر رنگی دارای چهار مهره است، این کدها ۴ دکمه مختلف را به نمایندگی از این مهرهها ایجاد میکنند. هر دکمه توسط رنگ پسزمینه، رنگ فونت، فونت، عرض محدوده و دستور مشخصی سفارشیسازی شده است که از تابع lambda برای عملیات مشخص شده استفاده میکند.
- .place : دکمهها را در مختصات صحیح خود در صفحه قرار میدهد.
Instructional_Button_Green
منطق زیر مخصوص تعریف دکمههای رنگ سبز در صفحه است.
- Predict_Green: این تابع دکمه Predict را برای مهره سبز راهاندازی میکند. بعد زدن بر روی این دکمه، تاس مربوط به رنگ سبز، میچرخد و عدد تصادفی بین ۱ تا ۶ تولید میشود.
- btn_1 و btn_2 و btn_3 و btn_4: از آنجا که هر رنگی دارای چهار مهره است، این کدها ۴ دکمه مختلف را به نمایندگی از این مهرهها ایجاد میکنند. هر دکمه توسط رنگ پسزمینه، رنگ فونت، فونت، عرض محدوده و دستور مشخصی، سفارشیسازی شده است که از تابع lambda برای عملیات مشخص شده استفاده میکند.
- .place : دکمهها را در مختصات صحیح خود در صفحه قرار میدهد.
Instructional_Button_Yellow
- Predict_Yellow: این تابع دکمه Predict را برای مهره زرد راهاندازی میکند. بعد زدن بر روی این دکمه، تاس مربوط به رنگ زرد، میچرخد و عدد تصادفی بین ۱ تا ۶ تولید میشود.
- btn_1 و btn_2 و btn_3 و btn_4: از آنجا که هر رنگی دارای چهار مهره است، این کدها ۴ دکمه مختلف را به نمایندگی از این مهرهها ایجاد میکنند. هر دکمه توسط رنگ پسزمینه، رنگ فونت، فونت، عرض محدوده و دستور مشخصی، سفارشیسازی شده است که تابع lambda را برای عملیات مشخص شده به کار میبرد.
- .place : دکمهها را در مختصات صحیح خود در صفحه قرار میدهد.
مرحله دهم: توابعی برای نشان دادن حالت شروع بازی
بسیاری از افراد به این دلیل برنامه نویسی را شروع میکنند که به ساخت بازیهای کامپیوتری علاقهمند هستند. قبل از هر چیزی لازم است که به دانش شناخت و استفاده از ابزار تخصصی برنامهنویسی بازیها در پایتون مجهز شویم. به این منظور پیشنهاد میکنیم که مطلب ساخت بازی با پایتون، هر آنچه برای شروع باید بدانید همراه با پروژه را از مجله فرادرس مطالعه کنید.
در کدهای این بخش، برای نشان دادن حالت شروع بازی، توابع خاصی را تعریف کردهایم. این توابع در کدهای مربوط به کادر زیر پیادهسازی شدهاند.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- Start_position_RedCircle() : تابع مربوط به تعریف موقعیت شروع بازی برای مهرههای رنگ قرمز
- Start_position_BlueCircle() : تابع مربوط به تعریف موقعیت شروع بازی برای مهرههای رنگ آبی
- Start_position_GreenCircle() : تابع مربوط به تعریف موقعیت شروع بازی برای مهرههای رنگ سبز
- Start_position_YellowCircle() : تابع مربوط به تعریف موقعیت شروع بازی برای مهرههای رنگ زرد
تمام مراحل پایین برای هر چهار رنگ بازی تکرار میشود.
- made_red_coin: مهرهای با شکل بیضی را با استفاده از مختصات و اندازه مورد نظر ساخته و درون آن را با رنگ مشخص شده – اینجا قرمز – پسزمینه پر میکند. همین کار را برای سایر رنگها نیز انجام میدهد.
- place_forget: این تابع ابزاری از کتابخانه Tkinter است که برای مخفی کردن یا پاککردن ویجت خاصی – مانند برچسب یا دکمه – از روی پنجره اصلی در صفحه نمایش به کار برده میشود.
- red_start_label_X: موقعیت شروع مهره قرمز را برچسبگذاری میکند.
- window.update(): این تابع برای بهروزرسانی پنجره – بعد از هر تغییر در مهرهها – استفاده میشود.
- time.sleep() : در روند جریان بازی تاخیر میاندازد. این زمان تاخیر را برابر با ۰٫۲ ثانیه 0.2 msec تنظیم کردهایم.
مرحله یازدهم: تابعی برای ساخت کنترل کننده اصلی جریان بازی
کدهای این مرحله، روند اصلی جریان بازی را مدیریت میکنند.
تابع پیادهسازی شده در کادر زیر کل توابع مربوط به جریان بازی را به صورت منظم و مرتب، یک به یک اجرا کرده و تشخیص میدهد که چه وقتی نوبت به چه تابعی است که اجرا شود.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- در تابع Main_Controller از ساختار عبارت شرطی if-else استفاده کردهایم. در شرط این عبارت وقتی که رنگ قرمز انتخاب شود coin_color = red ، در بلوک if تابع num_btns_state_controller را برای مدیریت دکمههای مربوط به رنگ قرمز، فراخوانی کرده و سپس موقعیت مربوط به مهرههای قرمز را در صفحه تنظیم میکنیم.
- اگر مهرهها به مقصد مشخص شده برسند، پیغامی با عبارت «Reached at destination» به صورت پنجره Pop Up ظاهر میشود. سپس اگر دکمههای مربوط به مهرهها را فشار دهیم – که در آن لحظه مجوز این کار را نداریم – پنجره مخصوص پیغام خطا با عبارت «Not possible, Sorry, Not permitted» نمایش داده میشود.
- در غیر این صورت، یعنی اگر دکمه رنگ دیگری را فشار دهیم، پیغام خطای «Wrong choice, Sorry, Your coin is not permitted to travel» نمایش داده میشود که به معنای «مجاز نبودن به اعمال حرکت مهرهها در صورت انتخاب اشتباه رنگ» است.
- به همین صورت درباره رنگهای آبی، سبز و زرد نیز رفتار میکنیم.
- اگر متغیر permission_grantedبرابر با true باشد، برنامه توابع مربوط به شناسایی برنده winner و نایبقهرمان runnerup را اجرا میکند. اما اگر شرط برابر با false شد، بازی به پایان میرسد و رفتارهای بازی ادامه پیدا نمیکنند.
مرحله دوازدهم: تابعی برای نمایش ظاهری حرکات مهره ها
کدهای این بخش از بازی، روند حرکتی مهرهها را نمایش میدهند.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع Coin_Motion() را در فهرست زیر توضیح دادهایم.
- تابع Coin_Motion() برای حرکت دادن مهرهها به سمت مقصد استفاده میشود.
- در این تابع برای بررسی خطاهای احتمالی از بلوک try-except استفاده کردهایم. اگر در زمان حرکت دادن مهرهها خطایی رخ داد، بخش try متوقف شده و بخش except پیغام خطای «Force stop error came in motion of coin.» را نمایش میدهد.
- در بخش try دو متغیر coin_counter و coin_color را مقایسه میکنیم. coin_counter شمارنده تعداد قدمهای طی شده توسط مهرههای کامپیوتر یا سایر بازیکنان است. اگر این شمارنده برای مهرههای کامپیوتر یا سایر بازیکنان به عدد 106 رسید، در روی صفحه نمایش پیغام «Destination reached, Hey I am at destination» نشان داده میشود. اگر شمارنده حرکات مهره coin_counter خود کاربر به عدد 106 برسد پیغام «Destination reached, Congrats you now at destination.» نمایش داده میشود.
- تابع place_forget یکی از ابزارهای تعریف شده در کتابخانه Tkinter است. در آخر اجرای این نوع از عملیات باید از این تابع برای مخفی کردن Widget-های ظاهر شده در صفحه اصلی بازی استفاده شود.
مرحله سیزدهم: تابعی برای برخورد مختصات صفحه بازی و مهره ها
کدهای این بخش از مطلب، برای انجام رفتارهای بازی در زمان برخورد مختصات صفحه بازی و مهرهها پیادهسازی شدهاند.
در کدهای پایین این فرایند نمایش داده شده و سپس توضیحات مربوط به این کدها را بیان کردهایم.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- تابع coord_overlap() به این منظور تعریف شده که مهرهها را بسوزاند و به خانه اولیه خودشان انتقال دهد. اگر دو مهره، در صفحه بازی به موقعیت یکسانی برسند، مهرهای که اول رسیده حذف شده و به موقعیت اولیه مربوط به مهرههای همرنگ خود منتقل میشود.
- بر فرض مثال، اگر رنگ مهره قرمز باشد، اول از همه باید طول Red_coord را بررسی کنیم. اگر هر مهره رنگی دیگری با مهرهها قرمز همپوشانی داشته باشد، باید مهرهای که قبلا آمده حذف شده و به موقعیت اولیه مهرهها در صفحه بازی فرستاده شود.
- تابع remade_coin با این هدف تعریف شده است که وقتی مهرهای حذف شد، باید دوباره در موقعیت اولیه مهرهها مربوط به رنگ خودش بازسازی شود. بنابراین باید با استفاده مختصات مکان قرارگیری، عرض و اندازه مهره و رنگ مختص به آن، مهره مورد نظر را ساخته و با استفاده از تابع .place در موقعیت مناسب قرار دهیم.
- همین منطق برای مهرههای رنگهای آبی، سبز و زرد هم پیادهسازی میشود.
مرحله چهاردهم: پیاده سازی منطق حرکت مهره ها بر روی صفحه
مدیریت منطق جریان بازی یکی از مهمترین نکات در روند ساخت همه بازیها یا به طور کل، همه نرم افزارهاست. به غیر از اینکه بازی باید ظاهر مناسبی داشته باشد، روند کلی هم باید شامل منطق قابل درک و مشخصی شود. یکی از سایر بازیهایی که روند منطقی خوبی در آن پیادهسازی شده، بازی سنگ، کاغذ، قیچی است. برای آموزش روند پیادهسازی منطق این بازی میتوانید فیلم آموزش پایتون با طراحی بازی سنگ کاغذ قیچی را در فرادرس مشاهده کنید. لینک مربوط به این فیلم را در پایین نیز قرار دادهایم.
در این مرحله و در کادر زیر، تابعی را پیادهسازی کردهایم که منطق حرکت مهرهها بر روی صفحه بازی منچ را کنترل میکند.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- تابع Traversal_control() از طریق مدیریت پارامترهای مختلف درباره موقعیت هر مهره Specific_Coin، مانند num_label و num_label_X و num_label_Y و Path_Counter و Coin_Counter و Coin_Color حرکت آنها را در صفحه را کنترل میکند.
- اگر رنگ مهره برابر با یکی از عناصر red و green و blue و yellow باشد و شمارنده مهره بزرگتر یا مساوی ۱۰۰ بود، باید مقدار coin_counter را به بیرون برگردانیم.
- سپس برای اندازهگیری میزان مسافتی که باید طی شود، به ازای هربار پیمایش در خانههای رنگی، تابع جدیدی را ایجاد کرده و در انتها مقدار coin_counter را برمیگردانیم.
- همین کار را برای همه اتاقهای رنگی دیگر نیز تکرار میکنیم. در نهایت مطمئن میشویم که به ازای فرایند طی مسیر توسط هر مهرهای میزان coin_counter صحیح برگردانده شده است.
مرحله پانزدهم: نوشتن تابع اعلام برنده و نایب قهرمان بازی
در حال رسیدن به مراحل نهایی ساخت بازی منچ با پایتون هستیم. لازم است که برای مشخص کردن برنده، نفر دوم و نفر سوم هم چارهای اندیشیده شود.
در این بخش برای اعلام برنده بازی نایبقهرمان او و نفر سوم، تابع مناسبی را پیادهسازی کردهایم که در کادر زیر، قابل مشاهده است.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- check_winner_runnerup(): این تابع وظیفه اصلی بررسی و کشف برنده و نفر دوم بازی را برعهده دارد.
- Destination_Reached = 0: اگر مقدار متغیر Destination_Reached برابر با 0 بود، باید وضعیت تمام مهرههای مشخص شده را بررسی کنیم.
- Destination_Reached = 1: اگر مقدار متغیر Destination_Reached برابر با 1 بود به معنای آن است که همه مهرههای درون بلوک به مقصد خود رسیدهاند. در این حالت باید به دنبال شناسایی برنده و نائب قهرمان باشیم.
در این شرایط برای پیدا کردن برنده، نفر دوم و نفر سوم بازی میتوان چهار شرط مختلف را در نظر گرفت که در فهرست پایین نشان دادهایم.
- اگر مقدار TakePermission برابر با 1 و رنگ مهره هم قرمز باشد، بازیکن اصلی، برنده بازی شده و پیغام« YOU WIN!!» در روی صفحه نمایش ظاهر میشود.
- اگر بازیکن برنده غیر از کسی بود که از مهرههای به رنگ قرمز استفاده میکرد، پیامهایی با عبارتهای Winner و «Congrats! You are the winner» به صورت پاپآپ ظاهر میشوند. همین بررسیها برای نفرات دوم و سوم هم انجام میشوند.
- اگر TakePermission برابر با 2 شده و رنگ مهره هم قرمز باشد، پیغام «.Winner, Hurrah! I am 1st runner up» به کاربر نمایش داده میشود. در غیر این صورت – یعنی به ازای دوم شدن سایر رنگها – پیغام «Wow! You are 1st runner» در صفحه نمایش ظاهر میشود.
- اگر TakePermission برابر با عدد 3 شود و رنگ مهره هم قرمز شود، پیغام «Result, I am 2nd runner….Not bad at all» به بازیکن اصلی نمایش داده میشود. و به ازای سایر رنگها – یعنی سایر بازیکنان – نیز پیغام «Result, You are 2nd runner….Better Luck next time» در صفحه نمایش نشان داده میشود.
در غیر این صورت بازی بدون اعلام برنده به پایان میرسد. در ادامه چند مورد از آموزشهای پروژه محور پایتون را معرفی کرده و بعد از آن درباره ادامه کدها صحبت کردهایم که اتفاقا بسیار مهم هم هستند.
آموزش پیشرفته پایتون با استفاده از فیلم های پروژه محور فرادرس
آموزش هر تخصصی شامل مراحل مختلف است. این مراحل از مراحل ساده و ابتدایی برای آشنایی با قواعد کلی تا مراحل پیشرفته و مفاهیم تخصصی را شامل میشوند. معمولا آخرین مرحله برای آموزش هر حرفهای با هدف ورود به دنیای واقعی و بازار کار، اجرای تمرینات پروژه محور و شبیه به سناریوهای دنیای واقعی است. در برنامهنویسی هم روش صحیح آموزش به همین شکل است. از آشنایی با سینتکس زبانها شروع شده و تا طراحی سایت و مدلهای هوش مصنوعی و ساخت اپلیکیشنهای کاربردی، به پیش میرود. بهترین راه برای حرفهایتر شدن برای کار با پایتون در فرادرس هم مشاهده فیلمهای پروژه محور پایتون است. در این قسمت چند مورد از فیلمهای آموزش حرفهای پروژه محور پایتون در فرادرس را معرفی کردهایم.
در صورت تمایل با کلیک بر روی تصویر پایین، به فیلمهای آموزشی بیشتری دسترسی خواهید داشت.
مرحله شانزدهم: بقیه کدها
در این قسمت از مطلب بقیه کدهای مربوط به مدیریت جریان بازی را پیادهسازی کردهایم.
در این کدها از فرایندهایی مانند ورود مهرهها به زمین بازی تا سوختن آنها در اثر برخورد مهرههای دیگر از پشت سر و حذف شدنشان از بازی را نوشتهایم. بعد از کادر پایین، نکات مهم توضیح داده شدهاند.
توضیح کدهای این قسمت از ساخت بازی منچ با پایتون
مهمترین نکات مربوط به تابع بالا را در فهرست زیر توضیح دادهایم.
- ind = “give”: این متغیر برای اختصاص دادن مقدار به کار برده میشود.
- all_in = 1: این متغیر نشان میدهد که همه مهرهها در صفحه بازی حضور دارند.
- all_in = 0: این متغیر نشان میدهد که همه مهرهها در صفحه بازی حضور ندارند.
- هر بازیکن، بعد از ازینکه تاس انداخت، اگر مقدار ۶ ظاهر شد، مهرهای را از سلول مخصوص مهرهها خارج کرده و بازی شروع میشود.
- Position_Red_coin: این متغیر رد مهرههای قرمز را دنبال میکند.
- Position_Blue_coin: این متغیر رد مهرههای آبی را دنبال میکند.
- Store_Robo == 1: شرط زمانی برقرار میشود که فقط یک مهره بیرون از صفحه بازی حضور داشته باشد.
- forward_prem: این کد مدیریت فرایند اجرا شدن یا نشدن دستورها را برعهده دارد.
- Normal_Movement_asper_Condition(): این تابع وظیفه بررسی این را دارد که آیا مجموعه مقدارهای موقعیت فعلی و مقدار پیشبینیشده – توسط تاس – کوچکترمساوی 106 است یا نه.
- Normal_Movement = 1: نشاندهنده حرکت معمولی مهرهها است.
- For-loop: با کمک حلقه for مهرهها را بر اساس شرایط مشخصی فیلتر میکند. سپس بررسی میکند که آیا به دلیل مقدار حرکت مشخص شده توسط تاس همپوشانی یا برخوردی بین مهرهها رخ داده است یا نه. در صورت رویدادن رخورد باید مهرهای دیگر سوزانده و از محیط بازی حذف شوند.
- positive_distance = robo_front: نشاندهنده وجود مانع در مقابل مهرهها است.
- negative_distance = robo_behind: نشاندهنده وجود مانع در عقب سر مهرهای است.
- .remove: اولین عنصر همسان را از درون لیست حذف میکند.
- .append: عنصر مجزایی را به لیست موجود اضافه میکند.
- در اخر هم تابع Prediction_Maker فراخوانی میشود.
مرحله نهایی: تابع اصلی
در این بخش از مطلب، که به عنوان آخرین قسمتهای کد نیز در نظر گرفته میشود، تمام کدهای مربوط به بدنه اجرایی برنامه به صورت کلاسیک بعد از شرط if __name__ == ‘__main__’: نوشته میشود.
توضیح کدهای قسمت نهایی ساخت بازی منچ با پایتون
مهمترین نکات موجود در کدهای بالا را در فهرست زیر توضیح دادهایم. در تابع main با استفاده از کتابخانه Tkinter، پنجره اصلی صفحه بازی ساخته میشود.
- .geometry() : این تابع برای مشخص کردن ابعاد پنجره به کار برده میشود.
- .title(): این تابع، تیتر یا سربرگ پنجره بازی را تنظیم میکند.
- iconbitmap(): این تابع، آیکون پنجره را با استانداردهای Bitmap تنظیم میکند.
- ImageTk.PhotoImage: از تابع ImageTk.PhotoImage برای نشان دادن تصاویر بر روی صفحه نمایش استفاده میشود.
- mainloop(): در نهایت هم تابع mainloop() برای اجرا شدن بازی فراخوانی شده است.
تصویر اولیه صفحه نمایش این بازی به شکل زیر است.
جمعبندی
در مطلب بالا، با استفاده از «رابط کاربری گرافیکی» (Graphical user Interface | GUI)، موفق به ساخت بازی منچ در پایتون شدهایم. درباره تکنیکها و ابزارهای مورد استفاده در کتابخانه Tkinter و ماژول PIL اطلاعات بیشتری به دست آوردیم. استفاده از GUI برای توسعه بازیها در پایتون – به خصوص بازی منچ – هم بسیار سرگرم کننده است و هم آموزنده. ساخت بازی منچ با پایتون یکی از پروژههای جذابی است که برنامهنویسان برای تمرین کدنویسی تمیز و حرفهای انجام میدهند. هر زمان که بخواهید میتوانید از بازی توسعه داده شده استفاده کرده و حتی کدهای آن را نیز تغییر دهید.
در این مطلب از مجله فرادرس، بازی منچ را با یکی از کتابخانههای گرافیکی پایتون توسعه داده و تمام موارد مهم آن را توضیح دادیم. از مرحله اول شروع کرده و قدم به قدم فرایند توسعه این کد را به پیش بردیم. در هر مرحله ابتدا کدها را به نمایش گذاشته و سپس مهمترین نکات موجود در کدها را بیان کردهایم.
source