کریم که چشمانش را خون گرفته از شدت سر رفتن حوصلهاش در دوران قرنطینه در حالی که قطعی اینترنت همچنان باقیست تصمیم نهایی خود مبنی بر پیادهسازی و ساخت برنامهی شطرنج گرفته است.
او از شما میخواهد برایش با استفاده از پایتون شطرنج را پیادهسازی کنید. پس باید کلاسهایی بنویسیم که با استفاده از شیء گرایی یک شطرنج ساده را پیادهسازی کند.
## جزئیات
+ این بازی در جدولی که از هر طرف نامتناهیست انجام میشود. مهرهها به دو رنگ سفید و سیاه تقسیم شدهاند و برای هر رنگ یک مهرهی شاه و به تعداد نامتنهای مهرهی سرباز که میتوانند در صفحه حضور داشته باشند و میتوانند هم حضور نداشته باشند داریم.
+ در ابتدای بازی مهره شاه سفید در خانه $(-10 , -10)$ و شاه سیاه در خانه $(10 , 10)$ قرار دارد. و سربازی درون بازی وجود ندارد.
+ نحوهی پیروزی در این بازی به وسیلهی مات کردن حریف انجام میشود. مات کردن به این معنیست که حداقل یکی از مهرههای ما(به جز مهرهی شاه) در یکی از خانههای همسایهی راسی(هشت خانهی دور خانهی مورد نظر) خانهی شاه حریف باشد.
+ برای پیادهسازی باید از دو کلاس `Piece` و `Board` استفاده کنید که جزئیات آن را مشاهده میکنید:
```python solution.py
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
```
## کلاس `Piece`
هر عضو این کلاس دارای سه ویژگی (*Attribute*) است که در تابع `ــinitــ` مقداردهی اولیه میشود و به ازای هر شی مقدار آن فرق دارد:
+ ۱. `sort`: که نشان دهندهی نوع مهرهی مورد نظر میباشد. این مقدار یا `"K"` به معنای شاه و یا `"P"` به معنای سرباز است.
+ ۲. `color`: که نشان دهندهی رنگ مهرهی مورد نظر میباشد. این مقدار یا `"black"` به معنای رنگ سیاه و یا `"white"` به معنای رنگ سفید است.
+ ۳. `position`: که نشان دهندهی جایگاه مهرهی مورد نظر در صفحه میباشد به طور مثال این ویژگی برای مهرهی شاه سفید رنگ $(-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` را برگرداند.
## نکات
+ میتوانید فایل اولیه این سوال را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/60138/) دریافت کنید.
+ غیر از تابع `is_mate`، بقیه توابع کلاس `Board` باید مقدار مورد نظر را چاپ کنند. در تابع `is_mate` باید مقدار مورد نظر را بازگردانید.
## نحوه ارسال
شما باید کلاسهای `Piece` و `Board` موجود در فایل `solution.py` را تکمیل و سپس این فایل را ارسال کنید.