در این تمرین، برنامهای را پیادهسازی میکنید که وضعیت یک بازی tic-tac-toe را مشخص میکند. (شاید این بازی را با نامهای «noughts and crosses» یا «Xs and Os» هم بشناسید.)
این بازی روی یک شبکهی ۳×۳ انجام میشود.
بازیکنان به نوبت Xها و Oها را روی شبکه قرار میدهند.
بازی زمانی تمام میشود که یکی از بازیکنان با قرار دادن سه علامت در یک ردیف، یک ستون یا روی یک قطر از شبکه برنده شود، یا زمانی که کل شبکه پر شود.
در این تمرین فرض میکنیم که بازی با X شروع میشود.
کار شما این است که مشخص کنید یک بازی دادهشده در چه وضعیتی قرار دارد.
سه وضعیت ممکن برای بازی وجود دارد:
اگر صفحهی دادهشده نامعتبر باشد، خطای مناسبی پرتاب کنید.
اگر یک صفحه شرایط زیر را داشته باشد، نامعتبر است:
X شروع میکند). | |
X | |
___|___|___
| |
| X | O
___|___|___
| |
O | X |
| |
| |
X | O | X
___|___|___
| |
X | X | O
___|___|___
| |
O | X | O
| |
| |
X | X | X
___|___|___
| |
| O | O
___|___|___
| |
| |
| |
| |
O | O | X
___|___|___
| |
| |
___|___|___
| |
| |
| |
| |
X | X | X
___|___|___
| |
O | O | O
___|___|___
| |
| |
| |
گاهی لازم است یک استثنا را raise کنید.
وقتی این کار را میکنید، همیشه باید یک پیام خطای معنادار اضافه کنید تا نشان دهید منبع خطا چیست.
این کار کد شما را خواناتر میکند و به Debug کردن بسیار کمک میکند.
در موقعیتهایی که میدانید منبع خطا نوع مشخصی دارد، میتوانید یکی از انواع خطای داخلی را raise کنید، اما باز هم باید پیام معناداری اضافه کنید.
یک بازی معتبر Tic Tac Toe وقتی تمام میشود که یک بازیکن برنده شود.
اگر هر دو بازیکن در وضعیت برنده باشند، این تمرین از شما میخواهد که از دستور raise استفاده کنید و در راهحل خود یک ValueError «پرتاب» کنید.
همچنین اگر تشخیص داده شود که یک بازیکن دو نوبت پشت سر هم بازی کرده است، یا حرکت اول را انجام داده در حالی که قرار بود حرکت دوم را انجام دهد، انتظار میرود کد شما یک ValueError پرتاب کند.
برای raise کردن یک ValueError همراه با پیام، پیام را بهعنوان آرگومان به نوع exception بدهید:
# Example when player O goes before player X.
raise ValueError("Wrong turn order: O started")
# Example when player X goes twice.
raise ValueError("Wrong turn order: X went twice")
# Example when player X wins AND player O wins.
raise ValueError("Impossible board: game should have ended after the game was won")
تستها تطابق دقیق پیام خطا را بررسی میکنند، پس لطفاً نتایج مورد انتظار را با دقت بخوانید.