python-project-V1.0.pdf

‫مبانی برنامه سازی
‬
‫نیمسال دوم ‪
۹۲-۹۳‬‬
‫مدرس‪ :‬نیک‌آیین‬
‫پروژه درس‪ -‬بخش اول‬
‫‪Candy Crush‬‬
‫مهلت ارسال‪ ۳۱ :‬فروردین‬
‫مقدمه
‬
‫در ای‪J‬ن پ‪J‬روژه ق‪J‬صد داری‪J‬م در ق‪J‬ال‪J‬ب پ‪J‬یاده‌س‪J‬ازی ب‪J‬ازی م‪J‬شهور ‪ ،candy crush‬م‪J‬فاه‪J‬یمی ک‪J‬ه در درس ف‪J‬را گ‪J‬رف‪J‬ته ای‪J‬د را م‪J‬رور ک‪J‬نیم‪.‬‬
‫ای ‪JJ‬ن پ ‪JJ‬روژه ش ‪JJ‬ام ‪JJ‬ل دو ب ‪JJ‬خش خ ‪JJ‬واه ‪JJ‬د ب ‪JJ‬ود ک ‪JJ‬ه ب ‪JJ‬خش اول آن را در زی ‪JJ‬ر م ‪J‬ی‌ب ‪JJ‬ینید‪ .‬ب ‪JJ‬ه ط ‪JJ‬ور ک ‪JJ‬لی در ب ‪JJ‬خش اول ب ‪JJ‬ه پ ‪JJ‬یاده‌س ‪JJ‬ازی م ‪JJ‬نطق‬
‫برنامه و در بخش دوم بیشتر به بخش گرافیکی پروژه خواهیم پرداخت‪.‬‬
‫
‬
‫ب‪J‬ازی ‪ candy crush‬ی‪J‬ک ب‪J‬ازی ت‪J‬ک ن‪J‬فره اس‪J‬ت ک‪J‬ه ش‪J‬ام‪J‬ل ی‪J‬ک ص‪J‬فحه‌ی م‪J‬رب‪J‬ع ش‪J‬کل ب‪J‬ا ت‪J‬عدادی ش‪J‬کالت رن‪J‬گی )‪ (candy‬داخ‪J‬ل آن‬
‫اس‪J‬ت‪ .‬در اب‪J‬تدا ص‪J‬فحه ب‪J‬ه ط‪J‬ور ت‪J‬صادف‪J‬ی ب‪J‬ا ش‪J‬کالت‌ه‪J‬ای‪J‬ی ب‪J‬ا ‪ 6‬رن‪J‬گ م‪J‬ختلف پ‪J‬ر م‪J‬ی‌ش‪J‬ود و ه‪J‬مچنین در ت‪J‬عدادی از خ‪J‬ان‪J‬ه‌ه‪J‬ا ژل‪J‬ه‌ه‪J‬ای‬
‫)‪ (jelly‬ش‪J‬یشه‌ای ش‪J‬کل ق‪J‬رار م‪J‬ی‌گ‪J‬یرد‪ .‬ای‪J‬ن ژل‪J‬ه‌ه‪J‬ا ب‪J‬ا ی‪J‬ک ی‪J‬ا دو ب‪J‬ار ت‪J‬رک‪J‬یدن ش‪J‬کالت در روی آن‪J‬ها از ب‪J‬ین م‪J‬ی‌رون‪J‬د‪ .‬ه‪J‬دف ب‪J‬ازی‪J‬کن آن‬
‫اس‪JJ‬ت ک‪JJ‬ه ب‪JJ‬ا ت‪JJ‬عداد م‪JJ‬شخصی ح‪JJ‬رک‪JJ‬ت‪ ،‬ای‪JJ‬ن ژل‪J‬ه‌ه‪JJ‬ا را از ب‪JJ‬ین ب‪JJ‬برد‪ .‬ه‪JJ‬ر ح‪JJ‬رک‪JJ‬ت از ت‪JJ‬غییر ج‪JJ‬ای دو ش‪JJ‬کالت و در ن‪JJ‬تیجه ک‪JJ‬نار ه‪JJ‬م ق‪JJ‬رار‬
‫گ‪J‬رف‪J‬نت ‪ 3‬ش‪J‬کالت ه‪J‬مرن‪J‬گ ب‪J‬ه ص‪J‬ورت اف‪J‬قی ی‪J‬ا ع‪J‬مودی و ی‪J‬ا ‪ 4‬ی‪J‬ا ‪ 5‬ش‪J‬کالت ب‪J‬ا ت‪J‬رت‪J‬یب م‪J‬شخص‪ ،‬ت‪J‬شکیل ش‪J‬ده اس‪J‬ت)ش‪J‬کل ‪ .(2‬ب‪J‬ا ک‪J‬نار‬
‫ه‪J‬م ق‪J‬رار گ‪J‬رف‪J‬نت ای‪J‬ن ش‪J‬کالت‌ه‪J‬ای ی‪J‬کرن‪J‬گ‪ ،‬ه‪J‬مه‌ی آن‌ه‪J‬ا از ب‪J‬ین م‪J‬ی‌رون‪J‬د)م‪J‬ی‌ت‪J‬رک‪J‬ند( و ش‪J‬کالت‌ه‪J‬ای دی‪J‬گر ب‪J‬ا ح‪J‬رک‪J‬ت از ب‪J‬االی ص‪J‬فحه ب‪J‬ه‬
‫س‪J‬مت پ‪J‬ای‪J‬ین ج‪J‬ای ای‪J‬ن ش‪J‬کالت‌ه‪J‬ا را پ‪J‬ر م‪J‬ی‌ک‪J‬نند‪ .‬ه‪J‬مچنین ش‪J‬کالت‌ه‪J‬ای ج‪J‬دی‪J‬دی ب‪J‬ا رن‪J‬گ‌ه‪J‬ای ت‪J‬صادف‪J‬ی از ب‪J‬االی ه‪J‬ر س‪J‬تون ب‪J‬رای پ‪J‬ر‬
‫ک‪JJ‬ردن ج‪JJ‬اه‪JJ‬ای خ‪JJ‬ال‪JJ‬ی وارد آن س‪JJ‬تون م ‪J‬ی‌ش‪JJ‬ون‪JJ‬د‪ .‬در ص‪JJ‬ورت‪JJ‬ی ک‪JJ‬ه ه‪JJ‬مان‪JJ‬ند ش‪JJ‬کل ‪ 2‬ت‪JJ‬رک‪JJ‬یب ب‪JJ‬یش از ‪ 3‬ش‪JJ‬کالت داش‪JJ‬ته ب‪JJ‬اش‪JJ‬یم در اث‪JJ‬ر‬
‫ترکیدن آن‌ها یک شکالت ترکیبی با توانمندی جدید تولید می‌شود که در بخش قابلیت‌ها بیان خواهد شد‪.‬‬
‫شکل ‪ .1‬ساختار کلی صفحه بازی ) شکل از بازی اصلی ‪ candy crush‬است (‬
‫شکل ‪ .2‬حرکت‌های متشکل از ‪ 4‬یا ‪ 5‬شکالت‬
‫قابلیت‌های مورد نظر پروژه درس
‬
‫در ای‪J‬ن پ‪J‬روژه پ‪J‬یاده س‪J‬ازی ت‪J‬مام‪J‬ی ق‪J‬اب‪J‬لیت ه‪J‬ای م‪J‬وج‪J‬ود در ب‪J‬ازی اص‪J‬لی ‪ candy crush‬م‪J‬د ن‪J‬ظر نیس‪J‬ت و ت‪J‬نها خ‪J‬واس‪J‬ته‌ه‪J‬ای‪J‬ی م‪J‬د‬
‫ن‪JJ‬ظر اس‪JJ‬ت ک‪JJ‬ه در م‪JJ‬نت پ‪JJ‬روژه ذک‪JJ‬ر ش‪JJ‬ون‪JJ‬د‪ .‬ح‪JJ‬ال آن‪JJ‬که پ‪JJ‬یاده‌س‪JJ‬ازی ق‪JJ‬اب‪JJ‬لیت‌ه‪JJ‬ای داوط‪JJ‬لبان‪JJ‬ه ن‪JJ‬مره اض‪JJ‬اف‪JJ‬ی ب‪JJ‬ه ه‪JJ‬مراه خ‪JJ‬واه‪JJ‬د داش‪JJ‬ت‪ .‬در‬
‫اینجا نکات مهم در مورد فهم بهتر قابلیت‌های مورد نظر در قسمت‌های مختلف صورت پروژه ذکر می‌شوند‪.‬‬
‫
‬
‫ن‪J‬کته ‪ :1‬ب‪J‬ه ی‪J‬ک ح‪J‬رک‪J‬ت ک‪J‬ه منج‪J‬ر ب‪J‬ه ه‪J‬م‌ردی‪J‬ف ک‪J‬ردن ‪ 3‬ی‪J‬ا ت‪J‬عداد بیش‪J‬تری ش‪J‬کالت و ی‪J‬ا ت‪J‬ول‪J‬ید ش‪J‬کالت ت‪J‬رک‪J‬یبی ش‪J‬ود ت‪J‬طبیق م‪J‬ی‌گ‪J‬وی‪J‬یم‬
‫)‪.(matching‬‬
‫
‬
‫ن ‪JJ‬کته ‪ :2‬از ای ‪JJ‬ن پ ‪JJ‬س ان ‪JJ‬واع ش ‪JJ‬کالت را س ‪JJ‬اده و ی ‪JJ‬ا ت ‪JJ‬رک ‪JJ‬یبی م‪J J‬ی‌ن ‪JJ‬ام ‪JJ‬یم و ن ‪JJ‬وع ش ‪JJ‬کالت ت ‪JJ‬رک ‪JJ‬یبی را ب ‪JJ‬ر اس ‪JJ‬اس ش ‪JJ‬کل ش ‪JJ‬ماره ‪،2‬‬
‫ش ‪JJ‬ماره‌ده ‪JJ‬ی م ‪J‬ی‌ک ‪JJ‬نیم‪ .‬پ ‪JJ‬س ب ‪JJ‬رای م ‪JJ‬ثال ش ‪JJ‬کالت ت ‪JJ‬رک ‪JJ‬یبی م ‪JJ‬تشکل از ‪ 4‬ش ‪JJ‬کالت در ی ‪JJ‬ک س ‪JJ‬طر ی ‪JJ‬ا س ‪JJ‬تون را ش ‪JJ‬کالت ت ‪JJ‬رک ‪JJ‬یبی ن ‪JJ‬وع ‪1‬‬
‫می‌نامیم‪.‬‬
‫نکته ‪ :3‬شکالت ترکیبی نوع ‪ 1‬در صورتی که با شکالت‌های همرنگ خود در یک ردیف قرار گیرد بسته به اینکه در ابتدا از ‪4‬‬
‫شکالت افقی تشکل شده است و یا عمودی‪ ،‬تمام ردیف افقی یا عمودی خود را از بین می‌برد‪
.‬‬
‫شکالت ترکیبی نوع ‪ 2‬را تنها می‌توانید با شکالت های ساده جابجا کنید که در این صورت تمامی شکالت‌های با آن رنگ را‬
‫در کل صفحه از بین می‌برد‪
.‬‬
‫با شکالت ترکیبی نوع ‪ 3‬نیز مانند نوع ‪ 1‬درست مانند یک شکالت ساده برخورد کنید با این تفاوت که در صورت تطبیق‪ ،‬یک‬
‫مربع به ضلع ‪ 3‬و به مرکز خود را از بین می‌برد‪.‬‬
‫
‬
‫ن‪J‬کته ‪ :4‬در ق‪J‬وان‪J‬ین اص‪J‬لی ب‪J‬ازی ب‪J‬ا ج‪J‬اب‪J‬جا ک‪J‬ردن دو ش‪J‬کالت ت‪J‬رک‪J‬یبی ب‪J‬ا ی‪J‬کدی‪J‬گر ق‪J‬درت بیش‪J‬تری ت‪J‬ول‪J‬ید م‪J‬ی‌ش‪J‬ود ک‪J‬ه م‪J‬ا در ای‪J‬نجا از‬
‫ای‪JJ‬ن ب‪JJ‬خش ص‪JJ‬رف ن‪JJ‬ظر ک‪JJ‬رده‌ای‪JJ‬م‪ .‬ب‪JJ‬ناب‪JJ‬رای‪JJ‬ن ج‪JJ‬اب‪JJ‬جای‪JJ‬ی دو ش‪JJ‬کالت ت‪JJ‬رک‪JJ‬یبی در ص‪JJ‬ورت‪JJ‬ی ک‪JJ‬ه ب‪JJ‬ه ص‪JJ‬ورت ع‪JJ‬ادی ب‪JJ‬ا ش‪JJ‬کالت‌ه‪JJ‬ای ه‪JJ‬مرن‪JJ‬گ‬
‫خ‪J‬ود ت‪J‬طبیق ک‪J‬نند ات‪J‬فاق خ‪J‬واه‪J‬د اف‪J‬تاد‪ .‬در م‪J‬ورد ش‪J‬کالت ت‪J‬رک‪J‬یبی ن‪J‬وع ‪ 2‬آن را م‪J‬ی‌ت‪J‬وان‪J‬ید ب‪J‬ا ه‪J‬ر رن‪J‬گی ب‪J‬ه ج‪J‬ز ب‪J‬ا ی‪J‬ک ش‪J‬کالت ت‪J‬رک‪J‬یبی‬
‫جابجا کنید‪.‬‬
‫نکته ‪ :5‬ترتیب از بین بردن شکالت‌ها در صورتی که چندین ترتیب مختلف وجود داشته باشد دلخواه است‪.‬‬
‫
‬
‫ن‪J‬کته ‪ :6‬در ه‪J‬ر م‪J‬رح‪J‬له از ب‪J‬ازی در ص‪J‬ورت‪J‬ی ک‪J‬ه خ‪J‬طای‪J‬ی در ورودی رخ داد ب‪J‬ای‪J‬دآن را ش‪J‬ناس‪J‬ای‪J‬ی ک‪J‬نید و ب‪J‬ا پ‪J‬یام م‪J‬ناس‪J‬ب ب‪J‬ه ک‪J‬ارب‪J‬ر‬
‫اطالع دهید اما بازی را به پایان نرسانید )برای مثال درخواست جابجایی دو خانه که در کنار هم نیستند(‪.‬‬
‫جدول بازی
‬
‫ب‪J‬رای پ‪J‬یاده‌س‪J‬ازی ب‪J‬ازی ن‪J‬یاز داری‪J‬م ک‪J‬ه اط‪J‬الع‪J‬ات خ‪J‬ان‪J‬ه‌ه‪J‬ای ج‪J‬دول را ب‪J‬ه گ‪J‬ون‪J‬ه‌ای ذخ‪J‬یره ک‪J‬نیم‪ .‬ب‪J‬رای م‪J‬ثال رن‪J‬گ ش‪J‬کالت م‪J‬وج‪J‬ود در ه‪J‬ر‬
‫خ‪JJ‬ان‪JJ‬ه‪ ،‬م‪JJ‬کان و ن‪JJ‬وع ژل ‪J‬ه‌ه‪JJ‬ا و ن‪JJ‬وع ش‪JJ‬کالت م‪JJ‬وج‪JJ‬ود در ه‪JJ‬ر خ‪JJ‬ان‪JJ‬ه ) ب‪JJ‬ه ش‪JJ‬کل ‪ 2‬دق‪JJ‬ت ک‪JJ‬نید(‪.‬ه‪JJ‬ر ک‪JJ‬دام از ای‪JJ‬ن وی‪JJ‬ژگ ‪J‬ی‌ه‪JJ‬ا را م ‪J‬ی‌ت‪JJ‬وان در‬
‫م‪JJ‬تغیره‪JJ‬ای‪JJ‬ی از ن‪JJ‬وع لیس‪JJ‬ت دو ب‪JJ‬عدی ذخ‪JJ‬یره ک‪JJ‬نید‪ .‬از آن‪JJ‬جای‪JJ‬ی ک‪JJ‬ه ت‪JJ‬واب‪JJ‬عی ک‪JJ‬ه ب‪JJ‬عدا ت‪JJ‬عری‪JJ‬ف خ‪JJ‬واه‪JJ‬ند ش‪JJ‬د ب‪JJ‬ه ه‪JJ‬مه‌ی ای‪JJ‬ن م‪JJ‬تغیره‪JJ‬ا ن‪JJ‬یاز‬
‫خواهند داشت‪ ،‬این متغیرها را ‪ global‬تعریف کنید‪
.‬‬
‫در زی‪J‬ر ن‪J‬مون‪J‬ه‌ای از م‪J‬تغیره‪J‬ای الزم را م‪J‬شاه‪J‬ده م‪J‬ی‌ک‪J‬نید‪ .‬ال‪J‬بته ش‪J‬ما در ط‪J‬ول پ‪J‬روژه ن‪J‬یاز ب‪J‬ه ت‪J‬غییر ی‪J‬ا اض‪J‬اف‪J‬ه ک‪J‬ردن ب‪J‬ه ای‪J‬ن م‪J‬تغیره‪J‬ا‬
‫خواهید داشت‪.‬‬
‫در ای‪J‬ن ک‪J‬د م‪J‬تغیر اول س‪J‬ای‪J‬ز ج‪J‬دول م‪J‬رب‪J‬عی ش‪J‬کل را ذخ‪J‬یره م‪J‬یکند‪ .‬م‪J‬تغیر دوم ج‪J‬دول ب‪J‬ازی ش‪J‬ام‪J‬ل رن‪J‬گ ش‪J‬کالت خ‪J‬ان‪J‬ه‌ه‪J‬ای م‪J‬ختلف و‬
‫م‪JJ‬تغیر س‪JJ‬وم ن‪JJ‬وع ش‪JJ‬کالت م‪JJ‬وج‪JJ‬ود در ه‪JJ‬ر خ‪JJ‬ان‪JJ‬ه را ذخ‪JJ‬یره م‪JJ‬یکند‪ .‬رن‪JJ‬گها و ن‪JJ‬وع‌ه‪JJ‬ا را م ‪J‬ی‌ت‪JJ‬وان‪JJ‬ید ب‪JJ‬ه اع‪JJ‬داد نس‪JJ‬بت ده‪JJ‬ید ت‪JJ‬ا ب‪JJ‬ه س‪JJ‬ادگ‪JJ‬ی‬
‫آن‌ها را ذخیره کنید‪
.‬‬
‫
‬
‫ن‪JJ‬کته‪ :1‬ب ‪JJ‬رای ه ‪JJ‬مگون ‪JJ‬ی پ ‪JJ‬یاده‌س ‪JJ‬ازی پ ‪JJ‬روژه‌ه ‪JJ‬ا ف ‪JJ‬رض م ‪J‬ی‌ک ‪JJ‬نیم ک ‪JJ‬ه ب ‪JJ‬االت ‪JJ‬ری ‪JJ‬ن ردی ‪JJ‬ف اف ‪JJ‬قی ج ‪JJ‬دول ب ‪JJ‬دون ژل ‪JJ‬ه اس ‪JJ‬ت‪ .‬دوم ‪JJ‬ین ردی ‪JJ‬ف از‬
‫ژل‪J‬ه‌ه‪JJ‬ای‪JJ‬ی ک‪JJ‬ه ب‪JJ‬ا ی‪JJ‬ک ض‪JJ‬رب‪JJ‬ه از ب‪JJ‬ین م‪J‬ی‌رون‪JJ‬د و ردی‪JJ‬ف س‪JJ‬وم از ژل‪J‬ه‌ه‪JJ‬ای‪JJ‬ی ک‪JJ‬ه ب‪JJ‬ا دو ض‪JJ‬رب‪JJ‬ه از ب‪JJ‬ین م‪J‬ی‌رون‪JJ‬د ت‪JJ‬شکیل ش‪JJ‬ده اس‪JJ‬ت و ادام‪JJ‬ه‬
‫جدول با تکرار همین روند پر می‌شود‪.‬‬
‫تولید جدول تصادفی
‬
‫پیش از شروع بازی باید جدول بازی را ایجاد کرده و شکالت‌ها را به طور تصادفی در آن قرار دهید‪ .‬همچنین ژله‌ها را به‬
‫ترتیب ذکر شده در باال در صفحه قرار دهید‪ .‬بنابراین تابعی به شکل زیر بنویسید که اندازه جدول را گرفته و جدول بازی شما‬
‫را بسازد‪.‬‬
‫باید توجه کنید که در هنگامی که جدول اولیه را تولید می‌کنید هیچ سه شکالت یک رنگی به صورت عمودی و افقی در کنار هم‬
‫قرار نگرفته باشند‪ .‬برای این کار نیازمند تابع کمکی دیگری خواهید بود که در مراحل دیگر کار نیاز به کمک شما خواهد آمد‪.‬‬
‫تابع زیر به عنوان یک نمونه از چنین تابعی معرفی شده است‪ .‬این تابع با گرفنت یک سطر و یک ستون ) که یک خانه را‬
‫مشخص می‌کند ( می‌گوید که آیا این خانه در یک تطبیق وجود دارد یا خیر!‬
‫برای تولید جدول می‌توانید از یک گوشه شروع کنید و شکالت‌ها را قرار دهید و در صورتی که با قرار دادن یک شکالت جدید‬
‫یک تطبیق ایجاد کردید‪ ،‬آن شکالت را حذف و رنگ دیگری قرار دهید‪ .‬اگر برای یک خانه امکان قرار دادن هیچ رنگی وجود‬
‫نداشت عملیات پر کردن تصادفی خود را از ابتدا شروع کنید‪.‬‬
‫نمایش جدول
‬
‫برای نمایش جدول در خروجی‪ ،‬تابع زیر را پیاده‌سازی کنید‪.‬‬
‫پارامتر ورودی این تابع مشخص می‌کند که شما باید جدول حاوی شکالت‌ها را چاپ کنید و یا جدول حاوی نوع ژله‌ها را‬
‫نمایش دهید‪.‬‬
‫در حالت اول‪ ،‬یعنی جدول حاوی شکالت‌ها‪ ،‬برای چاپ ساده‌تر جدول کدینگ زیر را در نظر بگیرید‪.‬‬
‫با استفاده از این کدینگ برای جدول یک ماتریس از عالیم تولید کنید که برای هر شکالت رنگی کد رنگ آن را قرار دهد‪ .‬و در‬
‫صورتی که شکالت از نوع ترکیبی بود جلوی کد رنگ آن‪ ،‬عالمت مربوط به آن را قرار دهید‪ .‬دقت کنید که برای شکالت ترکیبی‬
‫نوع ‪ (@) 2‬نیازی به قرار دادن کد رنگ ندارید‪ .‬با این اوصاف جدول مربوط به شکل زیر به صورتی که میبینید نشان داده‬
‫خواهد شد‪.‬‬
‫شکل ‪ .3‬نمایش شکالت های یک جدول نمونه‬
‫در حالت دوم‪ ،‬یعنی جدول حاوی ژله‌ها‪ ،‬برای هر خانه در صورتی که ژله‌ای موجود نباشد عدد ‪ ،0‬در صورتی که ژله‌ای با‬
‫قابلیت از بین رفنت با ‪ 1‬ضربه وجود داشت عدد ‌‪ 1‬و در صورتی که ژله‌ای با قابلیت از بین رفنت با ‪ 2‬ضربه وجود داشت عدد‬
‫‪ 2‬را قرار می‌دهیم‪ .‬با توجه به روال ذکر شده برای قرار دادن ژله‌ها در بخش قابلیت‌ها‪ ،‬نمایش ژله‌های جدول سه در سه در‬
‫ابتدای بازی به شکل زیر خواهد بود‪:‬‬
‫شکل ‪ .4‬نمایش ژله‌های جدول سه در سه‬
‫انجام بازی
‬
‫در این مرحله باید تابعی را برای اجرای یک حرکت بازی پیاده‌سازی کنید‪ .‬تابع مادر مورد نظر به شکل زیر خواهد بود‪.‬‬
‫ای‪J‬ن ت‪J‬اب‪J‬ع س‪J‬طر و س‪J‬تون دو خ‪J‬ان‪J‬ه را ب‪J‬ه ع‪J‬نوان ورودی دری‪J‬اف‪J‬ت م‪J‬ی‌ک‪J‬ند و ج‪J‬ای ای‪J‬ن دو خ‪J‬ان‪J‬ه را در ج‪J‬دول ب‪J‬ا ی‪J‬کدی‪J‬گر ع‪J‬وض م‪J‬ی‌ک‪J‬ند‪.‬‬
‫ت‪J‬عوی‪J‬ض دو خ‪J‬ان‪J‬ه ت‪J‬نها در ص‪J‬ورت‪J‬ی م‪J‬مکن اس‪J‬ت ک‪J‬ه منج‪J‬ر ب‪J‬ه ی‪J‬ک تطبیق ش‪J‬ود و ه‪J‬مچنین دو خ‪J‬ان‪J‬ه ب‪J‬ای‪J‬د م‪J‬جاور ه‪J‬م‬
‫باشند یعنی یک ضلع مشترک داشته باشند‪
.‬‬
‫
‬
‫ه‪J‬نگام‪J‬ی ک‪J‬ه ت‪J‬عوی‪J‬ض ان‪J‬جام م‪J‬ی‌ش‪J‬ود ب‪J‬ای‪J‬د ت‪J‬مام‪J‬ی ت‪J‬غییرات ب‪J‬عدی ج‪J‬دول اع‪J‬مال ش‪J‬ود ت‪J‬ا زم‪J‬ان‪J‬ی ک‪J‬ه ج‪J‬دول ب‪J‬ه ح‪J‬ال‪J‬ت ث‪J‬اب‪J‬ت و غ‪J‬یر م‪J‬تغیر‬
‫ب‪J‬رس‪J‬د و ب‪J‬رای ح‪J‬رک‪J‬ت ب‪J‬عد آم‪J‬اده ش‪J‬ود‪ .‬ی‪J‬عنی ژل‪J‬ه‌ه‪J‬ای زی‪J‬ر خ‪J‬ان‪J‬ه‌ه‪J‬ای‪J‬ی ک‪J‬ه م‪J‬ی‌ت‪J‬رک‪J‬ند ب‪J‬ای‪J‬د ی‪J‬ا از ب‪J‬ین ب‪J‬رون‪J‬د ی‪J‬ا ژل‪J‬ه‌ه‪J‬ای دو ت‪J‬ای‪J‬ی ب‪J‬ه ژل‪J‬ه‌ی‬
‫ت‪JJ‬ک ض‪JJ‬رب ‪J‬ه‌ای ت‪JJ‬بدی‪JJ‬ل ش‪JJ‬ود و ه‪JJ‬مچنین ش‪JJ‬کالت‌ه‪JJ‬ای ب‪JJ‬االی‪JJ‬ی ب‪JJ‬ه پ‪JJ‬ای‪JJ‬ین ح‪JJ‬رک‪JJ‬ت ک‪JJ‬نند و ج‪JJ‬ای ش‪JJ‬کالت‌ه‪JJ‬ای از ب‪JJ‬ین رف‪JJ‬ته را پ‪JJ‬ر ک‪JJ‬نند و در‬
‫ص‪J‬ورت‪J‬ی ک‪J‬ه در ای‪J‬ن م‪J‬یان دوب‪J‬اره ت‪J‬طبیق ص‪J‬ورت گ‪J‬رف‪J‬ت ت‪J‬رک‪J‬یدن ش‪J‬کالت‌ه‪J‬ا ادام‪J‬ه پ‪J‬یدا م‪J‬ی‌ک‪J‬ند‪ .‬ب‪J‬رای ای‪J‬ن ک‪J‬ار اح‪J‬تماال ن‪J‬یاز داری‪J‬د ت‪J‬ا‬
‫حرکات الزم را انجام دهید و سپس روی خانه‌هایی که جدیدا پر شده‌اند تابع ‪ check_matching‬را صدا بزنید‪
.‬‬
‫
‬
‫ت ‪JJ‬وج ‪JJ‬ه ک ‪JJ‬نید ک ‪JJ‬ه ش ‪JJ‬کالت‌ه ‪JJ‬ای ‪JJ‬ی ن ‪JJ‬یز ب ‪JJ‬ای ‪JJ‬د ب ‪JJ‬ه ص ‪JJ‬ورت ت ‪JJ‬صادف ‪JJ‬ی ت ‪JJ‬ول ‪JJ‬ید ش ‪JJ‬ون ‪JJ‬د و از ب ‪JJ‬اال وارد ب ‪JJ‬ازی ش ‪JJ‬ون ‪JJ‬د ت ‪JJ‬ا س ‪JJ‬تون‌ه ‪JJ‬ا را پ ‪JJ‬ر ک ‪JJ‬نند‪ .‬ای ‪JJ‬ن‬
‫ش‪J‬کالت‌ه‪J‬ا ب‪J‬ای‪J‬د ب‪J‬ه ص‪J‬ورت‪J‬ی ب‪J‬اش‪J‬ند ک‪J‬ه ورود آن‌ه‪J‬ا ب‪J‬اع‪J‬ث ای‪J‬جاد ت‪J‬طبیق ن‪J‬شون‪J‬د‪ .‬ب‪J‬ناب‪J‬رای‪J‬ن م‪J‬ی‌ت‪J‬وان‪J‬ید م‪J‬راح‪J‬ل پ‪J‬اراگ‪J‬راف ق‪J‬بل را ب‪J‬ه ط‪J‬ور‬
‫ک‪JJ‬ام‪JJ‬ل ان‪JJ‬جام ده‪JJ‬ید ت‪JJ‬ا دی‪JJ‬گر ت‪JJ‬طبیقی وج‪JJ‬ود ن‪JJ‬داش‪JJ‬ته ب‪JJ‬اش‪JJ‬د‪ ،‬س‪JJ‬پس ش‪JJ‬کالت‌ه‪JJ‬ای ج‪JJ‬دی‪JJ‬د را ط‪JJ‬وری وارد ک‪JJ‬نید ک‪JJ‬ه ب‪JJ‬از ه‪JJ‬م ب‪JJ‬اع‪JJ‬ث ت‪JJ‬طبیق‬
‫نشوند‪.‬‬
‫پ‪J‬س از ه‪J‬ر ب‪J‬ار ف‪J‬راخ‪J‬وان‪J‬ی ای‪J‬ن ت‪J‬اب‪J‬ع و پ‪J‬ای‪J‬ان ک‪J‬ار آن‪ ،‬ب‪J‬ای‪J‬د چ‪J‬ک ک‪J‬نید ک‪J‬ه آی‪J‬ا ه‪J‬نوز ام‪J‬کان ح‪J‬رک‪J‬ت در ص‪J‬فحه وج‪J‬ود دارد ی‪J‬ا خ‪J‬یر‪ .‬ای‪J‬ن‬
‫ک‪J‬ار ب‪J‬ای‪J‬د ت‪J‬وس‪J‬ط ت‪J‬اب‪J‬ع زی‪J‬ر ص‪J‬ورت پ‪J‬ذی‪J‬رد‪ .‬در ص‪J‬ورت‪J‬ی ک‪J‬ه ح‪J‬رک‪J‬ت دی‪J‬گری م‪J‬مکن ن‪J‬باش‪J‬د ت‪J‬اب‪J‬ع م‪J‬قدار ‪ -1‬را ب‪J‬از م‪J‬یگردان‪J‬د و پ‪J‬یغام زی‪J‬ر را‬
‫چاپ میکند‪.‬‬
‫!‪The board is refreshing‬‬
‫در این صورت باید صفحه از نو ساخته شود‪ ،‬یعنی شکالت‌ها باید دوباره به طور تصادفی در صفحه چیده شوند‪ .‬اما ژله‌ها‬
‫تغییر نمی‌کنند و به همان صورت قبلی باقی می‌مانند‬
‫همچنین در هر مرحله از بازی باید چک کنید که آیا همه‌ی ژله‌ها از بین رفته‌اند یا خیر و آیا سقف حرکات مجاز به پایان‬
‫رسیده است یا خیر‪ .‬به این منظور تابع زیر را پیاده‌سازی کنید‪ .‬این تابع مشخص می‌کند که آیا کاربر برنده شده‪ ،‬بازی ادامه‬
‫دارد و یا کاربر بازنده شده‪
.‬‬
‫در صورتی که تمام ژله‌ها از بین رفته بود و حرکات انجام شده از سقف حرکات مجاز تجاوز نکرده بود کاربر برنده شده است‬
‫و تابع مقدار ‪ 1‬را بر می‌گرداند‪ .‬در صورتی که سقف حرکات مجاز به پایان رسیده بود و ژله‌ای باقی بود کاربر بازنده شده و‬
‫تابع مقدار ‪ 1-‬را برمی‌گراند‪ .‬در غیر این صورت بازی همچنان ادامه دارد و تابع مقدار ‪ 0‬را برمی‌گرداند‪.‬‬
‫اجرای بازی‬
‫در این قسمت باید تابع‌های پیاده‌سازی شده خود را به ترتیب صدا بزنید تا بازی انجام شود‪ .‬کد بازی در تابعی به شکل زیر‬
‫قرار میگیرد‪.‬‬
‫در این تابع شما باید در ابتدا دو عدد از ورودی بخوانید که به ترتیب نمایانگر سایز صفحه و تعداد حرکات ممکن خواهد بود‪.‬‬
‫به این صورت‪:‬‬
‫>‪<size> <moves‬‬
‫برای مثال‪ 8 30 :‬که نشان می‌دهد صفحه بازی صفحه‌ای مربعی ‪ 8‬در ‪ 8‬می‌باشد و کاربر حداکثر ‪ 30‬حرکت می‌تواند‬
‫انجام دهد تا تمام ژله‌ها را از بین ببرد‪.‬‬
‫حال صفحه‌ی خود را به صورت تصادفی تولید کنید و بعد از آن تا تمام شدن بازی دستورات را از کاربر بگیرید‪
.‬‬
‫دستورات در قالب زیر وارد می‌شوند‪:‬‬
‫>‪<row> <col>,<row> <col‬‬
‫بنابراین کاربر با وارد کردن دستور ‪ 1 2,2 1‬می خواهد که جای خانه موجود در سطر ‪ 1‬و ستون ‪ 2‬را با خانه سطر ‪ 2‬و‬
‫ستون ‪ 1‬عوض کند‪ ) .‬که البته این حرکت مجاز نیست چون ضلع مشترک ندارند (‬
‫
‬
‫بعد از هر بار ورود دستور باال باید تعداد حرکات باقی مانده و جدول‌های وضعیت بازی چاپ شود ) ابتدا تعداد حرکات‬
‫باقی‌مانده چاپ شود‪ ،‬سپس جدول شکالت‌ها و سپس جدول ژله‌ها (‪ .‬برای مثال اگر صفحه بازی ‪ ۴‬در ‪ ۴‬باشد در هر مرحله‬
‫داریم‪:‬‬
‫
‪23‬‬
‫
‪P @ R G‬‬
‫
‪B O P= B‬‬
‫
‪G B! R R‬‬
‫
‪G G R R‬‬
‫
‪0 0 0 0‬‬
‫
‪0 0 1 1‬‬
‫
‪0 1 1 2‬‬
‫
‪0 0 0 0‬‬
‫و پس از آن‪ ،‬در صورتی که دستور وارد شده معتبر نبوده بود عبارت زیر در خط بعد از جدول ژله‌ها چاپ شود‪:‬‬
‫!‪Invalid Command‬‬
‫همچنین در صورتی که تعداد حرکات بازیکن تمام شود و تمام ژله‌ها از بین نرفته باشد عبارت زیر چاپ می‌شود‪:‬‬
‫!‪You Lost‬‬
‫و در صورت برنده شدن عبارت زیر چاپ شود‪:‬‬
‫!‪You Won‬‬
‫بعد از چاپ هر یک از دو عبارت باال برنامه را تمام کنید‪.‬‬
‫عیدتون مبارک ‪:‬دی‬
‫موفق باشید‬