HW4.pdf

‫به نام خدا‬
‫هوش مصنوعی‬
‫مدرس ‪ :‬سلیمانی‬
‫تمرین ‪4‬‬
‫دانشکده مهندسی کامپیوتر‬
‫موعد تحویل تمرین‪ 21 :‬فروردین ساعت ‪24‬‬
‫تعریف مساله‬
‫در این تمرین‪ ،‬شما باید یک عامل هوشمند برای بازی پنتاگو ‪ ،1‬طراحی کنید‪ .‬برای طراحی این عامل‪ ،‬شما باید از درخت ‪Minimax‬‬
‫استفاده کنید و برای بهبود آن از هرس ‪ Alpha-Beta‬کمک بگیرید‪.‬‬
‫برای پیادهسازی تابع ‪ Minimax‬الزم است که برای هر حالت بازی یک تابع ارزیابی )‪ (evaluation function‬داشته باشید‪ .‬با‬
‫توجه به اینکه بخشی از نمرهی شما به این بخش تخصص دارد‪ ،‬و هوشمندی برنامه شما را این بخش مشخص میکند‪ ،‬سعی کنید‬
‫این بخش را به دقت طراحی کنید‪ .‬الزم به ذکر است‪ ،‬برنامه شما‪ ،‬برای هر حرکت بازی فقط ‪ 1‬ثانیه زمان دارد‪ .‬اگر انتخاب حرکت‬
‫از زمان گفته شده بیشتر طول بکشد‪ ،‬شما بازندهی بازی خواهید شد‪.‬‬
‫معرفی بازی‬
‫این بازی دونفره‪ ،‬روی یک جدول ‪ 6 × 6‬انجام میشود‪ .‬این جدول‪ ،‬شامل چهار زیر جدول ‪ 3 × 3‬است که قابلیت چرخش حول‬
‫خانهی وسط‪ ،‬در دو جهت ساعتگرد و پادساعتگرد را دارند‪.‬‬
‫‪Pentago‬‬
‫‪1‬‬
‫هر کس در نوبت خود‪ ،‬یکی از مهرههای رنگ خودش را در یکی از خانههای خالی جدول قرار میدهد‪ ،‬و بعد از آن یکی از زیرجدولها‬
‫را انتخاب کرده و ‪ 90‬درجه در جهت دلخواه خودش دوران میدهد‪.‬‬
‫به طور مثال‪ ،‬اگر حالت بازی به این صورت باشد‪:‬‬
‫بعد از اینکه‪ ،‬بازیکن سفید مهرهاش را در سطر ‪ 5‬از باال و ستون ‪ 4‬از چپ گذاشت‪ ،‬و زیرجدول راست پایین را‪ 90 ،‬درجه پادساعتگرد‬
‫چرخاند‪ ،‬جدول به این حالت در خواهد آمد‪:‬‬
‫برنده بازی اولین نفری است که ‪ 5‬مهرهی رنگ او بعد از حرکتش‪ ،‬به صورت سطری‪ ،‬ستونی و یا قطری‪ ،‬پشت سر هم ردیف شوند‪.‬‬
‫در صورتی که جدول پر شود‪ ،‬و یا به طور همزمان دو رنگ مهره به حالت برد برسند‪ ،‬بازی مساوی خواهد شد‪.‬‬
‫توضیحات کد‬
‫‪Interface player ‬‬
‫برای نوشتن عامل خود‪ ،‬باید ‪ interface‬به نام ‪ player‬را ‪ implement‬کنید‪ .‬دقت کنید کالسی که می نویسید‪ ،‬به نام‬
‫]‪ player[std_id‬باشد‪ .‬یعنی به طور مثال اگر شماره دانشجویی شما ‪ 123456‬است‪ ،‬کالسی که میسازید باید به نام‬
‫‪ player123456‬باشد‪.‬‬
‫{ ‪public interface player‬‬
‫;)(‪public String getName‬‬
‫;)‪public void setColor(int color‬‬
‫;)‪public move getMove(board b‬‬
‫{‬
‫در این ‪ interface‬سه تابع وجود دارد که شما باید آنها را پیادهسازی کنید‪.‬‬
‫)‪ public move getMove(board b‬‬
‫ورودی این تابع‪ ،‬جدول بازی تا به این مرحله است‪ .‬جدول یک ‪ object‬از کالس ‪ Board‬است که در ادامه به توضیح آن میپردازیم‪.‬‬
‫خروجی این تابع‪ ،‬حرکت شما است‪ .‬حرکت شما‪ ،‬یک ‪ object‬از کالس ‪ move‬است که در ادامه آن را معرفی خواهیم کرد‪.‬‬
‫)(‪ public String getName‬‬
‫در ابتدا بازی‪ ،‬یک نام به شما اختصاص داده میشود‪ .‬یعنی ورودی تابع ‪ Constructor‬کالس شما یک ‪ String‬خواهد بود‪ .‬این‬
‫تابع‪ ،‬مقدار نام شما ( که در ابتدای تولید ‪ object‬اختصاص داده شده بود ) را باز میگرداند‪.‬‬
‫)‪ public void setColor(int color‬‬
‫ما‪ ،‬با فراخوانی این تابع به شما اعالم می کنیم که رنگ شما در بازی‪ ،‬چه رنگی است‪ .‬رنگ یکی از اعداد ‪ 1‬یا ‪ 2‬خواهد بود‪.‬‬
‫‪Class Move ‬‬
‫یک حرکت بازی‪ 4 ،‬قسمت دارد‪:‬‬
‫‪ .1‬سطری که مهره در آن قرار خواهد گرفت‬
‫‪ .2‬ستونی که مهره در آن قرار خواهد گرفت‬
‫‪ .3‬زیرجدولی که برای دوران انتخاب شده‬
‫‪ .4‬جهت دوران‬
‫در پیاده سازی کد‪ ،‬مقادیر این چهار متغیر به صورت زیر تفسیر میشود‪:‬‬
‫‪‬‬
‫شماره سطر‪ ،‬برای سطر باالیی ‪ ،0‬و برای سطر پایینی ‪ 5‬است‪ ( .‬متغیر ‪) row‬‬
‫‪‬‬
‫شماره ستون برای ستون چپی ‪ ،0‬و برای ستون راستی ‪ 5‬است‪ ( .‬متغیر ‪) column‬‬
‫‪‬‬
‫شماره زیر جدولها ( متغیر ‪) subBoard‬‬
‫شماره ‪ : 0‬زیرجدول چپ باال‬
‫شماره ‪ : 1‬زیرجدول راست باال‬
‫‪‬‬
‫شماره ‪ : 2‬زیرجدول چپ پایین‬
‫شماره ‪ : 3‬زیرجدول راست پایین‬
‫مقدار متغیر ‪ clockwise‬در صورتی که ‪ 1‬بود‪ ،‬نشاندهنده دوران ساعتگرد و در صورتی که صفر بود نشاندهندهی‬
‫دوران پادساعتگرد خواهد بود‪.‬‬
‫با مطالعه این کالس‪ ،‬به جزئیات پیادهسازی پی خواهید برد‪.‬‬
‫‪Class Board ‬‬
‫این کالس‪ ،‬همان جدول بازی است‪ 4 .‬تابع ‪ public‬در این کالس وجود دارد‪ ،‬که شما میتوانید از آنها استفاده کنید‪:‬‬
‫)‪public int get(int r, int c‬‬
‫‪‬‬
‫ورودی این تابع‪ ،‬به ترتیب سطر و ستون جدول‪ ،‬و خروجی آن‪ ،‬وضعیت آن خانه است‪ 0 .‬نشان دهندهی خالی بودن خانه‪ ،‬و اعداد ‪1‬‬
‫و ‪ 2‬نشاندهندهی مهرهی بازیکن اول و دوم هستند‪.‬‬
‫)(‪public int winner‬‬
‫‪‬‬
‫این تابع‪ ،‬بررسی می کند که برنده این جدول چه کسی است‪ .‬در صورتی که هنوز برندهای وجود نداشته باشید خروجی آن ‪ 0‬است‪.‬‬
‫در صورتی که بازی مساوی شده باشد‪ ،‬خروجی آن ‪ 3‬است و در صورتی که هر کدام از بازیکنها برنده شده باشند‪ ،‬خروجی آن عدد‬
‫بازیکن خواهد بود‪.‬‬
‫)‪public board nextMove(move m, int player‬‬
‫‪‬‬
‫ورودی این تابع‪ ،‬یک حرکت و شماره بازیکن است‪ .‬خروجی آن‪ ،‬یک جدول بازی جدید است که آن حرکت ( با آن شماره بازیکن )‬
‫روی آن اعمال شده است‪ .‬دقت کنید که صدا زدن این تابع روی یک جدول بازی‪ ،‬آن جدول را تغییر نخواهد داد‪.‬‬
‫)‪public void move(move m, int player‬‬
‫‪‬‬
‫با صدا زدن این تابع‪ ،‬حرکت ورودی و با شماره بازیکن ورودی روی جدول اعمال خواهد شد‪ .‬توجه کنید که خروجی این تابع‬
‫‪ void‬است و تغییرات روی همان جدول اعمال خواهد شد‪.‬‬
‫توضیحات تکمیلی‬
‫‪‬‬
‫برای اطالع کامل از نحوهی اجرای بازی‪ ،‬تمام کدهای موجود را مطالعه کنید‪ .‬برای درک بهتر کد‪ ،‬یک بازیکن به نام‬
‫‪ samplePlayer‬در کد قرار گرفته است که به صورت ‪ Random‬حرکت میکند‪ .‬با یک بار اجرای کد‪ ،‬با نحوهی تعریف‬
‫کالس ‪ Move‬بیشتر آشنا خواهید شد‪.‬‬
‫‪‬‬
‫توجه داشته باشید که قوانین بازی تعریف شده ممکن است اندکی با نسخهی واقعی بازی تفاوت داشته باشد‪.‬‬
‫‪‬‬
‫تنها چیزی که شما باید تحویل بدهید‪ ،‬کالس ]‪ player[std_id‬است‪ .‬به همین خاطر مجاز به تغییر هیچ کدام از‬
‫قسمتهای کدی که در اختیار شما قرار داده شده است نیستید‪.‬‬
‫‪‬‬
‫مستندی درباره نحوهی پیادهسازی کد و چرایی استفاده از ‪ Evaluation function‬استفاده شده تهیه کنید و در قالب‬
‫‪ PDF‬آن را ارسال نمایید‪.‬‬
‫‪‬‬
‫کدهای شما دو به دو با یکدیگر بازی خواهند کرد‪( .‬یکبار به عنوان بازیکن اول و یکبار به عنوان بازیکن دوم) بخشی از‬
‫نمره ی شما را عملکرد کدتان در مقابل سایر بازیکنان تشکیل خواهد داد‪.‬‬
‫‪‬‬
‫برای هر روز تاخیر در تحویل تمرین ‪ %10‬کسر نمره در نظر گرفته خواهد شد‪.‬‬
‫‪‬‬
‫هرگونه سوال در مورد این تمرین را به آدرس ‪ [email protected]‬ارسال نمایید‪.‬‬
‫در صورت مشاهده هر گونه تقلب نمره تقلب کننده و گیرنده ‪ 0‬منظور شده و به استاد معرفی می شوند‪.‬‬
‫موفق باشید‬