Тестовая задача “Ханаби”
В этой задаче на объектно-ориентированное проектирование нужно создать систему классов,
моделирующую карточную игру.
Правила игры
Мы используем упрощенные правила игры Ханаби. Они отличаются от стандартных.
Два участника играют специальными картами. У каждой карты есть цвет (красный, зеленый,
синий, желтый и белый) и достоинство (от 1 до 5).
На вход программе подается список карт колоды. В колоде есть как минимум 11 карт. Первые 5
карт достаются первому игроку. Вторые 5 карт — второму.
Начало новой игры описывается такой входной строкой:
Start new game with deck R1 G2 B3 W4 Y5 R1 R1 B1 B2 W1 W2 W1
Эта игра начнется со следующими картами:
Первый игрок: R1 G2 B3 W4 Y5 (красная единица, зеленая двойка и т.д)
Второй игрок: R1 R1 B1 B2 W1
Верхняя карта колоды после такой раздачи — W2 (белая двойка)
Игра кооперативная и задача у игроков общая — выложить на стол как можно больше карт,
пока игра не закончилась. Игроки держат карты рубашками к себе, то есть не видят своих карт,
но видят чужие. Игроки не знают ни состав колоды, ни порядок карт в колоде.
Игроки ходят по очереди и пропускать ход нельзя. Ход — это одно из четырех действий:
- Разыграть карту. Игрок выбирает одну из своих карт и кладет на стол.
Играть можно только карту, которой еще нет на столе. При этом достоинство карты
должно быть единицей или на столе уже должна быть карта того же цвета, но на
единицу меньшего достоинства. То есть разыгранная карта должна продолжать
возрастающую последовательность одного цвета или начинать последовательность
нового цвета.
Сыгранная карта удаляется из руки и помещается на стол. Игрок добирает карту из
колоды себе в руку, в конец списка карт.
Если корректно сыграть карту нельзя, то карта помещается в сброс, а игра немедленно
завершается.
Пример: Play card 0 — текущий игрок выкладывает первую карту
Если игроку достоверно не известно, можно ли сыграть карту корректно, но он все же
успешно разыгрывает эту карту, то ход считается рискованным. В этой задаче
рискованными называются только такие ходы.
-
Сбросить карту. Игрок выбирает одну из своих карт, помещает её в сброс и добирает
одну карту из колоды себе в руку.
Пример: Drop card 4 — текущий игрок сбрасывает последнюю карту из руки -
Подсказать цвет. Игрок называет один из цветов и указывает на все карты этого цвета в
чужой руке. Цвет, которого нет в чужой руке, называть нельзя.
Пример: Tell color Red for cards 0 1 2 3 4 — текущий игрок сообщает другому
игроку, что у него все карты красные -
Подсказать достоинство. Игрок называет достоинство и указывает на все карты этого
достоинства в чужой руке. Достоинство, которого нет в чужой руке называть нельзя.
Пример: Tell rank 1 for cards 2 4 — текущий игрок сообщает, что у другого
игрока в руке вторая и четвертая карты (нумерация с нуля) — единицы.
Игра завершается в трех случаях:
-
Когда колода заканчивается. То есть, последняя карта колоды никогда не играет.
-
Когда на столе 25 карт. То есть, когда больше ни одну карту выложить нельзя.
-
Когда один из игроков делает некорректный ход: разыгрывает некорректную карту или
сообщает другому игроку ложную или неполную информацию о его картах.
Все ходы после завершения игры нужно игнорировать.
Постановка задачи
Программе будут вводить через консоль описание игр одна за другой. Для каждой
завершенной игры из входных данных программа должна вывести одну строку, содержащую
номер хода, на котором игра завершилась, количество корректно сыгранных карт, а также
количество успешных рискованных ходов.