finalproject.pdf

‫پروژه پایانی‬
‫درس مبانی برنامه نویسی کامپیوتر‬
‫مهلت تحویل‪ 9 :‬بهمن ساعت ‪90:37‬‬
‫نکات کلی‬
‫‪ ‬فایل های خود را در یک فلدر با عنوان ‪ Proj_STDID1_STDID2‬قرار داده و پس از فشرده سازی در‬
‫ایمیلی با همین عنوان به آدرس ‪ hw.cpp.901@gmail.com‬ارسال نمایید‪.‬‬
‫به عنوان مثال اگر شماره دانشجویی گروه شما ‪ 76661199‬و ‪ 76096669‬است نام فایل ارسالی شما باید‬
‫‪ proj_91106677_90341004.zip‬باشد‪.‬‬
‫‪ ‬مهلت ارسال اسامی اعضای گروه تا ساعت ‪ 90:37‬دوشنبه ‪ 69‬دی ماه است‪ .‬اسامی اعضای گروه باید به‬
‫آدرس ‪ hw.cpp.901@gmail.com‬ارسال شود‪ .‬نمرهی پروژهی گروههایی که پس از این تاریخ نام‬
‫خود را اعالم کنند صفر درنظر گرفته میشود‪.‬‬
‫‪ ‬مهلت تحویل پروژه ساعت ‪ 9 90:37‬بهمن بوده و به هیچ عنوان تمدید نخواهد شد‪.‬‬
‫‪ ‬سؤاالت خود را با فرستادن ایمیل به آدرس ‪ cplusplus-90-1-g9@googlegroups.com‬مطرح‬
‫کنید‪.‬‬
‫‪ ‬هرگونه رونوشت‪ ،‬برای منبع رونوشت و همچنین نسخه های رونویسی شده‪ ،‬به اندازهی نمرهی پروژه نمره‬
‫منفی در پی خواهد داشت‪.‬‬
‫بازی چکرز‬
‫در این قسمت بازی دو نفرهی چکرز‪ 6‬و قواعد آن را به شما معرفی میکنیم‪ .‬این بازی روی یک صفحهی‬
‫شطرنجی ‪ 8×8‬انجام می شود‪ .‬در ابتدای بازی مهرهها مطابق آنچه که در شکل ‪ 6‬نشان داده شده است به روی‬
‫صفحه چیده میشوند‪.‬‬
‫شکل‪ .6‬نحوهی چینش مهرهها در آغاز بازی‪.‬‬
‫هر یک از نفرات در نوبت خود میتواند یکی از مهره هایش را یک خانه جابجا کند ولی مهره ها همیشه باید در‬
‫خانه های سفید باقی بمانند‪ .‬همچنین هر کس باید مهره هایش را به سمت جلو (نسبت به خودش) حرکت دهد‪.‬‬
‫مطابق با آنچه که در شکل ‪ 9‬نشان داده شده است‪ ،‬اگر دو مهرهی غیر همرنگ به طور قطری در کنار هم قرار‬
‫داشته باشند‪ ،‬میتوان از روی مهرهی حریف پرید و آن را حذف کرد‪ .‬البته این در حالتی است که پشت مهرهی‬
‫حریف خالی باشد‪.‬‬
‫شکل ‪ .9‬نحوهی زدن یک مهره در بازی چکرز‪.‬‬
‫اگر کسی در نوبت خود بتواند مهرهی حریف را بزند‪ ،‬باالجبار باید این کار را انجام بدهد‪ .‬یعنی اگر امکان زدن‬
‫مهرهی حریف وجود داشته باشد‪ ،‬نمیتوان از زدن مهرهی وی صرف نظر کرد‪.‬‬
‫‪Checkers‬‬
‫‪1‬‬
‫همان طور که در شطرنج‪ ،‬اگر پیاده به سطر آخر برسد تبدیل به وزیر می شود‪ ،‬در این بازی هم اگر مهرهای به‬
‫سطر آخر برسد تبدیل به شاه میشود‪ .‬برتری شاه این است که به عقب هم میتواند برگردد ولی مهرههای عادی‬
‫فقط به سمت جلو حرکت میکنند‪.‬‬
‫در نهایت هم‪ ،‬کسی که مهرهای در زمین برایش باقی نمانده باشد‪ ،‬بازنده است‪.‬‬
‫نمونه ای از بازی‪:‬‬
‫برای آشنایی بیشتر با قوانین بازی‪ ،‬می توانید به اینجا مراجعه کنید‪ .‬دقت کنید برای حرکت دادن مهره ها‪ ،‬باید‬
‫روی مهره کلیک کرده‪ ،‬سپس روی خانه ی مقصد کلیک کنید‪ .‬بازیکن اول کاربر و بازیکن دوم کامپیوتر است‪.‬‬
‫شرح پروژه‬
‫شما باید برای این پروژه‪ ،‬یک محیط بازی پیاده سازی نمایید که کاربران بتوانند روی آن بازی کنند‪ .‬به عنوان‬
‫نمره اضافه‪ ،‬می توانید یک بازیکن خودکار نیز داشته باشد که تا حدی هوشمند باشد‪ .‬توجه کنید تابعی که‬
‫محیط گرافیکی را برای شما نمایش میدهد‪ ،‬در اختیارتان قرار میگیرد‪ .‬این تابع ‪ 0‬آرگومان ورودی دارد‪:‬‬
‫‪ ‬یک آرایه می گیرد که با مقدار های ‪ 6 ،6‬و ‪ 9‬و ‪ 0‬و ‪ 9‬پر شده اند‪ 6 .‬یعنی خانهی خالی‪ 6 ،‬خانهای که‬
‫با مهرهی سفید پرشده و ‪ 9‬هم خانهای که با مهرهی قرمز پر شده‪ 0 ،‬خانه ای که با مهره ی سفید شاه‬
‫پر شده و ‪ 9‬خانه ای که با مهره ی قرمز شاه پر شده است‪ .‬کافی است هنگام رسم محیط بازی‪ ،‬این‬
‫تابع را با آرگومان مناسب صدا کنید‪.‬‬
‫‪ ‬یک متغیر که نشان دهندهی تعداد مهرههای سفید موجود در صفحه است‪.‬‬
‫‪ ‬یک متغیر که نشان دهندهی تعداد مهرههای قرمز موجود در صفحه است‪.‬‬
‫الگوی این تابع به صورت زیر است‪:‬‬
‫;)‪void draw (int ** board, int num_white, int num_red‬‬
‫به طور کلی برنامه شامل دو قسمت است‪:‬‬
‫‪ ‬رسم صفحهی بازی‪ :‬این قسمت توسط تابعی که در اختیارتان قرار می گیرد پیاده سازی میشود‪.‬‬
‫‪ ‬یک خط فرمان که حرکتهای هر بازیکن از آن گرفته میشود‪ :‬سپس از ورودی آدرس دو خانه را‬
‫میگیرد‪ ،‬اولی موقعیت مهرهای است که باید حرکت کند و دومی موقعیتی که مهره پس از جابجایی به‬
‫آن میرود‪ .‬دقت کنید‪ ،‬اگر قرار است دنبالهای از حرکات در یک گام انجام شود‪ ،‬باید دنبالهای از‬
‫آدرسها در ورودی وارد شود‪.‬‬
‫همانگونه که در شکل ‪ 0‬نشان داده شده است‪ ،‬نامگذاری خانهها مانند نامگذاری خانههای شطرنج صورت‬
‫میگیرد‪ .‬شماره سطر ها از ‪ 6‬تا ‪ 8‬و شمارهی ستون ها از ‪ A‬تا ‪ H‬است‪.‬‬
‫‪H‬‬
‫‪G‬‬
‫‪F‬‬
‫‪E‬‬
‫‪D‬‬
‫‪C‬‬
‫‪B‬‬
‫‪A‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫شکل ‪ .0‬شیوهی نامگذاری خانههای صفحهی بازی‪.‬‬
‫اگر کاربر حرکت غیر مجازی را در ورودی بدهد‪ ،‬باید پیغام خطای مناسب چاپ کنید و منتظر ورودی جدید‬
‫باشید‪ .‬این پیغام عبارت است از‪:‬‬
‫‪invalid Move, try again.‬‬
‫همچنین در صورتی که کاربر مجبور به زدن مهره ای باشد ولی این کار را انجام ندهد باید پیغام خطای زیر چاپ‬
‫شود‪:‬‬
‫‪invalid Move, you must make a jump.‬‬
‫دقت کنید پس از هر حرکت‪ ،‬باید یک بار تابع ‪ draw‬را‪ ،‬که در باال در موردش توضیح داده شد‪ ،‬صدا کنید‪.‬‬
‫برای مثال دنباله ای از دستوراتی که در خط فرمان نوشته می شوند در زیر آمده است‪ .‬توجه کنید خطوط سیاه ‪،‬‬
‫خروجی و خطوط سبز ورودی هستند‪:‬‬
‫‪first player’s turn:‬‬
‫‪A6 B5‬‬
‫‪second player’s turn:‬‬
‫‪B3 C4‬‬
‫‪first player’s turn:‬‬
‫‪B5 B4‬‬
‫‪invalid Move, try again.‬‬
‫‪B5 A4‬‬
‫‪second player’s turn:‬‬
‫‪...‬‬
‫موارد اصلی پروژه‪:‬‬
‫‪ .6‬برای نوشتن پروژه حتما در مواقع لزوم از کامنت استفاده کنید‪.‬‬
‫‪ .9‬از نوشتن تمام متن برنامه در ‪ main‬اکیدا خودداری کرده‪ ،‬و حتما از توابع استفاده کنید‪.‬‬
‫‪ .0‬در هنگام حرکت‪ ،‬همهی قوانین بازی باید چک شوند‪ .‬اگر کاربر حرکتی را بر خالف قوانین بازی‬
‫درخواست کند‪ ،‬نباید انجام شود‪.‬‬
‫‪ .9‬از چاپ عبارات اضافی در خروجی خودداری کنید‪ .‬هرگونه خروجی اضافه موجب کسر نمره خواهد شد‪.‬‬
‫‪ .3‬برای نام گذاری متغیر ها و توابع‪ ،‬از نام های معنی دار استفاده کنید‪.‬‬
‫‪ .1‬حتما در برنامه ی خود از فاصله گذاری مناسب‪ ،‬برای افزایش خوانایی برنامه استفاده کنید‪.‬‬
‫‪ .9‬به همراه کد خود‪ ،‬یک فایل ‪ pdf‬به عنوان مستندات پروژه ارسال کنید‪ .‬این فایل باید شامل‪ :‬خالصهای‬
‫از الگوریتم ها و کتابخانههای استفاده شده‪ ،‬توضیحاتی در مورد توابع و عملکرد هر کدام‪ ،‬و دیگر موارد‬
‫مشابه باشد‪.‬‬
‫موارد اختیاری پروژه‪:‬‬
‫‪ ‬پیاده سازی یک بازیکن‪( .‬که قوانین را به درستی رعایت کند) دقت کنید برنامه ی شما در حالت عادی‪،‬‬
‫تنها ورودی ها را از کاربر می گیرد‪ ،‬منظور از این قسمت‪ ،‬پیاده سازی یک بازیکن است‪ .‬اول کاربری‬
‫است که پشت کامپیوتر نشسته و حرکات را وارد می کند اما بازیکن دوم کامپیوتر است‪.‬‬
‫‪ ‬افزایش هوشمندی بازیکن‬
‫موارد اجباری مربوط به گروه های سه نفره‪(:‬این مورد برای گروه های دو نفره به عنوان نمره اضافه‬
‫در نظر گرفته می شود)‬
‫‪ ‬اگر تعدادی از مهره های حریف چنان قرار داشته باشند که بازیکن بتواند با یکی از مهرههایش و به طور‬
‫متوالی آن ها را بزند‪ ،‬میتواند همهی آن ها را در یک نوبت بزند‪ .‬مثال در شکل ‪ ،9‬اگر نوبت سفید باشد‪،‬‬
‫باید بازی نشان داده شده را انجام دهد و دو مهره از حریف را حذف کند‪.‬‬
‫شکل ‪ .9‬حرکتهای متوالی‬