ボウリングのゲームのスコアを計算しましょう。
ボウリングは、三角形に並んだピンを倒すために、プレイヤーが重いボールを転がすゲームです。ボウリングのゲームのスコアを記録するコードを書きましょう。
ゲームは10フレームで構成されます。 フレームは、フレームの開始時に10本のピンが立っている状態で、1回または2回の投球からなります。 フレームの集計には3つのケースがあります。
オープンフレームとは、そのフレームに10未満のスコアが記録される場合です。 この場合、そのフレームのスコアは、倒したピンの本数です。
スペアとは、2投目ですべての10本のピンを倒す場合です。 スペアの合計値は、10に次の投球で倒したピンの本数を加えたものです。
ストライクとは、1投目ですべての10本のピンを倒す場合です。 ストライクの合計値は、10に次の2回の投球で倒したピンの本数を加えたものです。 ストライクの直後に2つ目のストライクが続いた場合、もう1回ボールを投げるまで、最初のストライクの値は決まりません。
3フレームの例を挙げます。
| フレーム1 | フレーム2 | フレーム3 |
|---|---|---|
| X(ストライク) | 5/(スペア) | 9 0(オープンフレーム) |
フレーム1は(10 + 5 + 5)= 20です。
フレーム2は(5 + 5 + 9)= 19です。
フレーム3は(9 + 0)= 9です。
つまり、その時点の合計スコアは48です。
ゲームの10フレーム目は特別なケースです。 スペアまたはストライクを出すと、それぞれ1回または2回のフィルボールが与えられます。 フィルボールは、10フレーム目の合計を計算するためにあります。 フィルボールでストライクやスペアを出しても、フィルボールがさらに増えることはありません。 10フレーム目の合計値は、倒したピンの総本数です。
10フレーム目がX1/(ストライクとスペア)の場合、合計値は20です。
10フレーム目がXXX(3つのストライク)の場合、合計値は30です。
ボウリングのゲームのスコアを記録するコードを書きましょう。 次の2つの操作をサポートする必要があります。
roll(pins : int)は、プレイヤーがボールを投げるたびに呼び出されます。
引数は、倒したピンの本数です。score() : intは、ゲームの最後にだけ呼び出されます。
そのゲームの合計スコアを返します。