Підрахуйте очки за гру в боулінг.
Боулінг - це гра, у якій гравці котять важку кулю, щоб збити кеглі, розставлені трикутником. Напишіть код, який веде облік очок за гру в боулінг.
Гра складається з 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 викликають лише в самому кінці гри.
Вона повертає загальну кількість очок за цю гру.Іноді виникає потреба викликати виняток. У такому разі завжди варто додати змістовне повідомлення про помилку, яке вказує, у чому джерело помилки. Це робить код зрозумілішим і значно полегшує налагодження. Якщо ми знаємо, що джерело помилки належить до певного типу, можна викликати один із вбудованих типів помилок, але повідомлення все одно має бути змістовним.
Ця вправа вимагає, щоб ми використали інструкцію raise, аби «кинути» помилку, коли не дотримано правил підрахунку очок або правил гри. Тести пройдуть лише тоді, коли ми і застосуємо raise до exception, і додамо до нього повідомлення.
Щоб викликати ValueError з повідомленням, запишімо повідомлення як аргумент типу exception:
# example when a bonus is attempted with an open frame
raise IndexError("cannot throw bonus with an open tenth frame")
# example when fill balls are invalid
raise ValueError("invalid fill balls")
Зареєструйтеся на Exercism, щоб вивчати й опановувати Python, а також 17 концепцій146 вправ та справжнє наставництво від людей, і все це безкоштовно.