Calcule a pontuação de uma partida de boliche.
Boliche é um jogo em que os jogadores lançam uma bola pesada para derrubar pinos dispostos em um triângulo. Escreva um código que acompanhe a pontuação de uma partida de boliche.
A partida consiste em 10 frames. Um frame é composto por um ou dois lançamentos de bola, com 10 pinos em pé no início do frame. Há três casos na tabulação de um frame.
Um frame aberto é aquele em que se registra uma pontuação menor que 10 para o frame. Nesse caso, a pontuação do frame é o número de pinos derrubados.
Um spare é quando os dez pinos são derrubados no segundo lançamento. O valor total de um spare é 10 mais o número de pinos derrubados no lançamento seguinte.
Um strike é quando os dez pinos são derrubados no primeiro lançamento. O valor total de um strike é 10 mais o número de pinos derrubados nos dois lançamentos seguintes. Se um strike for seguido imediatamente por um segundo strike, o valor do primeiro strike não pode ser determinado até que a bola seja lançada mais uma vez.
Veja um exemplo com três frames:
| Frame 1 | Frame 2 | Frame 3 |
|---|---|---|
| X (strike) | 5/ (spare) | 9 0 (frame aberto) |
O frame 1 é (10 + 5 + 5) = 20
O frame 2 é (5 + 5 + 9) = 19
O frame 3 é (9 + 0) = 9
Isso significa que o total acumulado até aqui é 48.
O décimo frame da partida é um caso especial. Se alguém fizer um spare ou um strike, recebe uma ou duas bolas de preenchimento, respectivamente. As bolas de preenchimento existem para calcular o total do 10º frame. Fazer um strike ou um spare na bola de preenchimento não dá ao jogador mais bolas de preenchimento. O valor total do 10º frame é o número total de pinos derrubados.
Para um décimo frame de X1/ (um strike e um spare), o valor total é 20.
Para um décimo frame de XXX (três strikes), o valor total é 30.
Escreva um código que acompanhe a pontuação de uma partida de boliche. Ele deve dar suporte a duas operações:
roll(pins : int) é chamado sempre que o jogador lança uma bola.
O argumento é o número de pinos derrubados.score() : int é chamado apenas no final da partida.
Ele retorna a pontuação total daquela partida.Às vezes é necessário lançar uma exceção. Quando você faz isso, inclua sempre uma mensagem de erro significativa para indicar qual é a origem do erro. Isso deixa seu código mais legível e ajuda bastante na depuração. Nas situações em que você sabe que a origem do erro será de um tipo específico, você pode optar por lançar um dos tipos de erro embutidos, mas ainda assim deve incluir uma mensagem significativa.
Este exercício em particular exige que você use a instrução raise para "lançar" um erro quando as regras de pontuação ou de jogo não forem seguidas. Os testes só vão passar se você fizer o raise da exception e incluir uma mensagem junto com ela.
Para lançar um ValueError com uma mensagem, escreva a mensagem como argumento do tipo da exception:
# example when a bonus is attempted with an open frame
raise IndexError("cannot throw bonus with an open tenth frame")
# example when fill balls are invalid
raise ValueError("invalid fill balls")
Crie sua conta no Exercism para aprender e dominar Python com 17 conceitos146 exercícios e mentoria humana de verdade, tudo de graça.