Домашнее задание 8: Блэкджек

Домашнее задание 8: Блэкджек. Цель этого задания - попрактиковаться в использовании списков массивов и интерфейсов. Конкретные цели: реализовать 3 интерфейса объектов в игре в блэкджек.

Цель этого задания - попрактиковаться в использовании списков массивов и интерфейсов. Конкретные цели заключаются в следующем:

  • Реализуйте 3 интерфейса объектов в игре в блэкджек.
  • Ознакомьтесь с перебором и изменением списков массивов

B. Справочная информация

Блэкджек - популярная карточная игра, распространенная как настольная игра в казино. Цель блэкджека - вытянуть карты, набрав как можно ближе к 21 очку, не выходя за рамки.

В блэкджеке используется стандартная колода из 52 карт с четырьмя возможными мастями: сердечками, бубнами, трефами и пиками и 13 возможными значениями. Они показаны на изображении ниже.

У каждой карты есть «счет». Все карты в руке складываются в надежде получить 21 без перехода.

  • Числовые карты (от 2 до 10) дают столько же очков, сколько и их количество. То есть, 2 карты приносят 2 очка, 10 карта - 10 очков, 5 карта - 5 очков и т. Д.
  • «Лицевые карты» (валеты, дамы и короли) приносят 10 очков.
  • Туз может приносить ЛИБО 1 очко или 11 очков, в зависимости от того, какой результат дает "лучший" результат (лучший - это ближайший к 21 баллу без превышения).
  • Масть карты не влияет на ее счет в блэкджеке.

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

Лучшая ситуация для игрока - получить туз и карту стоимостью 10 очков. Если это произойдет, у игрока уже есть 21 очко с двумя картами, и он автоматически выигрывает (даже если у дилера также 21 очко). Эта рука называется блэкджеком.

В большинстве случаев в блэкджеке и игрок, и дилер начинают с двумя картами в руке, причем у игрока обе карты открыты, поэтому их значение и масть видны, в то время как дилер показывает только одну карту лицом вверх, а другую. «спрятан» лицом вниз. Затем игрок решает «ударить» (взять еще одну карту, чтобы добавить в руку) или «встать» (не брать больше карт и закончить свой ход. Как только вы встанете, вы больше не сможете брать карты. Однако, если вы «ударите» ", и ваша сумма превышает 21, вы автоматически проигрываете, и дилер никогда не должен делать свою очередь, выигрывая автоматически.

В блэкджеке игрок всегда должен играть свой ход перед дилером. Это означает, что решение игрока «ударить» основано на риске превысить 21. Если у игрока, например, 17, маловероятно, что он должен «ударить», поскольку вероятность того, что игрок "перебор" (перебор 21). Точно так же, если у вас общий счет 5, вы обязательно должны попасть, поскольку почти наверняка у дилера будет более высокий счет только с двумя картами. То есть, если вы не любите опасно жить.

Поскольку дилер всегда идет за игроком, «дом» (или казино) имеет небольшое преимущество, выигрывая примерно на 5% чаще, чем игрок. Эй, азартные игры - это бизнес.

C. Ваша программа

В этом задании вы напишете класс карты, руки и колоды. Каждый класс реализует интерфейс HW8Card, HW8Hand и HW8Deck соответственно. Вы реализуете все методы интерфейсов в соответствующих файлах классов.

  • Карта реализует функции, связанные с одной картой в стандартной колоде из 52, используемых в блэкджеке.
  • В Deck реализованы функции, имитирующие поведение реальной колоды карт.
  • Hand реализует функции, которые добавляют очков в блэкджек.

D. Разработка требований и интерфейса

  • Загрузите hw8.zip и распакуйте его в свою папку для выполнения домашнего задания. Этот zip-файл содержит три файла, которые вы будете редактировать, а также три интерфейса (HW8Card, HW8Hand и HW8Deck) и Blackjack.java, который запускает игру в блэкджек с использованием кода, который вы напишете.
    • Ни в коем случае не редактируйте HW8Card, HW8Hand, HW8Deck или Blackjack.java.
    • HW8Card, HW8Hand и HW8Deck - это интерфейсы. Каждый отправленный вами файл реализует эти интерфейсы. Это делается путем написания реализации для каждой функции в интерфейсе.
    • Blackjack.java - это «Главный» класс в этой программе, который использует другие файлы (включая ваш) для запуска программы Blackjack. Этот файл будет работать только тогда, когда вы выполните домашнее задание и сможете запустить файл для имитации игры в блэкджек.

    В этом разделе вы напишете новый java-файл Card.java, реализующий HW8Card.

    A. Интерфейс HW8Card

    hw8.zip содержит интерфейс HW8Card, представляющий стандартную карту из колоды 52. API выглядит следующим образом:

    Б. Класс карты

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

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

    • Масть представляет собой Строку, которая должна иметь вид «Червы», «Трефы», «Бубны» или «Пики». Если это любое другое значение, бросьте новое исключение IllegalArgumentException с полезным сообщением об ошибке.
    • Значение представляет собой строку, которая должна быть любой из «2», «3», «4». «10», «J» (валет), «Q» (дама), «K» (король) или «A» (туз). Если это любое другое значение, бросьте новое исключение IllegalArgumentException с полезным сообщением об ошибке.

    Жизненно важно, чтобы ваш метод toString () был правильным. Это означает, что должны быть напечатаны две червы:

    Помните, что туз - это «A», поэтому для трефового туза вы должны распечатать.

    То же самое и с другими «лицевыми» картами, поэтому валет, дама и король должны быть J, Q и K соответственно.

    Реализуйте класс HW8Hand, написав Hand.java

    А. Ручные поля

    Класс руки будет иметь одно поле, ArrayList , которое содержит карты в руке. Помните, что поскольку Card реализует интерфейс HW8Card, каждый экземпляр Card является экземпляром HW8Card. Таким образом, мы можем заполнить ArrayList HW8Card s с помощью Card s

    У руки должен быть конструктор с нулевым аргументом, который инициализирует ArrayList экземпляра.

    Чтобы добавить карту, используйте функцию List add (E e), где E - это тип HW8Card.

    Для функций подсчета очков рассмотрим комбинацию «Туз червей, туз бубен, 9 червей». Твердый счет этой руки составляет 1 + 1 + 9 или 11, поскольку каждый туз считается равным 1 очку. Мягкий счет равен 21, так как первый туз рассматривается как 11, поэтому 11 + 1 + 9. Это означает, что общая оценка руки равна 21.

    Для сравнения, рассмотрим руку трех королей. Здесь и жесткий, и мягкий счет равны 30, поскольку нет туза, что означает, что общий счет равен 30. Поскольку каждый счет больше 21, эта рука считается перебором, что означает, что обладатель этой руки проигрывает.

    Не переусердствуйте с getDealerShowing (). Руки игрока и дилера представлены HW8Hand. Этот метод должен просто использовать метод List get (int i), чтобы вернуть вторую карту в руке (то есть карту с индексом 1). Не беспокойтесь о том, чтобы «доказать», что рука принадлежит дилеру. Просто верните вторую карту. Игра правильно обрабатывает эту функцию.

    Наконец, убедитесь, что метод toString () работает. Этот метод используется в наших оценочных тестах. Например, предположим, что рука на картинке выше (с картами, пронумерованными слева направо) должна печатать точно: «2 пик, 5 пик, 2 червей, 7 червей». Обратите внимание на запятую, за которой следует один пробел между каждой карточкой. Также обратите внимание, что после последней карточки нет запятой или пробелов.

    Реализуйте класс HW8Deck в файле с именем Deck.java.

    A. Deck Fields

    Класс колоды, как и рука, будет иметь одно поле, ArrayList , которое содержит карты в колоде. Помните, что поскольку Card реализует интерфейс HW8Card, каждый экземпляр Card является экземпляром HW8Card. Таким образом, мы можем заполнить ArrayList HW8Card s с помощью Card s.

    resetDeck должен вернуть колоду в исходное состояние (как если бы вы только что открыли новую колоду из 52 карт). Это означает, что у вас будет по одной карте для каждого достоинства каждой масти. Пример: 2 пик, 2 червы, 2 треф, 2 бубен, 3 пик, 3 червей, 3 треф, 3 бубен и т. Д. Для всех значений 2-10, J, Q, K и A. Не пишите 52 строки кода. Найдите систематический способ сделать это. Напишите resetDeck () перед написанием и тестированием любых других методов

    Конструктор колоды должен иметь нулевые аргументы и должен как инициализировать ArrayList карт, так и заполнить колоду 52 стандартными картами. Не записывайте повторяющийся код из resetDeck. Используйте в конструкторе метод resetDeck.

    Для метода перемешивания используйте статическую функцию Collections.shuffle (Список 1). Эта функция рандомизирует порядок элементов в списке на месте, и ничего не возвращает.

    Для drawCard рассмотрите функции, которые мы рассмотрели в классе, относящемся к интерфейсу List, и используйте правильную функцию, чтобы вытянуть одну карту из верхней части колоды. После того, как вы возьмете карту, количество карт в колоде должно уменьшиться на 1. Если карт для взятия нет, бросить IllegalStateException

    ToString должен возвращать строку, содержащую количество карт в колоде. НЕ возвращайте строку, содержащую строковое представление всех карт в колоде. Просто скажите размер колоды.