Bowling

Bowling

Difícil

Instruções

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.

Como pontuar o 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.

Requisitos

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.

Palavras

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 ;.

Editar via GitHub A ligação abre numa nova janela ou separador
Factor Exercism

Estás pronto para começar Bowling?

Inscreve-te no Exercism para aprenderes e dominares Factor com 47 conceitos163 exercícios, e mentoria humana real, tudo grátis.