Боулінг

Боулінг

Складна

Вказівки

Підрахуйте очки за гру в боулінг.

Боулінг - це гра, у якій гравці котять важку кулю, щоб збити кеглі, розставлені трикутником. Напишіть код, який веде облік очок за гру в боулінг.

Підрахунок очок у боулінгу

Гра складається з 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-го фрейму дорівнює загальній кількості збитих кеглів.

Для десятого фрейму X1/ (страйк і спеа) загальна вартість становить 20.

Для десятого фрейму 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 затінює слово roll для перемішування зі словника kernel. Набір тестів усуває неоднозначність за допомогою FROM: bowling => roll ;.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Factor Exercism

Час розпочати Боулінг?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Factor, а також 47 концепцій163 вправи та справжнє наставництво від людей, і все це безкоштовно.