python-project-V2.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‬ل آن‬
‫اس ‪JJ‬ت‪ .‬در اب ‪JJ‬تدا ص ‪JJ‬فحه ب ‪JJ‬ه ط ‪JJ‬ور ت ‪JJ‬صادف ‪JJ‬ی ب ‪JJ‬ا ش ‪JJ‬کالت‌ه ‪JJ‬ای ‪JJ‬ی ب ‪JJ‬ا ‪ 6‬رن ‪JJ‬گ م ‪JJ‬ختلف پ ‪JJ‬ر م ‪J‬ی‌ش ‪JJ‬ود‪ .‬ه ‪JJ‬مچنین ب ‪JJ‬عضی از خ ‪JJ‬ان ‪J‬ه‌ه ‪JJ‬ا ش ‪JJ‬ام ‪JJ‬ل‬
‫ژل‪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‬ان ‪J‬ه‌ی خ ‪JJ‬ود م ‪J‬ی‌ب ‪JJ‬اش ‪JJ‬ند ام ‪JJ‬ا ش ‪JJ‬کالت‌ه ‪JJ‬ا در م ‪JJ‬یان خ ‪JJ‬ان ‪J‬ه‌ه ‪JJ‬ا ج ‪JJ‬ا ب ‪JJ‬ه ج ‪JJ‬ا م ‪J‬ی‌ش ‪JJ‬ون ‪JJ‬د (‪ .‬ه ‪JJ‬دف ب ‪JJ‬ازی ‪JJ‬کن آن اس ‪JJ‬ت ک ‪JJ‬ه ب ‪JJ‬ا ت ‪JJ‬عداد‬
‫ِ‬
‫‪J‬کالت م‪J‬جاور ه‪J‬م‪ ،‬ک‪J‬ه در ن‪J‬تیجه‌ی آن ‪ 3‬ی‪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‬مچنین ش‪JJ‬کالت‌ه‪JJ‬ای ج‪JJ‬دی‪JJ‬دی ب‪JJ‬ا رن ‪J‬گ‌ه‪JJ‬ای ت‪JJ‬صادف‪JJ‬ی از ب‪JJ‬االی ه‪JJ‬ر س‪JJ‬تون ب‪JJ‬رای پ‪JJ‬ر ک‪JJ‬ردن ج‪JJ‬اه‪JJ‬ای خ‪JJ‬ال‪JJ‬ی وارد آن س‪JJ‬تون‬
‫م‪J‬ی‌ش‪J‬ون‪J‬د‪ .‬در ص‪J‬ورت‪J‬ی ک‪J‬ه ه‪J‬مان‪J‬ند )ش‪J‬کل ‪ (2‬ت‪J‬رک‪J‬یب ب‪J‬یش از ‪ 3‬ش‪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‬ده اگ‪JJ‬ر ب‪JJ‬عدا در ت‪JJ‬طبیق ق‪JJ‬رار ب‪JJ‬گیرد ی‪JJ‬ا ب‪JJ‬ه ن‪JJ‬وع‪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‬د‬
‫ن‪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‬خواه ‪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‬اج‬
‫و هم به صورت حضوری نمره دهی خواهد شد‪.‬‬
‫در اینجا نکات مهم در مورد فهم بهتر قابلیت‌های مورد نظر در قسمت‌های مختلف صورت پروژه ذکر می‌شوند‪.‬‬
‫
‬
‫ن‪MM‬کته ‪ :1‬ب‪JJ‬ه ی‪JJ‬ک ح‪JJ‬رک‪JJ‬ت ک‪JJ‬ه منج‪JJ‬ر ب‪JJ‬ه ه ‪J‬م‌ردی‪JJ‬ف ی‪JJ‬ا ه ‪J‬م‌س‪JJ‬تون ک‪JJ‬ردن ‪ 3‬ی‪JJ‬ا ت‪JJ‬عداد بیش‪JJ‬تری ش‪JJ‬کالت و ی‪JJ‬ا ت‪JJ‬ول‪JJ‬ید ش‪JJ‬کالت ت‪JJ‬رک‪JJ‬یبی ش‪JJ‬ود‬
‫تطبیق می‌گوییم )‪.(matching‬‬
‫
‬
‫ن ‪MM‬کته ‪ :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‬بر خالف نوع ‪ 1‬و ‪ 3‬اصال رنگ ندارد که بتواند در تطبیق قرار بگیرد‪ ،‬بلکه نوع خاصی از شکالت است‬
‫که تنها می‌تواند با شکالت های ساده ی مجاور خود جابجا شود‪ .‬که در صورت جا به جایی یک حرکات مجاز صورت گرفته‬
‫و تمامی شکالت‌های با آن رنگ را در کل صفحه از بین می‌برد‪
.‬‬
‫شکالت ترکیبی نوع ‪ 3‬نیز مانند نوع ‪ 1‬است با این تفاوت که در صورتی که در یک تطبیق با شکالت‌های هم‌رنگ خود قرار‬
‫بگیرد‪ ،‬یک مربع به ضلع ‪ 3‬و به مرکز خود را از بین می‌برد‪.‬‬
‫
‬
‫ن‪M‬کته ‪ :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‬گر در ه‪M‬ر ص‪M‬ورت‪M‬ی ی‪M‬ک ح‪M‬رک‪M‬ت غ‪M‬یر م‪M‬جاز اس‪M‬ت و ن‪JJ‬می‌ت‪JJ‬وان‪JJ‬د ان‪JJ‬جام ب‪JJ‬شود‪ ،‬ح‪JJ‬تی اگ‪JJ‬ر‬
‫ب‪JJ‬اع‪JJ‬ث ت‪JJ‬طبیق ش‪JJ‬ود‪ .‬ش‪JJ‬کالت ت‪JJ‬رک‪JJ‬یبی ن‪JJ‬وع ‪ 2‬ه‪JJ‬م ه‪JJ‬مان‪JJ‬طور ک‪JJ‬ه ذک‪JJ‬ر ش‪JJ‬د ت‪JJ‬نها م ‪J‬ی‌ت‪JJ‬وان‪JJ‬د ب‪JJ‬ا ش‪JJ‬کالت‪JJ‬ی س‪JJ‬اده ج‪JJ‬اب‪JJ‬جا ش‪JJ‬ود ن‪JJ‬ه ش‪JJ‬کالت‬
‫ترکیبی‪.‬‬
‫ن‪MM‬کته ‪ :5‬ت ‪JJ‬رت ‪JJ‬یب از ب ‪JJ‬ین ب ‪JJ‬ردن ش ‪JJ‬کالت‌ه ‪JJ‬ا در ص ‪JJ‬ورت ‪JJ‬ی ک ‪JJ‬ه چ ‪JJ‬ندی ‪JJ‬ن ت ‪JJ‬رت ‪JJ‬یب م ‪JJ‬ختلف وج ‪JJ‬ود داش ‪JJ‬ته ب ‪JJ‬اش ‪JJ‬د دل ‪JJ‬خواه اس ‪JJ‬ت و ت ‪JJ‬فاوت ‪JJ‬ی در‬
‫خروجی ایجاد نمی‌کند‪.‬‬
‫
‬
‫ن‪M‬کته ‪ :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‬ه ک‪J‬ه در ک‪J‬نار‬
‫هم نیستند یا درخواست انجام یک حرکت غیرمجاز (‪.‬‬
‫عوامل تصادفی ) ‪
( random‬‬
‫ما در طول بازی در بخش‌های مختلف از عوامل تصادفی مختلفی استفاده می‌کنیم‪ .‬برای مثال هنگامی که جدول اولیه بازی‬
‫را ایجاد می‌کنیم یا در طول بازی رنگ شکالت‌هایی که وارد صفحه بازی می‌شوند تصادفی هستند‪ .‬بنابراین برای اینکه‬
‫خروجی تمام پروژه‌ها شبیه هم شوند نیاز داریم که اعداد تصادفی تولید شده برای همه یکسان باشد‪ ) .‬بنابراین آنقدر هم‬
‫تصادفی نیستند!! ( برای این منظور قوانین زیر را توضیح می‌دهیم که شما باید حتما آن‌ها را در پروژه خود رعایت کنید‪ ،‬در‬
‫غیر این صورت جاج به شما نمره صفر خواهد داد چرا که خروجیتان با خروجی مطلوب تفاوت دارد‪.‬‬
‫برای تولید اعداد رندم خط زیر را به اولین خط برنامه خود اضافه کنید‪:‬‬
‫ادامه‌ی توضیحات در ادامه پروژه داده خواهد شد‪.‬‬
‫جدول بازی
‬
‫ب‪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‬کل ‪ 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‬یاز‬
‫خواهند داشت‪ ،‬این متغیرها را ‪ 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‬ا‬
‫خواهید داشت‪
.‬‬
‫ه ‪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‬داد‬
‫ت‪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‬ختلف‪،‬‬
‫متغیر سوم جدول تعداد ژله‌های باقی مانده در هر خانه و متغیر چهارم نوع شکالت موجود در هر خانه را ذخیره می‌کند‪
.‬‬
‫
‬
‫ن‪MM‬کته‪ :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‬ه‬
‫جدول با تکرار همین روند پر می‌شود‪.‬‬
‫تولید جدول تصادفی
‬
‫پیش از شروع بازی باید جدول بازی را ایجاد کرده و شکالت‌ها را به طور تصادفی در آن قرار دهید‪ .‬همچنین ژله‌ها را به‬
‫ترتیب ذکر شده در باال در صفحه قرار دهید‪ .‬بنابراین تابعی به شکل زیر بنویسید که جدول بازی شما را به طور ‪ random‬و‬
‫با اندازه ‪ size‬که یک متغیر ‪ global‬است بسازد‪.‬‬
‫باید توجه کنید که در هنگامی که جدول اولیه را تولید می‌کنید هیچ سه شکالت یک رنگی به صورت عمودی و افقی در کنار هم‬
‫قرار نگرفته باشند‪ .‬برای این کار نیازمند تابع کمکی دیگری خواهید بود که در مراحل دیگر کار نیز به کمک شما خواهد آمد‪.‬‬
‫تابع زیر به عنوان یک نمونه از چنین تابعی معرفی شده است‪ .‬این تابع با گرفنت یک سطر و یک ستون ) که یک خانه را‬
‫مشخص می‌کند ( می‌گوید که آیا این خانه در یک تطبیق وجود دارد یا خیر!‬
‫حال برای تولید جدول باید به صورت زیر عمل کنید‪:‬‬
‫ابتدا ‪ ۶‬رنگی که شکالت‌ها می‌توانند داشته باشند را دقیقا به صورت زیر تعریف کنید‪:‬‬
‫بنابراین درایه شماره ‪ 0‬رنگ قرمز ) ‪ ،( R‬درایه شماره ‪ 1‬رنگ آبی ) ‪ .… ،( B‬و درایه شماره ‪ 5‬رنگ زرد ) ‪ ( Y‬می‌باشد‪.‬‬
‫همچنین در ابتدای برنامه خط زیر را اضافه کنید‪ .‬این خط برای یکسان سازی اعداد تصادفی میان تمام پروژه‌ها الزامی‬
‫می‌باشد‪:‬‬
‫حال از خانه‌ی باال سمت چپِ صفحه‌ی بازی خود شروع کنید و رنگ شکالت خانه‌های ردیف اول را یکی یکی از چپ به راست‬
‫مشخص کنید‪ .‬سپس ردیف دوم و به همین ترتیب تا آخر‪ .‬رنگ هر خانه را با استفاده از دستور زیر بدست می‌آوریم‪:‬‬
‫
‬
‫این تابع یک عدد بین صفر تا پنج تولید می‌کند که از آن به عنوان درایه‌ی لیست ‪ colors‬استفاده می‌کنیم و رنگ شکالت را‬
‫بدست می‌آوریم‪.‬‬
‫توجه کنید همانطور که ذکر شد هر خانه‌ای که رنگ شکالتش مشخص می‌شود نباید باعث ایجاد تطبیق بشود‪ .‬بنابراین اگر‬
‫رنگ تعیین شده برای یک خانه باعث ایجاد تطبیق شد‪ ،‬باید دوباره تابع رندم باال را فراخوانی کنید تا یک رنگ ) عدد ( دیگر‬
‫انتخاب کند و این عمل را آنقدر تکرار کنید تا رنگ انتخاب شده باعث تطبیق نشود‪ ،‬سپس سراغ خانه بعدی بروید‪.‬‬
‫نمایش جدول
‬
‫برای نمایش جدول در خروجی‪ ،‬تابع زیر را پیاده‌سازی کنید‪.‬‬
‫شما باید در این تابع تمام اطالعات بازی شامل تعداد حرکات باقی مانده ) یک عدد (‪ ،‬وضعیت شکالت‌ها ) یک جدول ‬
‫دو بعدی از کاراکترهای موجود در لیست ‪ colors‬که رنگ شکالت هر خانه را مشخص می‌کند ( و وضعیت ژله‌ها ) یک جدول‬
‫دو بعدی از اعداد که تعداد ژله‌های باقی مانده در هر خانه را مشخص می‌کند ( را نمایش دهید‪.‬‬
‫برای جدول حاوی شکالت‌ها‪ ،‬برای چاپ ساده‌تر جدول کدینگ زیر را در نظر بگیرید‪.‬‬
‫با استفاده از این کدینگ برای جدول یک ماتریس از عالیم تولید کنید که برای هر شکالت رنگی کد رنگ آن را قرار دهد‪ .‬و در‬
‫صورتی که شکالت از نوع ترکیبی بود جلوی کد رنگ آن‪ ،‬عالمت مربوط به آن را قرار دهید‪ .‬دقت کنید که برای شکالت ترکیبی‬
‫نوع ‪ (@) 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‬ند‪.‬‬
‫ت‪M‬عوی‪M‬ض دو خ‪M‬ان‪M‬ه ت‪M‬نها در ص‪M‬ورت‪M‬ی م‪M‬مکن اس‪M‬ت ک‪M‬ه منج‪M‬ر ب‪M‬ه ی‪M‬ک تطبیق ش‪M‬ود و ه‪M‬مچنین دو خ‪M‬ان‪M‬ه ب‪M‬ای‪M‬د م‪M‬جاور ه‪M‬م‬
‫باشند یعنی یک ضلع مشترک داشته باشند‪ .‬در غیر این صورت حرکت غیر مجاز است و نباید انجام ‌شود‪
.‬‬
‫
‬
‫ه‪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‬ر ک‪JJ‬نند و در ص‪JJ‬ورت‪JJ‬ی ک‪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‬جام ده‪JJ‬ید و س‪JJ‬پس روی خ‪JJ‬ان‪J‬ه‌ه‪JJ‬ای‪JJ‬ی ک‪JJ‬ه ج‪JJ‬دی‪JJ‬دا پ‪JJ‬ر ش‪JJ‬ده‌ان‪JJ‬د ت‪JJ‬اب‪JJ‬ع ‪ check_matching‬را‬
‫صدا بزنید‪.‬‬
‫ب‪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‬ای‬
‫خ‪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‬شون‪J‬د‪ .‬ب‪J‬ناب‪J‬رای‪J‬ن دق‪M‬یقا م‪M‬ان‪M‬ند ب‪M‬خش ق‪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‬ا خ‪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‬ر ن‪JJ‬توان‪JJ‬د ح‪JJ‬رک‪JJ‬ت ک‪JJ‬ند! (‪ .‬ای‪JJ‬ن ک‪JJ‬ار ب‪JJ‬ای‪JJ‬د ت‪JJ‬وس‪JJ‬ط ت‪JJ‬اب‪JJ‬ع زی‪JJ‬ر ص‪JJ‬ورت پ‪JJ‬ذی‪JJ‬رد‪ .‬در ص‪JJ‬ورت‪JJ‬ی ک‪JJ‬ه ح‪JJ‬رک‪JJ‬ت دی‪JJ‬گری‬
‫ممکن نباشد تابع مقدار ‪ -1‬را باز میگرداند و پیغام زیر را چاپ میکند‪.‬‬
‫!‪The board is refreshing‬‬
‫در این صورت باید صفحه از نو ساخته شود‪ ،‬یعنی شکالت‌ها باید دوباره به طور تصادفی در صفحه چیده شوند‪ .‬اما ژله‌ها‬
‫تغییر نمی‌کنند و به همان صورت قبلی باقی می‌مانند‬
‫
‬
‫همچنین در هر مرحله از بازی باید چک کنید که آیا همه‌ی ژله‌ها از بین رفته‌اند یا خیر و آیا سقف حرکات مجاز به پایان‬
‫رسیده است یا خیر‪ .‬به این منظور تابع زیر را پیاده‌سازی کنید‪ .‬این تابع مشخص می‌کند که آیا کاربر برنده شده‪ ،‬بازی ادامه‬
‫دارد و یا کاربر بازنده شده‪
.‬‬
‫در صورتی که تمام ژله‌ها از بین رفته بود و حرکات انجام شده از سقف حرکات مجاز تجاوز نکرده بود کاربر برنده شده است‬
‫و تابع مقدار ‪ 1‬را بر می‌گرداند‪ .‬در صورتی که سقف حرکات مجاز به پایان رسیده بود و ژله‌ای باقی بود کاربر بازنده شده و‬
‫تابع مقدار ‪ 1-‬را برمی‌گراند‪ .‬در غیر این صورت بازی همچنان ادامه دارد و تابع مقدار ‪ 0‬را برمی‌گرداند‪.‬‬
‫نکات شکالت‌های ترکیبی‬
‫نکته ‪ :۱‬همانطور که بیان شد ‪ ۳‬نوع شکالت ترکیبی داریم که شکالت ترکیبی نوع ‪ ۱‬خود از دو نوع افقی و عمودی تشکیل‬
‫شده است‪.‬‬
‫شکالت ترکیبی نوع ‪ ۱‬از نوع افقی ) = ( درصورتی به وجود می‌آید که ‪ ۴‬شکالت در یک ردیف افقی باعث تطبیق شوند‪.‬‬
‫شکالت ترکیبی نوع ‪ ۱‬از نوع افقی ) ! ( نیز از تطبیق ‪ ۴‬شکالت عمودی ایجاد می‌شود‪
.‬‬
‫شکالت ترکیبی نوع ‪ ۲‬از تطبیق ‪ ۵‬شکالت ) چه افقی و چه عمودی ( ایجاد می‌شود‪
.‬‬
‫شکالت ترکیبی نوع ‪ ( # ) ۳‬نیز در صورتی که همزمان ‪ ۲‬تطبیق یکی در راستای عمودی و یکی در راستای افقی اتفاق بیافتد‬
‫به وجود می‌آید‪.‬‬
‫اولویت ایجاد هم با شکالت‌های ترکیبی نوع ‪ ۱‬و ‪ ۲‬هست بعد شکالت ترکیبی نوع ‪ .۳‬برای مثال در شرایط زیر که هم نوع ‪۱‬‬
‫اتفاق افتاده هم نوع ‪ ،۳‬نوع ‪ ۱‬تولید می‌شود‪.‬‬
‫
‪R R R R‬‬
‫
‪R‬‬
‫‪R‬‬
‫نکته ‪: ۲‬هنگامی که جا به جایی منجر به تطبیق انجام می‌شود ) مثال یک تطبیق شامل ‪ ۴‬شکالت (‪ ،‬شکالت ترکیبی باید در‬
‫محل شکالتی که وارد تطبیق شده است ایجاد شود‪ .‬یعنی آن شکالتی که با ورودش باعث بروز تطبیق شده‪ .‬حال اگر شکالت‬
‫ترکیبی نوع ‪ ۱‬یا ‪ ۳‬بود‪ ،‬رنگش هم همان رنگ شکالت مورد نظر می‌شود و اگر شکالت ترکیبی نوع ‪ ۵‬ایجاد شود دیگر رنگ‬
‫ندارد‪.‬‬
‫نکته ‪ :۳‬در حالت کلی‪ ،‬وقتی یک جا به جایی انجام می شود‪ ،‬یکسری شکالت می‌ترکند و بعد شکالت‌های باقی مانده پایین‬
‫می‌آیند‪ ،‬حال همانطور که ذکر شد بعد از پایین آمدن این شکالت‌ها باز هم امکان ایجاد تطبیق وجود دارد که باید چک شود‪،‬‬
‫اگر تطبیقی که در این حالت رخ می‌دهد طوری باشد که بتواند شکالت ترکیبی ایجاد کند‪ ،‬برای ساده سازی پروژه نیازی به‬
‫ایجاد شکالت ترکیبی در این حالت نیست و شما می‌توانید به طور عادی شکالت‌ها را بترکانید‪.‬‬
‫اجرای بازی‬
‫در این قسمت باید تابع‌های پیاده‌سازی شده خود را به ترتیب صدا بزنید تا بازی انجام شود‪ .‬کد بازی در تابعی به شکل زیر‬
‫قرار میگیرد‪.‬‬
‫در این تابع شما باید در ابتدا دو عدد از ورودی بخوانید که به ترتیب نمایانگر سایز صفحه و تعداد حرکات ممکن خواهد بود‪.‬‬
‫به این صورت‪:‬‬
‫>‪<size> <moves‬‬
‫برای مثال‪ 8 30 :‬که نشان می‌دهد صفحه بازی صفحه‌ای مربعی ‪ 8‬در ‪ 8‬می‌باشد و کاربر حداکثر ‪ 30‬حرکت می‌تواند‬
‫انجام دهد تا تمام ژله‌ها را از بین ببرد‪.‬‬
‫حال صفحه‌ی خود را به صورت تصادفی تولید کنید و بعد از آن تا تمام شدن بازی دستورات را از کاربر بگیرید‪
.‬‬
‫دستورات در قالب زیر وارد می‌شوند‪:‬‬
‫>‪<row> <col>,<row> <col‬‬
‫بنابراین کاربر با وارد کردن دستور ‪ 1 2,2 1‬می خواهد که جای خانه موجود در سطر اول و ستون دوم را با خانه سطر دوم و‬
‫ستون اول عوض کند‪ ) .‬که البته این حرکت مجاز نیست چون ضلع مشترک ندارند (‪.‬‬
‫
‬
‫بعد از ورود دستور >‪ <size> <moves‬و همچنین بعد از هر بار ورود دستور باال ) چه مجاز چه غیر مجاز ( باید تعداد‬
‫حرکات باقی مانده و جدول‌های وضعیت بازی چاپ شود ) ابتدا تعداد حرکات باقی‌مانده چاپ شود‪ ،‬سپس جدول شکالت‌ها و‬
‫سپس جدول ژله‌ها (‪ .‬یعنی در حقیقت همان تابع )(‪ print_board‬فراخوانی شود‪ .‬برای مثال اگر صفحه بازی ‪ ۴‬در ‪ ۴‬باشد‬
‫به عنوان نمونه داریم‪:‬‬
‫
‪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‬‬
‫و پس از آن اگر حرکت مجاز وجود نداشت عبارت !‪ The board is refreshing‬چاپ شود و بعد از آن دوباره اطالعات باال‬
‫مربوط به جدول جدید چاپ شود‪.‬‬
‫در صورتی که دستور وارد شده معتبر نبوده بود عبارت زیر در خط بعد از جدول ژله‌ها چاپ شود‪:‬‬
‫!‪Invalid Command‬‬
‫همچنین در صورتی که تعداد حرکات بازیکن تمام شود و تمام ژله‌ها از بین نرفته باشد عبارت زیر چاپ می‌شود‪:‬‬
‫!‪You Lost‬‬
‫و در صورت برنده شدن عبارت زیر چاپ شود‪:‬‬
‫!‪You Won‬‬
‫بعد از چاپ هر یک از دو عبارت باال برنامه را تمام کنید‪.‬‬
‫عیدتون مبارک ‪:‬دی‬
‫موفق باشید‬