Neste exercício, vais implementar um programa que determina o estado de um jogo do galo. (Também podes conhecer este jogo como "noughts and crosses" ou "Xs and Os".)
O jogo é jogado numa grelha 3×3.
Os jogadores colocam à vez Xs e Os na grelha.
O jogo termina quando um jogador ganha ao colocar três das suas marcas em linha, numa coluna ou numa diagonal da grelha, ou quando a grelha inteira fica preenchida.
Neste exercício, vamos assumir que o X começa.
A tua tarefa é determinar em que estado está um jogo.
Há 3 estados possíveis do jogo:
Se o tabuleiro dado for inválido, lança um erro apropriado.
Se um tabuleiro cumprir as seguintes condições, é inválido:
X começa). | |
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
___|___|___
| |
| |
| |
Por vezes é necessário lançar uma exceção. Quando o fazes, deves incluir sempre uma mensagem de erro significativa que indique qual é a origem do erro. Isto torna o teu código mais legível e ajuda imenso na depuração. Em situações em que sabes que a origem do erro será de um determinado tipo, podes optar por lançar um dos tipos de erro incorporados, mas deves continuar a incluir uma mensagem significativa.
Um jogo válido de Tic Tac Toe termina quando um dos jogadores ganha.
Se ambos os jogadores estiverem numa situação de vitória, este exercício espera que uses a instrução raise e que "lances" um ValueError na tua solução.
Espera-se também que o teu código lance um ValueError se se considerar que um jogador jogou duas jogadas seguidas, ou que jogou a primeira jogada quando lhe tinha sido atribuído jogar a segunda.
Para lançar um ValueError com uma mensagem, escreve a mensagem como argumento do tipo 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")
Os testes verificam se a mensagem de erro corresponde exatamente, por isso lê com atenção os resultados esperados.
Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.