保齡球

保齡球

困難

說明

為一場保齡球比賽計分。

保齡球是一種遊戲,玩家滾動沉重的球,擊倒排成三角形的球瓶。 請寫程式記錄一場保齡球比賽的分數。

保齡球計分

一場比賽由 10 格組成。 每一格由一次或兩次投球組成,每格開始時有 10 個球瓶立著。 每一格的計分方式有三種情況。

  • 開放格是指該格得分低於 10 分。 此時該格的分數就是擊倒的球瓶數。

  • 補中是指第二次投球擊倒全部十個球瓶。 補中的總分是 10 加上下一次投球擊倒的球瓶數。

  • 全倒是指第一次投球就擊倒全部十個球瓶。 全倒的總分是 10 加上接下來兩次投球擊倒的球瓶數。 如果全倒之後緊接著又出現一次全倒,就必須再投一次球,才能確定第一次全倒的分數。

以下是一個三格的例子:

第 1 格 第 2 格 第 3 格
X(全倒) 5/(補中) 9 0(開放格)

第 1 格是 (10 + 5 + 5) = 20

第 2 格是 (5 + 5 + 9) = 19

第 3 格是 (9 + 0) = 9

這表示目前的累計總分是 48。

比賽中的第 10 格是特殊情況。 如果有人投出補中或全倒,就能分別獲得一次或兩次加球。 加球的存在是為了計算第 10 格的總分。 在加球時投出全倒或補中,並不會讓玩家獲得更多加球。 第 10 格的總分就是擊倒的球瓶總數。

若第 10 格是 X1/(一次全倒和一次補中),總分是 20。

若第 10 格是 XXX(三次全倒),總分是 30。

需求

請寫程式記錄一場保齡球比賽的分數。 它應該支援兩種操作:

  • 玩家每次投球時會呼叫 roll(pins : int)。 引數是擊倒的球瓶數。
  • score() : int 只會在比賽完全結束時呼叫。 它會回傳該場比賽的總分。

詞

定義一個game元組,以及一個建構子<game> ( -- game ),它會回傳一個還沒有任何投球的新遊戲。

請提供這些可作用於遊戲的詞:

  • roll ( pins game -- ):記錄有pins根球瓶被擊倒。當投球無效時,請拋出錯誤:
    • "Negative roll is invalid":球瓶數為負數時。
    • "Cannot roll after game is over":十局(以及任何補球)全部投完之後,還要再投球時。
    • "Pin count exceeds pins on the lane":被擊倒的球瓶比球道上還站著的球瓶多時。
  • score ( game -- n ):整場遊戲的總分。遊戲還沒完成時,拋出"Score cannot be taken until the end of the game"。

注意,roll會遮蔽kernel詞彙表中洗牌的roll詞。測試套件用FROM: bowling => roll ;來區分。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Factor Exercism

準備好開始 保齡球 了嗎?

註冊 Exercism,透過 47 個概念163 個練習 和真人引導來學習並精通 Factor,全部免費。