Pontua um jogo de bowling.
O bowling é um jogo em que os jogadores lançam uma bola pesada para derrubar pinos dispostos em triângulo. Escreve código para acompanhar a pontuação de um jogo de bowling.
O jogo é composto por 10 frames. Um frame é composto por um ou dois lançamentos da bola, com 10 pinos de pé no início do frame. Há três casos na contabilização de um frame.
Um frame aberto é aquele em que se regista uma pontuação inferior a 10. 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 imediatamente seguido de outro strike, o valor do primeiro strike não pode ser determinado enquanto a bola não for lançada mais uma vez.
Aqui está 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
Isto significa que o total acumulado atual é 48.
O décimo frame do jogo é um caso especial. Se alguém fizer um spare ou um strike, recebe uma ou duas bolas adicionais, respetivamente. As bolas adicionais existem para calcular o total do 10.º frame. Fazer um strike ou um spare na bola adicional não dá ao jogador mais bolas adicionais. O valor total do 10.º frame é o número total de pinos derrubados.
Num décimo frame de X1/ (um strike e um spare), o valor total é 20.
Num décimo frame de XXX (três strikes), o valor total é 30.
Escreve código para acompanhar a pontuação de um jogo de bowling. Deve suportar duas operações:
roll(pins : int) é chamado sempre que o jogador lança a bola.
O argumento é o número de pinos derrubados.score() : int é chamado apenas no final do jogo.
Devolve a pontuação total desse jogo.Define uma tupla game e um construtor <game> ( -- game ) que devolve um novo jogo sem lançamentos.
Disponibiliza estas palavras que operam sobre um jogo:
roll ( pins game -- ): regista que foram derrubados pins pinos. Lança um erro quando o lançamento é inválido:
"Negative roll is invalid" para um número negativo de pinos."Cannot roll after game is over" quando todos os dez frames (e quaisquer lançamentos adicionais) tiverem sido lançados."Pin count exceeds pins on the lane" quando são derrubados mais pinos do que os que estão de pé.score ( game -- n ): a pontuação total do jogo. Lança "Score cannot be taken until the end of the game" quando o jogo ainda não está completo.Repara que roll oculta a palavra de baralhamento roll do vocabulário kernel. O conjunto de testes resolve a ambiguidade com FROM: bowling => roll ;.
Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.