Задача «Карточная игра "Go fish". Задача «Карточная игра "Go fish" Go fishing игра русская версия

Рыбалка – часть твоей жизни? Главный герой этой игры тоже очень любит ходить на рыбалку и практически каждый день ловит рыбу на расположенном возле него озере. Сегодня с самого утра он решил отправиться на рыбалку, чтобы получить свой максимальный улов. Если ты желаешь составить ему компанию, жми на старт и присоединяйся к игре. Для начала нужно выбрать наиболее удобное место, где можно будет комфортно расположиться со своим новым знакомым. Посмотри внимательно на экран, и ты увидишь, что он поделен на две части. Вверху будет находиться твой рыбак, а внизу плавающая в водоеме рыбка. Твоя цель – словить как можно больше рыбешек, но при этом нужно обращать внимание, что в воде плавают еще и другие предметы, которые нежелательно зацеплять удочкой. Если ты дотронешься до какой-нибудь железяки, то вполне можешь порвать леску, что очень нежелательно. Забрасывай удочку как можно дальше и старайся словить самую крупную рыбу.

от 2 до 6 игроков, лучше всего с 3 до 6.

Палуба

Стандартная колода для 52 карт.

Цель

Чтобы собрать большинство наборов из четырех.

Настройка

Пять карт раздаются каждому игроку, если задействованы три-шесть игроков. С двумя игроками раздаются по семь карт.

Все оставшиеся карты помещаются лицом вниз в стопку ничьей.

Геймплей

Случайно выберите игрока, чтобы идти первым.

В свою очередь, попросите игрока указать определенный ранг карты. Например: «Барб, пожалуйста, дайте мне свои 9». Вы должны иметь хотя бы одну карту требуемого звания.

Если у игрока, которого вы спрашиваете, есть карты требуемого звания, она должна предоставить вам все свои карты этого ранга. В этом примере Барс должен был дать вам все свои 9.

Если вы получаете одну или несколько карточек от игрока, которого вы спрашиваете, вы получаете еще один поворот. Вы можете спросить любого игрока за любой уровень, который у вас уже есть, включая тот, который вы только что просили.

Если у человека, которого вы просите, нет соответствующих карточек, они говорят: «Иди рыбу». Затем вы рисуете верхнюю карту из стопки ничьей.

Если вам выпадет карточка с запросом на ранг, покажите ее другим игрокам, и вы получите еще один поворот. Однако, если вы нарисуете карту, которую вы не задали, она станет очередным игроком. Вы держите обратную карту, независимо от ее ранга.

ПРИМЕЧАНИЕ: «Следующий игрок» - это тот, кто сказал: «Иди рыбу».

Когда вы собираете набор из четырех карт одного ранга, немедленно показывайте набор другим игроков и поместите четыре карты лицом вниз перед собой.

Победа

Go Fish продолжается до тех пор, пока у кого-то нет карт, оставшихся в руке, или закончится ничья. Победителем является игрок, у которого в то время есть большинство наборов из четырех.

Вариант один: конкретная карта

Вместо того, чтобы просить ранг, вы должны запросить определенную карту. Вы должны уже держать хотя бы одну карту такого ранга.

Например: «Чарли, пожалуйста, дай мне короля клубов». Если у Чарли есть это, он отдаст его тебе, и ты снова пойдешь. В противном случае он говорит: «Иди рыбу», и ты рисуешь из ничьей. Если вам выпадет карточка, которую вы просили, вы получите еще один поворот. Если вы нарисуете что-нибудь еще, теперь это очередь следующего игрока.

Прежде чем играть таким образом, все игроки должны договориться, можете ли вы попросить карту, которую у вас уже есть в руке. (Если вы попросите такую ​​карточку, вам придется ловить рыбу, и ваш ход закончится, но вам может быть полезно сделать это, чтобы другие игроки подумали, что вы не держите эту конкретную карту.)

Вариант Двое: Продолжайте играть

Когда заканчивается ничья, продолжайте играть, пока все карты не будут сгруппированы в четыре. Когда нить ничьей исчерпана, никто не говорит «Иди рыбу». Если вы спросите кого-нибудь за карту, которую у нее нет, это станет ее поворотом.

Задача

Произвести рефакторинг кода на C, реализующего детскую карточную игру Go Fish .

Исходный код

  • fish.c – код программы на одном из старых диалектов C, но, тем не менее, с минимальными модификациями собирается современными компиляторами.

Описание

Поскольку игра мало распространена в России, то приводим краткое описание правил.

  • В игре участвуют от 2 до 10 игроков (в данной программе реализовано 2 игрока).
  • Игра ведётся стандартной колодой на 52 карты .
  • Цель игры – собрать как можно больше стопок с картами одинакового достоинства (все двойки, все тузы, все десятки и т.п.)
  • В начале игры игрокам случайно раздаётся по 7 карт (или по 5 карт, если игроков 5 и более).
  • Оставшиеся карты складываются в общую стопку рубашкой вверх. Эта стопка называется "ocean" или "pool", т.е. "океан" или "бассейн", т.е. место откуда можно выудить рыбу.
  • Игроки ходят по очереди.
  • Игрок, к которому перешёл ход, задаёт противнику вопрос о картах определённого достоинства, например "у тебя есть семёрки?"
    • У игрока должна быть хотя бы одна карта того достоинства, которое он запрашивает у противника.
    • Если у противника запрошенных карт нет, то он отвечает "Go fish" – "сходи поймай", и игрок достаёт себе 1 карту из "океана" – общей колоды.
    • Если у противника есть карты запрошенного достоинства, то он отдаёт их задавшему вопрос.
    • Если игрок забирает у противника запрошенные карты, то ход остаётся у него, и он может сделать ещё один запрос на карту какого-либо достоинства.
    • Если игрок достаёт из общей стопки – "океана" карту запрошенного достоинства, то он получает право взять из общей стопки ещё одну карту. Таким образом возможна ситуация когда игрок подряд достаёт из общей колоды до 4 карт подряд.
  • После того, как игрок "выудил" из общей колоды карту не того достоинства которое запрашивал, ход переходит следующему игроку.
  • Как только у игрока набралось 4 карты одного достоинства, он их выкладывает рядом с собой в отдельную стопочку лицом вверх. Эти карты "выиграны" игроком, и в дальнейшей игре не участвуют.
  • Игра заканчивается после того, как все карты "выиграны" игроками. Побеждает тот, кто "выиграл" больше карт.

В процессе рефакторинга необходимо:

  • Переписать код на C++ (объявление переменных не в начале блока, а там где они реально используются, убрать анахронизмы языка C, и т. п.)
  • Избавиться от define"ов (объявление констант) и глобальных переменных.
  • Избавиться от goto .
  • Текстовый ввод / вывод производить через std::cout и т.п. Выделить текстовый ввод / вывод в отдельный класс / модуль.
  • Обработку ошибок перенести на механизм исключений и std::exception .
  • По возможности заменить примитивные структуры данных наподобие массивов на std::array либо std::vector , std::stack , std::queue или другие.
  • Выделить класс игрока, который занимается вводом / выводом, передачей указаний пользователя.
  • Выделить класс компьютерного игрока, который реализует некоторое AI.
  • Реализовать класс игры, который будет реализовывать правила игры, вызов игроков, сообщать игрокам доступную информацию.
  • Возможно использование