Zähle die Punkte eines Bowling-Spiels.
Bowling ist ein Spiel, bei dem die Spieler eine schwere Kugel rollen, um Pins umzuwerfen, die in einem Dreieck aufgestellt sind. Schreibe Code, der die Punktzahl eines Bowling-Spiels mitverfolgt.
Das Spiel besteht aus 10 Frames. Ein Frame besteht aus einem oder zwei Würfen, wobei zu Beginn des Frames 10 Pins stehen. Für die Berechnung eines Frames gibt es drei Fälle.
Bei einem offenen Frame wird für den Frame eine Punktzahl von weniger als 10 notiert. Die Punktzahl für den Frame ist dann die Anzahl der umgeworfenen Pins.
Bei einem Spare werden alle zehn Pins mit dem zweiten Wurf umgeworfen. Der Gesamtwert eines Spares ist 10 plus die Anzahl der Pins, die mit dem nächsten Wurf umgeworfen werden.
Bei einem Strike werden alle zehn Pins mit dem ersten Wurf umgeworfen. Der Gesamtwert eines Strikes ist 10 plus die Anzahl der Pins, die in den nächsten beiden Würfen umgeworfen werden. Folgt auf einen Strike direkt ein zweiter Strike, kann der Wert des ersten Strikes erst bestimmt werden, wenn die Kugel noch einmal geworfen wird.
Hier ist ein Beispiel mit drei Frames:
| Frame 1 | Frame 2 | Frame 3 |
|---|---|---|
| X (Strike) | 5/ (Spare) | 9 0 (offener Frame) |
Frame 1 ergibt (10 + 5 + 5) = 20
Frame 2 ergibt (5 + 5 + 9) = 19
Frame 3 ergibt (9 + 0) = 9
Damit beträgt die aktuelle laufende Gesamtsumme 48.
Der zehnte Frame im Spiel ist ein Sonderfall. Wirft jemand einen Strike oder ein Spare, bekommt diese Person einen bzw. zwei Zusatzbälle. Die Zusatzbälle dienen dazu, die Gesamtsumme des 10. Frames zu berechnen. Ein Strike oder ein Spare auf einem Zusatzball verschafft dem Spieler keine weiteren Zusatzbälle. Der Gesamtwert des 10. Frames ist die Gesamtzahl der umgeworfenen Pins.
Bei einem zehnten Frame von X1/ (Strike und Spare) beträgt der Gesamtwert 20.
Bei einem zehnten Frame von XXX (drei Strikes) beträgt der Gesamtwert 30.
Schreibe Code, der die Punktzahl eines Bowling-Spiels mitverfolgt. Der Code sollte zwei Operationen unterstützen:
roll(pins : int) wird jedes Mal aufgerufen, wenn der Spieler eine Kugel wirft.
Das Argument ist die Anzahl der umgeworfenen Pins.score() : int wird nur ganz am Ende des Spiels aufgerufen.
Die Funktion gibt die Gesamtpunktzahl für dieses Spiel zurück.Melde dich bei Exercism an, um OCaml mit 60 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.