.لینکهای مفید برای شرکت در مسابقه:
میتوانید سوالهای خود را در رابطه با سوالات و دیگر بخشهای پایتون از قسمت "سوال بپرسید" مطرح کنید.
توجه کنید که نسخه پایتون استفاده در سوالات ۳.۷ است. سری سوم راهنماییها به مرور به سوالات اضافه میشوند.
میخواهیم تابعی بنویسیم که با استفاده از شیء گرایی یک شطرنج ساده پیادهسازی کند.
کریم که چشمانش را خون گرفته از شدت سر رفتن حوصلهاش در دوران قرنطینه در حالی که قطعی اینترنت همچنان باقیست تصمیم نهایی خود مبنی بر پیادهسازی و ساخت برنامهی شطرنج گرفته است.
او از شما میخواهد برایش با استفاده از پایتون شطرنج را پیادهسازی کنید.
این بازی در جدولی که از هر طرف نامتناهیست انجام میشود. مهرهها به دو رنگ سفید و سیاه تقسیم شدهاند و برای هر رنگ یک مهرهی شاه و به تعداد نامتنهای مهرهی سرباز که میتوانند در صفحه حضور داشته باشند و میتوانند هم حضور نداشته باشند داریم.
در ابتدای بازی مهره شاه سفید در خانه و شاه سیاه در خانه قرار دارد. و سربازی درون بازی وجود ندارد.
نحوهی پیروزی در این بازی به وسیلهی مات کردن حریف انجام میشود. مات کردن به این معنیست که حداقل یکی از مهرههای ما(به جز مهرهی شاه) در یکی از خانههای همسایهی راسی(هشت خانهی دور خانهی مورد نظر) خانهی شاه حریف باشد.
برای پیادهسازی باید از دو کلاس Piece
و Board
استفاده کنید که جزئیات آن را مشاهده میکنید:
Piece
🔗هر عضو این کلاس دارای سه ویژگی (Attribute) است که در تابع ــinitــ
مقداردهی اولیه میشود و به ازای هر شی مقدار آن فرق دارد:
sort
: که نشان دهندهی نوع مهرهی مورد نظر میباشد. این مقدار یا "K"
به معنای شاه و یا "P"
به معنای سرباز است.color
: که نشان دهندهی رنگ مهرهی مورد نظر میباشد. این مقدار یا "black"
به معنای رنگ سیاه و یا "white"
به معنای رنگ سفید است.position
: که نشان دهندهی جایگاه مهرهی مورد نظر در صفحه میباشد به طور مثال این ویژگی برای مهرهی شاه سفید رنگ میباشد. نوع این متغیر 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
را برگرداند.
solution.py
باشد.در این قسمت راهنماییهای سوال به ترتیب در روزهای شنبه، دوشنبه و چهارشنبه ساعت ۱۸ اضافه میشود. مشکلاتتان در راستای حل سوال را میتوانید از بخش "سوال بپرسید" مطرح کنید.
مقداردهی در تابع ــinitــ
به این صورت میباشد که برای هر شیء مقادیر مشخص و متفاوتی میتوانیم تعیین کنیم. به طور مثال نوشتن تابع ــinitــ
برای کلاس Piece به صورت زیر میباشد:
و یا برای نوشتن این تابع برای کلاس Board در ابتدا قبل از اضافه کردن شاهها به صفحه چون ویژگی position
یک دیکشنری خالیست باید به صورت زیر باشد:
برای متد add
در کلاس Board باید چک کنیم در جایگاهی که میخواهیم مهره را add کنیم آیا مهرهای وجود دارد یا خیر اگر وجود دارد invalid query چاپ کنیم وگرنه در ویژگی position
این Board باید این مهره اضافه شود.
برای متد remove
در کلاس Board باید چک کنیم در این جایگاه مهرهای وجود دارد؟ و اگر وجود دارد این مهره شاه نباشد در غیر این صورت invalid query را چاپ کنیم در غیر این صورت مهرهای که در این جایگاه وجود دارد را از دیکشنری کلاس Board حذف کنیم.
برای متد move
در کلاس Board باید چک کنیم اگر در position جدیدی که مهره باید به آنجا برود مهرهی همرنگ وجود داشت یا مهرهی شاه وجود داشت invalid query چاپ کند وگرنه اگر در جایگاه خالیای میرود جایگاه الان مهره از دیکشنری Board حذف شود و جایگاه جدید مهره و این مهره در دیکشنری Board اضافه شوند و اگر در جایگاهی که میرود مهرهی حریف وجود داشت هم این مهره و جایگاهش و هم مهرهی حریف و جایگاهش از دیکشنری Board حذف شوند و مهرهی حرکت داده شده و جایگاه جدیدش در دیکشنری Board اضافه شوند.
برای متد is_mate
در کلاس Board نیازمند به چک کردن هر هشت خانهی دور شاه داریم تا بفهمیم که آیا حداقل یک مهره از مهرههای سرباز حریف در این خانهها وجود دارد یا خیر.
دقت کنید اگر خانهی شاه مورد نظر خانهی هشت خانهی دور آن خانههای زیر است:
, , , , , , ,
برای متد add
در کلاس Boardشبه کد زیر همان ترجمهی راهنمایی یک به زبان پایتون است:
برای متد remove
در کلاس Board شبه کد زیر همان ترجمهی راهنمایی یک به زبان پایتون است:
برای متد move
در کلاس Board در راهنمایی ۳ شبه کد قرار میگیرد.
برای متد is_mate
در کلاس Board در راهنمایی ۳ شبه کد قرار میگیرد.
برای متد move
در کلاس Board شبه کد زیر همان ترجمهی راهنمایی یک به زبان پایتون است:
برای متد is_mate
در کلاس Board شبه کد زیر همان ترجمهی راهنمایی یک به زبان پایتون است: