Нужно написать классы для проведения матча в минигольф по двум разным системам правил.
На корте имеется H
лунок, они строго упорядочены. В игре принимает участие N
игроков, им так же присвоены номера.
У каждого игрока есть свой мяч, который он пытается загнать в лунку. Игроки бьют по очереди. Первым на первой лунке бьет первый игрок, на второй — второй и т. д.
Лунка играется до тех пор, пока все игроки не забили свой мяч. Игроки, уже забившие, пропускают свой удар. Каждый игрок получает столько очков, сколько ударов он потратил (соответственно, чем меньше очков, тем лучше). Десятый удар защитывается автоматически, игрок получает 10 очков, удар не требуется.
Все игроки делают по одному удару. Если никто не забил, делают еще один круг. Если хоть кто-то забил, то забившие получают 1 очко, промахнувшиеся – 0 очков, лунка более не разыгрывается. Если за десять таких кругов никто не забил, все получают 0 очков и переходят к следующей лунке.
Нужно написать класс, объект которого – однократно протекающий матч. Должны поддерживаться следующие методы:
- конструктор — принимает количество лунок и массив с объектами класса
Player
(которые имеют только propertyname
). hit(success)
— сообщает матчу, что произошел очередной удар. КидаетRuntimeError
, если матч завершен.success
— булево значение, указываюшее, попал ли матч в лунку (по умолчаниюFalse
).finished
— property, содержащее булево значение.True
— матч закончен,False
— нет.get_winners()
— возвращает массив победителей в том же порядке, в которым игроки были переданы в конструктор. КидаетRuntimeError
, если матч еще не завершен.get_table()
— возвращает таблицу результатов. Этоlist
, в котором содержитсяH + 1
tuple-ов. Первый — имена игроков, остальные — очки игроков на соответсвующих лунках. Если результата еще нет, то tuple содержитNone
(причем, если игрок совершил 3 удара, но еще не забил, то это все ещеNone
, а не 3).
Нужно реализовать классы Player
, HitsMatch
и HolesMatch
.
К заданию прилагаются тесты, в которых можно лучше изучить интерфейс требуемых методов. Это тесты-сценарии, они не являются образцом хорошего юнит-тестирования. Нормальные юнит-тесты нужно дописать самостоятельно. "# minigolf"