کریم که چشمانش را خون گرفته از شدت سر رفتن حوصله‌اش در دوران قرنطینه در حالی که قطعی اینترنت همچنان باقی‌ست تصمیم نهایی خود مبنی بر پیاده‌سازی و ساخت برنامه‌ی شطرنج گرفته است.

او از شما می‌خواهد برایش با استفاده از پایتون شطرنج را پیاده‌سازی کنید. پس باید کلاس‌هایی بنویسیم که با استفاده از شیء گرایی یک شطرنج ساده را پیاده‌سازی کند.

جزئیات

  • این بازی در جدولی که از هر طرف نامتناهی‌ست انجام می‌شود. مهره‌ها به دو رنگ سفید و سیاه تقسیم شده‌اند و برای هر رنگ یک مهره‌ی شاه و به تعداد نامتنهای مهره‌ی سرباز که می‌توانند در صفحه حضور داشته باشند و می‌توانند هم حضور نداشته باشند داریم.

  • در ابتدای بازی مهره شاه سفید در خانه (10,10)(-10 , -10) و شاه سیاه در خانه (10,10)(10 , 10) قرار دارد. و سربازی درون بازی وجود ندارد.

  • نحوه‌ی پیروزی در این بازی به وسیله‌ی مات کردن حریف انجام می‌شود. مات کردن به این معنی‌ست که حداقل یکی از مهره‌های ما(به جز مهره‌ی شاه) در یکی از خانه‌های همسایه‌‌ی راسی(هشت خانه‌ی دور خانه‌ی مورد نظر) خانه‌ی شاه حریف باشد.

  • برای پیاده‌سازی باید از دو کلاس Piece و Board استفاده کنید که جزئیات آن را مشاهده می‌کنید:

class Piece:
    def __init__(self):
        pass


class Board():
    def __init__(self):
        pass

    def add(self, piece):
        pass

    def remove(self, position): 
        pass

    def move(self, piece, position2):
        pass

    def is_mate(self, color):
        pass
Python
solution.py

کلاس Piece

هر عضو این کلاس دارای سه ویژگی (Attribute) است که در تابع ــinitــ مقداردهی اولیه می‌شود و به ازای هر شی مقدار آن فرق دارد:

  • ۱. sort: که نشان دهنده‌ی نوع مهره‌ی مورد نظر می‌باشد. این مقدار یا "K" به معنای شاه و یا "P" به معنای سرباز است.
  • ۲. color: که نشان دهنده‌ی رنگ مهره‌ی مورد نظر می‌باشد. این مقدار یا "black" به معنای رنگ سیاه و یا "white" به معنای رنگ سفید است.
  • ۳. position: که نشان دهنده‌ی جایگاه مهره‌ی مورد نظر در صفحه می‌باشد به طور مثال این ویژگی برای مهره‌ی شاه سفید رنگ (10,10)(-10 , -10) می‌باشد. نوع این متغیر tuple است.

کلاس ‌Board

هر عضو این کلاس دارای یک ویژگی (Attribute) است که در تابع ــinitــ مقداردهی اولیه می‌شود و به ازای هر شی مقدار آن فرق دارد:

  • position: که به صورت یک دیکشنری می‌باشد که قسمت Key در این دیکشنری به تمامی position های اشغال شده در صفحه تعلق دارد و قسمت Value برای هر position یک عنصر از کلاس Piece می‌باشد که در آن position جای گرفته است. توجه کنید که شما باید در تابع __init__ این کلاس شاه سفید و سیاه را با شرایطی که در بالا گفته شد به دیکشنری اضافه کنید.

این کلاس دارای چهار متد زیر می‌باشد:

  • ۱. add: این متد به عنوان ورودی یک عنصر از کلاس Piece را می‌گیرد و آن را به صفحه اضافه می‌کند. توجه کنید که تنها باید یک شاه از هر رنگ در صفحه وجود داشته باشد و در ‌Position مهره‌ای که به صفحه اضافه می‌کنیم نباید مهره‌ای وجود داشته باشد. اگر ورودی این متد در تناقض با این توضیحات بود متد باید عبارت "invalid query" را چاپ کند.

  • ۲. remove: این متد به عنوان ورودی یک position دریافت می‌کند و اگر در آن position مهره‌ای وجود داشت آن مهره را از صفحه پاک می‌کند. توجه کنید که حتما از هر رنگ دقیقا یک شاه باید درون صفحه‌ی بازی قرار داشته باشد. اگر ورودی این متد در تناقض با این توضیحات بود و یا در position ورودی مهره‌ای وجود نداشت متد باید عبارت "invalid query" را چاپ کند.

  • ۳. move: این متد به عنوان ورودی یک شی از نوع Piece و یک Position که نشان‌دهنده جایگاه جدیدی است که این مهره در آن باید قرار بگیرد، دریافت می‌کند. در صورتی که در جایگاه فعلی این مهره در صفحه، همین مهره وجود داشته باشد و جایگاه جدید نیز خالی از مهره باشد، این مهره را به آن جایگاه منتقل می‌کنیم. اگر در جایگاه فعلی این مهره در صفحه همین مهره وجود داشته باشد و جایگاه جدید یکی از مهره‌های سرباز حریف باشد، این مهره به آن جایگاه انتقال می‌یابد و مهره‌ی حریف از صفحه حذف می‌شود(چون حتما باید در هر لحظه از هر رنگ دقیقا یک مهره شاه وجود داشته باشد پس نمی‌تواند شاه حریف را مورد حمله قرار دهد). در غیر این صورت و یا اگر ورودی این متد در تناقض با این توضیحات بود متد باید عبارت "invalid query" را چاپ کند.

  • ۴. is_mate: این متد به عنوان ورودی یک رنگ ( "white" و یا "black") را دریافت می‌کند و بررسی می‌کند که آیا مهره‌های رنگ مورد نظر در وضعیت مات قرار دارد یا خیر. اگر قرار دارد مقدار True و اگر خیر مقدار False را برگرداند.

نکات

  • می‌توانید فایل اولیه این سوال را از این لینک دریافت کنید.
  • غیر از تابع is_mate، بقیه توابع کلاس Board باید مقدار مورد نظر را چاپ کنند. در تابع is_mate باید مقدار مورد نظر را بازگردانید.

نحوه ارسال

شما باید کلاس‌های Piece و Board موجود در فایل solution.py را تکمیل و سپس این فایل را ارسال کنید.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.