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