مبانی برنامه سازی نیمسال دوم ۹۲-۹۳ مدرس :نیکآیین پروژه درس -بخش اول 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 بعد از چاپ هر یک از دو عبارت باال برنامه را تمام کنید. عیدتون مبارک :دی موفق باشید
© Copyright 2025 Paperzz