이 연습 문제에서는 틱택토 게임의 상태를 판별하는 프로그램을 구현해요. (이 게임은 "noughts and crosses" 또는 "Xs and Os"라고도 해요.)
게임은 3×3 격자에서 진행돼요.
플레이어는 번갈아 가며 격자에 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
___|___|___
| |
| |
| |
때로는 예외를 발생시켜야 할 때도 있어요. 이때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 포함해야 해요. 그러면 코드를 더 읽기 쉽게 만들고 디버깅에도 큰 도움이 돼요. 오류 원인이 특정 타입이라고 확실히 아는 상황이라면 내장 오류 타입 중 하나를 골라 발생시켜도 되지만, 그래도 의미 있는 메시지는 꼭 포함해야 해요.
Tic Tac Toe의 올바른 게임은 한 플레이어가 이기면 끝나요.
두 플레이어가 모두 승리 상태에 있다면, 이 연습 문제는 raise 문을 사용해 풀이에서 ValueError를 "던지는" 것을 기대해요.
한 플레이어가 연속으로 두 번 수를 두는 것으로 판정되거나, 두 번째 수를 두도록 배정받았는데 첫 번째 수를 두는 경우에도 코드는 ValueError를 던져야 해요.
메시지를 담아 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")
테스트는 오류 메시지가 정확히 일치하는지 확인하므로, 기대하는 결과를 주의 깊게 읽어 봐요.
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.