Assegna il punteggio a una partita di bowling.
Il bowling è un gioco in cui i giocatori lanciano una palla pesante per abbattere dei birilli disposti a triangolo. Scrivi il codice per tenere traccia del punteggio di una partita di bowling.
La partita è composta da 10 frame. Un frame è formato da uno o due lanci della palla, con 10 birilli in piedi all'inizio del frame. Ci sono tre casi per il calcolo del punteggio di un frame.
Un frame aperto è un frame in cui si registra un punteggio inferiore a 10. In questo caso il punteggio del frame è il numero di birilli abbattuti.
Uno spare è un frame in cui tutti e dieci i birilli vengono abbattuti con il secondo lancio. Il valore totale di uno spare è 10 più il numero di birilli abbattuti nel lancio successivo.
Uno strike è un frame in cui tutti e dieci i birilli vengono abbattuti con il primo lancio. Il valore totale di uno strike è 10 più il numero di birilli abbattuti nei due lanci successivi. Se a uno strike segue immediatamente un secondo strike, il valore del primo strike non può essere determinato finché la palla non viene lanciata un'altra volta.
Ecco un esempio con tre frame:
| Frame 1 | Frame 2 | Frame 3 |
|---|---|---|
| X (strike) | 5/ (spare) | 9 0 (frame aperto) |
Il frame 1 è (10 + 5 + 5) = 20
Il frame 2 è (5 + 5 + 9) = 19
Il frame 3 è (9 + 0) = 9
Questo significa che il totale corrente è 48.
Il decimo frame è un caso speciale. Se si fa uno spare o uno strike, si ottengono rispettivamente uno o due tiri supplementari. I tiri supplementari servono a calcolare il totale del decimo frame. Fare strike o spare con il tiro supplementare non dà al giocatore altri tiri supplementari. Il valore totale del decimo frame è il numero totale di birilli abbattuti.
Per un decimo frame di X1/ (strike e spare), il valore totale è 20.
Per un decimo frame di XXX (tre strike), il valore totale è 30.
Scrivi il codice per tenere traccia del punteggio di una partita di bowling. Deve supportare due operazioni:
roll(pins : int) viene chiamata ogni volta che il giocatore lancia la palla.
L'argomento è il numero di birilli abbattuti.score() : int viene chiamata solo alla fine della partita.
Restituisce il punteggio totale di quella partita.Definisci una tupla game e un costruttore <game> ( -- game ) che restituisce una nuova partita senza tiri.
Fornisci queste parole che operano su una partita:
roll ( pins game -- ): registra che sono stati abbattuti pins birilli. Lancia un errore quando il tiro non è valido:
"Negative roll is invalid" per un numero negativo di birilli."Cannot roll after game is over" una volta che tutti e dieci i frame (e gli eventuali tiri supplementari) sono stati lanciati."Pin count exceeds pins on the lane" quando vengono abbattuti più birilli di quanti ne siano in piedi.score ( game -- n ): il punteggio totale della partita. Lancia "Score cannot be taken until the end of the game" quando la partita non è ancora completa.Nota che roll nasconde la parola roll di mescolamento del vocabolario kernel. La suite di test risolve l'ambiguità con FROM: bowling => roll ;.
Iscriviti a Exercism per imparare e padroneggiare Factor con 47 concetti163 esercizi e il mentoring di persone reali, tutto gratis.