بهنام خدا تمرین چهارم برنامهنویسی درس »مقدّمهای بر هوش مصنوعی« نیمسال بهار ۱۳۸۶-۸۷ روبات های شطرنج باز موعد تحویل :یکشنبه ۱۲خرداد ۱۳۸۷ پویا اسفندیار – [email protected] شهاب جباری ارفعی [email protected] - روباتهای شطرنج باز مقدمه قرار است مسابقه ای بین دانشکده ی ما و دانشکده ی مهندسی برق و کامپیوتر دانشگاه تهران برگزار شود )در مهرماه( .شما به عنوان تمرین چهارم برنامهنویسی تان باید یک عامل ۱ شطرنج باز بنویسید که بتواند به عنوان نماینده ی دانشکده در این مسابقه شرکت کند .توجه کنید که این مسابقه یک مسابقه ی نیمه کاره است .بعبارتی دیگر ،شما باید بازی را با توجه به صفحه ای که دراختیار شما داده می شود دنبال کنید و حرکت مورد نظرتان برای این صفحه ی نیمه کاره را به عنوان جواب برگردانید .توابع الزم از جمله تابع تشخیص حرکت های مجاز در اختیارتان قرار خواهد گرفت ،بنابراین تمرکز اصلی شما باید روی الگوریتم جستجو باشد. نحوه دقیق برگزاری مسابقه درآینده ی نزدیک اعالم خواهد شد ،اما کلیت آن بر این اساس است :ابتدا تیم ها به صورت داخل دانشکده ای با هم مسابقه می دهند و تنها تعداد محدودی از آنها برای مسابقه بین دانشکده ای انتخاب می شوند .متاسفانه احتمال تغییر جزیی در قوانین و شرایط مسابقه در آینده وجود دارد ،بنابراین به ای میل هایی که در گروه درس فرستاده می شوند توجه کنید. قانون ها ی باز ی ۲ .١قوانین عمومی شطرنج در این جا نیز برقرار هستند )به جز دو حرکت مربوط به قلعه رفتن ۳و زدن پیاده ی حریف وقتی دو حرکت رو به جلو انجام داده است و در خانه ی سمت چپ یا راست پیاده ی شما Agent 2ﺑﺮﮔﺮﻓﺘﻪ ﺍﺯ ﺗﻮﺿﻴﺤﺎﺕ ﺩﺍﻧﺸﺠﻮﻳﺎﻥ ﺩﺍﻧﺸﮕﺎﻩ ﺗﻬﺮﺍﻥ ،ﺑﺎ ﺗﺼﺮﻑ 3ﭼﻮﻥ ﻓﺮﺽ ﻣﻲ ﮐﻨﻴﻢ ﺑﺎﺯﻱ ﺍﺯ ﺍﺑﺘﺪﺍ ﻧﻴﺴﺖ ﻭﺷﺎﻩ ﺣﺘﻤﺎ ﻳﮏ ﺑﺎﺭ ﺣﺮﮐﺖ ﮐﺮﺩﻩ ﺍﺳﺖ. 2 1 قرار گرفته است .۴همچنین فرض می کنیم که پیاده در صورت رسیدن به آخرین خانه فقط به مهره ی وزیر تبدیل می شود(! .٢هر بازی به صورت رفت و برگشت با وضعیتهای اولیه یکسان و با تعدادی صفحه ی متمایز انجام می شود )بنابراین هیچ نگرانی ای درمورد نحوه ی ارزشیابی عاملهایتان وجود نخواهد داشت(.عاملهایتان برای هر صفحه ی خاص یک بار با مهره ی سفید بازی را ادامه می دهند ۵و بار دیگر در حالی که حریف با مهره ی سفید برای همان صفحه بازی کرده است ،با مهره ی سیاه بازی را ادامه می دهند. .٣در صورت لزوم می توانید فرض کنید که صفحه شروع بازی تقریب ًا در وضعیت پایانی قرار دارد .به طوری که غیر از شاه تعداد محدودی از مهره های دیگر برای هر بازیکن در صفحه قرار دارد .بنابراین نگران حالتهای بیشمار حرکتهای ممکن نباشید )همچنین شاخه ای با چند داده ی تستی در فایل های ضمیمه با فرمت ورودی این مساله آمده است .می توانید فرض کنید که شلوغی صفحه ی مسابقه از نظر تعداد مهره ها مشابه شلوغی صفحه در این داده ها است . .همچنین تمام این صفحات حالتی را نشان می دهند که بازیکن سفید با بهترین بازی اش بعد از دو حرکت می تواند شاه سیاه را مات و بازی را به پایان برساند(! .هر بازیکن برای هرحرکتش ،حداکثر ۳ثانیه وقت دارد ،اگر پس از ۳ثانیه حرکتی دریافت نشود ،یک حرکت به طور تصادفی برای او در نظر گرفته شده ،و حرکتی که دیر دریافت شود ،تاثیر داده نمی شود)شما فعال باید این زمان را خودتان چک کنید(! .عالوه بر ماکزیمم زمان ۳ثانیه برای هر حرکت ،یک محدودیت چند دقیقهای هم برای کل حرکات هر بازیکن وجود داردوهر بازیکن می تواند به مدت یک دقیقه به بازی ادامه دهد ۶.نحوه ی تعیین برنده و امتیاز دهی در صورتی که وقت یکی از بازیکنان به پایان برسد ،در ادامه آمده است .معیار برنده شدن در بازی مات کردن شاه است .اما در حاالتی که زمان بازی پیش از مات کردن شاه به پایان برسد مهره ها ی مانده ی هر بازیکن ارزش می یابند .باید درنظر داشت برنده ی هر صفحه بعد از دو بازی با مهره های به رنگ مختلف بر روی یک صفحه ی خاص به صورت زیر تعیین می شود: .aبازیکنی که در هر دو مسابقه به پیروزی رسیده باشد برنده ی آن صفحه است)یک امتیاز( .bبازیکنی که در یکی از صفحه ها برنده شده و بازی بعدی را نیز تا پایان زمان بازی نباخته است برنده است )امتیاز بین نیم تا یک با توجه به مهره های باقی مانده در صفحه ای که بازی برنده On pass on 4 5ﻓﺮﺽ ﺑﺮ ﺍﻳﻦ ﺍﺳﺖ ﮐﻪ ﺑﺎﺯﻱﻧﻴﻤﻪ ﮐﺎﺭﻩ ﻧﻴﺰ ﺗﻮﺳﻂ ﺳﻔﻴﺪ ﺁﻏﺎﺯ ﻣﻲ ﺷﻮﺩ!. 6ﻣﺘﺎﺳﻔﺎﻧﻪ ﺍﻣﮑﺎﻥ ﺗﻐﻴﻴﺮ ﺍﻳﻦ ﺍﻋﺪﺍﺩ ﻭﺟﻮﺩ ﺩﺍﺭﺩ ! ﭘﺲ ﺷﻤﺎ ﺑﺎﻳﺪ ﺩﺭﺍﻳﻦ ﺯﻣﺎﻥ ﺣﺪﺍﻗﻞ ۲۰ﺣﺮﮐﺖ ﺍﻧﺠﺎﻡ ﺩﻫﻴﺪ ﻭ ﺑﺎ ﺧﺎﺗﻤﻪ ﻳﺎﻓﺘﻦ ﻭﻗﺘﺘﺎﻥ )ﺩﺭ ﺻﻮﺭﺗﻲ ﮐﻪ ﺍﺯ ﻭﻗﺖ ﺣﺮﻳﻒ ﺑﺎﻗﻲ ﻣﺎﻧﺪﻩ ﺑﺎﺷﺪ(ﺑﻪ ﺟﺎﻱ ﺷﻤﺎ ﺣﺮﮐﺎﺕ ﺗﺼﺎﺩﻓﻲ ﺑﻪ ﺳﺮﻭﺭ ﺑﺎﺯﻱ ﻓﺮﺳﺘﺎﺩﻩ ﻣﻲ ﺷﻮﺩ 3 ای در زمان معین شده نداشته است .همچنین به بازیکن مقابل نیز به نسبت مهره های مانده- روباتهای شطرنج باز اش امتیاز داده می شود و بدیهی است که این امتیاز از نیم کمتر است!(۷ .cبازیکنی که در هردو صفحه باخته است هیچ امتیازی نمیگیرد. .dاگر برای هیچ کدام از صفحه ها برنده ای نداشتیم بازیکن برای هر صفحه امتیازی کمتر از نیم )بسته به تعداد مهره های باقی مانده از او در آن صفحه ( خواهد گرفت)امتیاز کلی هیچ کدام از بازیکن ها در این حالت به یک نخواهد رسید(. .eاین شیوه ی امتیاز دهی هر چند بهترین روش ممکن نیست ،برای جلوگیری از شطرنج بررهای وضع شده است. ۸ .اگر بازیکنی در نوبتش یک حرکت غیرمجاز برگرداند ،مانند بند ۳یک حرکت تصادفی به جای حرکت اشتباهش در نظر گرفته میشود. .٧در هر مرحله ،سرور بازی ،وضعیت بازی شامل چیدمان صفحه ،آخرین حرکت انجام شده و موارد دیگری که در زیر میآید را به صورت یک رشته ی ۷۱کاراکتری ،از طریق ساکت ۹به بازیکن می- فرستد ،و بازیکن باید در پاسخ یک رشته ی ۴کاراکتری به عنوان حرکت برگرداند. کاراکترهای فرستاده شده توسط سرور به شرح زیر است )برای آگاهی بیشتر به فایل ChessState.java مراجعه کنید( : ۶۴ oکاراکتر اول :وضعیت صفحه شطرنج )کاراکتر ’ ‘Xنشاندهنده ی خانه ی خالی و ال kبرای شاه کاراکترهای دیگر هر کدام نشاندهنده ی یکی از مهرههای شطرنج است ،مث ً 7ﺍﺭﺯﺵ ﻣﻬﺮﻩ ﻫﺎ ﺑﻪ ﺷﺮﺡ ﺯﻳﺮ ﺍﺳﺖ: ﻭﺯﻳﺮ ۹ﺍﻣﺘﻴﺎﺯ ،ﺭﺥ ۵ﺍﻣﺘﻴﺎﺯ ،ﻓﻴﻞ ﻭ ﺍﺳﺐ ﻫﺮﮐﺪﺍﻡ ۳ﺍﻣﺘﻴﺎﺯ ﻭ ﭘﻴﺎﺩﻩ ﻳﮏ ﺍﻣﺘﻴﺎﺯ 8ﺩﺭﺍﻳﻦ ﻧﻮﻉ ﺍﺯﺷﻄﺮﻧﺞ ﻫﺪﻑ ﻣﺎﺕ ﮐﺮﺩﻥ ﺷﺎﻩ ﻧﻴﺴﺖ ﻭ ﺻﺮﻓﺎ ﺑﺮ ﺩﺍﺷﺘﻦ ﻣﺠﻤﻮﻉ ﺍﺭﺯﺵ ﺑﻴﺸﺘﺮ ﺑﺮ ﺭﻭﻱ ﺻﻔﺤﻪ ﺍﺳﺖ. ﺷﻤﺎ ﻣﻲ ﺗﻮﺍﻧﻴﺪ ﺍﺯ ﺍﻳﻦ ﺭﻭﺵ ﺑﺮﺍﻱ ﺗﺎﺑﻊ ﺍﺭﺯﺵ ﮔﺬﺍﺭﻱ ﺧﻮﺩ ﺍﺳﺘﻔﺎﺩﻩ ﮐﻨﻴﺪ ﻭﻟﻲ ﺑﺎﻳﺪ ﺑﻪ ﺍﻳﻦ ﻧﮑﺘﻪ ﺗﻮﺟﻪ ﺩﺍﺷﺘﻪ ﺑﺎﺷﻴﺪ ﮐﻪ ﭼﻮﻥ ﻗﻮﺍﻧﻴﻦ ﻣﻮﺟﻮﺩ ﺑﺎ ﻗﻮﺍﻧﻴﻦ ﺷﻄﺮﻧﺞ ﺑﺮﺭﻩ ﺍﻧﺪﮐﻲ ﺗﻔﺎﻭﺕ ﺩﺍﺭﺩ ،ﺍﺭﺯﺵ ﺑﻲ ﻧﻬﺎﻳﺖ ﺑﺮﺍﻱ ﻣﻬﺮﻩ ﻱ ﺷﺎﻩ ﺭﺍ ﻓﺮﺍﻣﻮﺵ ﻧﮑﻨﻴﺪ! 9 socket 4 سیاه و Kبرای شاه سفید .لیست کامل این کاراکترها را میتوانید در ابتدای کالس Chess فایل Chess.javaببینید(. ۴ oکاراکتر بعدی مربوط به آخرین حرکت انجام شده است .نام گذاری حرکات دقیقًا مانند قواعد استاندارد شطرنج است .به عنوان مثال حرکت A2A4 در آغاز بازی ،سمت چپترین سرباز سفید را دو خانه به جلو میبرد) .دقت کنید که کاراکتر ها را با حروف بزرگ بفرستید( oکاراکتر بعدی مشخص کننده ی نوبت بازیکن است) .صفر برای سفید و ۱برای سیاه( oکاراکتر بعدی مشخص میکند که آیا در حرکت قبل مهرهای خورده شده یا خیر ۱) .نشان- دهنده ی خورده شدن مهره است( oکاراکتر آخرمشخص کننده ی این است که آیا شاه در وضعیت کیش است یا خیر).صفر برای کیش بودن و ۱برای کیش نبودن( کاراکترهای فرستاده شده توسط بازیکن: ۴ oکاراکتر مشخص کننده ی حرکت بعدی .٨کد بازی به هر زبانی قابل نوشتن است .زبان جاوا امکانات الزم برای برنامه نویسی ساکت را دارد ،اما اگر با زبان C/C++برنامه می نویسید باید توجه داشته باشید که در محیط ویندوز چنین امکانی وجود ندارد )می توانید برنامه ای بنویسید که در محیط لینوکس کامپایل و اجرا شود(و شما باید از کتابخانه های موجود بر روی شبکه اینترنت استفاده کنید .ضمنا تابع های کمکی برای نوشتن عامل تنها برای این دو زبان موجود است. کد ها ی آماده ی برنامه ۱۰ قبل از هر چیز ،برای اینکه آشنایی مختصری با این فایلها داشته باشید ،متودهای mainاز کالسهای زیر را به ترتیب اجرا کنید: 1.Server.ServerRunner 2.Viewer.ViewerRunner 10ﺑﺮﮔﺮﻓﺘﻪ ﺍﺯ ﺗﻮﺿﻴﺤﺎﺕ ﺩﺍﻧﺸﺠﻮﻳﺎﻥ ﺩﺍﻧﺸﮕﺎﻩ ﺗﻬﺮﺍﻥ ،ﺑﺎ ﺗﺼﺮﻑ 5 3.Client.TestRunner روباتهای شطرنج باز 4.Client.Testrunner ال تصادفی انتخاب می شود. چیزی که مشاهده خواهید کرد ،بازیای است که حرکتهایش به طور کام ً بنابراین میتوانید پس از نوشتن کدها ،بازیها یتان را در این محیط تست کنید. ابتدا فرض میکنیم که زبان برنامهنویسی شما جاواست .در این صورت قسمتی که باید توسط شما پیاده سازی شود ،متود doPlay از کالس Player است .این کالس از کالس Client مشتق شده و متود abstract این کالس را پیادهسازی میکند .نکته ی قابل توجه این است که شما باید درهنگام آزمایش برنامه یا ارسال برنامه برای ما خط ) Thread.sleep(500را توضیح۱۱کنید زیرا این خط فقط برای تاخیر مجازی و امتحان سرور نوشته شده است .برای راحتی شما کلیه ی توابع الزم برای اعمال قوانین شطرنج در فایل Chess.javaقرار داده شده است .مهمترین تابعی که شما به آن احتیاج خواهید داشت ،تابع ) Chess.next_moves(ChessStateاست که با گرفتن یک وضعیت بازی ،حرکتهای مجاز بعدی را برمیگرداند. وضعیت اولیه ی بازی در سازنده ی کالس ChessStateقرار داده شده .بنابراین برای تغییر چینش اولیه ی بازی باید این قسمت را تغییر دهید. ال واضح است .در نهایت شما باید یک شی از کالس برگردانید که دارای همان ۴کاراکتر سایر موارد کام ً حرکت است و بقیه ی کارها یعنی فرستادن این حرکت به توسط کالس Clientانجام میشود. oکسانی که دوست دارند با زبانی غیر از جاوا کد بزنند نیز نیاز به کار اضافی چندانی ندارند ،فقط باید عملیات فرستادن حرکت توسط ساکت را که در کالس Clientپیادهسازی شده ،به زبان خود پیاده سازی کنند .یک نسخه از کالس میخواهند از C/C++ Chess به نام Chess.cpp هم برای کسانی که استفاده کنند در اختیار شما قرار می گیرد. نکات مهم: comment 6 11 به گروهی که این کار را تا روز دوشنبه ۳۰اردی بهشت ۱۳۸۷انجام دهد ،نیم نمره ی اضافه تعلق می گیرد. توصیه می کنیم که تا پیش از زمان ارسال تمرین ،عاملتان را با عامل های دوستانتان مسابقه دهید .این کار باعث می شود که اشکاالت احتمالی در کدتان راحت تر قابل کشف باشند. نمره ی خام از آنجا که انجام این تمرین بخشی از نمره ی اصلی شما را دارد ،شما می بایست عامل خود را با توجه به الگوریتم های شرح داده شده در فصل ششم کتاب پیاده سازی کنید .گزارش که شامل نحوه ی انتخاب کردن حاالت و پیچیدگی زمان اجرای برنامه و مقایسه ی تکنیک های مختلف است ،حدود %۵۰نمره ی شما را دربرخواهد گرفت .چون معیار ارزیابی این تمرین به صورت نسبی است و خوبی عامل شما در قیاس با عامل های دوستانتان سنجیده می شود %۵۰ ،دیگر نمره به عملکرد عامل شما نسبت به کل کالس اختصاص می یابد. ۱۲ نمره تشو ی ق ی برای تیم هایی که بتوانند جز نیمه ی باالیی جدول رقابت های درون دانشکده ای باشند نمره ی اضافی در نظر گرفته خواهد شد)طبیعی است که میزان این نمره برای تیم هایی که به مسابقات بین دانشکده ای فرستاده می شوند بیشتر خواهد بود(. همچنین ایده های منحصر بفرد مثال در مورد نحوه ی بررسی حاالت بعدی )که باید در گزارش ذکر شوند( یا فرستادن مورد های تستی جالب نیز نمره ی اضافی خواهند داشت. در صورت پیاده سازی مناسب و دقیق این موارد ،ممکن است شانس ارایه ی گزارش آن فعالیت ها )به کالس را( که نمره ی جداگانه ای از تمرین ها دارد را بدست آورید. 12ﺑﻪ ﺩﺍﻧﺸﺠﻮﻳﺎﻧﻲ ﮐﻪ ﻋﺎﻣﻠﺸﺎﻥ ﺩﺭ ﻣﺴﺎﺑﻘﻪ ﻱ ﺩﺭﻭﻥ ﺩﺍﻧﺸﮑﺪﻩ ﺍﻱ ﺩﺭ ﺭﺗﺒﻪ ﻱ ﻣﻴﺎﻧﻲ ﺟﺪﻭﻝ ﻗﺮﺍﺭ ﮔﻴﺮﺩ ﺗﻤﺎﻡ %۵۰ﻧﻤﺮﻩ ﺍﺧﺘﺼﺎﺹ ﺩﺍﺩﻩ ﺧﻮﺍﻫﺪ ﺷﺪ ﻭ ﺑﻪ ﮔﺮﻭﻩ ﻫﺎﻱ ﺑﺎﻻﺗﺮ ﺩﺭ ﺟﺪﻭﻝ ﻧﻤﺮﻩ ﻱ ﺍﺿﺎﻓﻲ ﺩﺍﺩﻩ ﻣﻲ ﺷﻮﺩ. 7 روباتهای شطرنج باز نمره ی منف ی در صورت مشاهده ی هر گونه تخلف از جمله کپ)ی( از سایرین یا انجام تمرین بوسیله ی شخصی به غیر از دانشجو یا متفاوت بودن کد پیاده سازی شده از توضیحات موجود در گزارش به شدت با آن برخورد خواهد شد و عواقب مشکالت احتمالی به عهده ی دانشجو خواهد بود. درصورت تاخیر تا یک هفته به ازای هر روز تاخیر %۷از نمره ی تمرین کسر خواهد شد )یعنی با یک هفته تاخیر %۵۰نمره را از دست خواهید داد( و به تمرینهایی که بعد از یک هفته ارسال شوند هیچ نمره ای تعلق نمیگیرد! تحو ی ل فایل ارسالی شما باید الزاما یک فایل با پسوند zipبا نام Ex4-83101653-83100335باشد )که ۸۳۱۰۱۶۵۳و ۸۳۱۰۰۳۳۵شماره ی دانشجویی افراد تشکیل دهنده ی گروه می باشد( .الزم است فایل ارسالی شامل کدها و گزارشی که با فرمت Pdfاست باشد. فایل ارسالی را تا موعد مقرر به ] [[email protected]ارسال کنید .عنوان نامه ی شما باید مشابه نام فایل باشد. اشکاالت ) احتمال ی ( توجه کنید که کدهایی که در اختیارتان قرار می گیرد )اگرچه پیش از این چندین مرحله آزمون شده اند( احتماال عاری از خطا های برنامه نویسی نخواهند بود .بنابراین از تذکر دادن آن ها و یا پیشنهاد برای بهتر کردن سرور استقبال می شود .اگر ایرادی در کد ها یافت شود از طریق گروه به اطالعتان می رسانیم .قسمت اعظم کد سرور توسط دانشجویان دانشگاه تهران نوشته شده است و توضیحات موجود در کد کافی به نظر می رسد ،اما در صورتی که سوالی در مورد آن داشتید در گروه منعکس کنید .توجه داشته باشید که هنوز درباره نحوه دقیق اجرای مسابقات تصمیم گیری نشده است. 8 کمک ! در صورت ابهام در مورد مساله یا مشکالت پیاده سازی یا وجود ابهام و یا اشکال در کدهای فرستاده شده با ] [[email protected]تماس بگیرید. پایان 9
© Copyright 2026 Paperzz