Какова лучшая структура данных для хранения игральных карт, находящихся в руке игрока? - PullRequest
8 голосов
/ 03 февраля 2012

Я новичок в Java, и в настоящее время я создаю карточную игру, такую ​​как gin rummy для Android.Я хочу знать, какова лучшая реализация для создания класса Hand?Как лучше всего хранить карту, возвращаемую Deck.dealt ()?

  1. Array
  2. ArrayList
  3. Vector
  4. HashSet
  5. LinkedList

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

Ответы [ 6 ]

24 голосов
/ 03 февраля 2012

Если вы действительно хотите понять нюансы между типами коллекций, то здесь.

List технически не подходит, за исключением случаев, когда игра Bohnanza (что, хм, одна из величайших карточных игр всех времен, но я позволю мне закончить).

List говорит, среди прочего, что одна рука, содержащая туза и короля треф, а другая рука, содержащая короля и туза треф, в основном не является той же рукой. Это гораздо более сильная зависимость от порядка, чем просто «ну, я хочу вспомнить порядок, в котором пользователь хочет видеть свои карты», - это свойство, которое имеют тонны коллекций, не относящихся к списку, например LinkedHashSet и Guava's ImmutableSet.

List также подразумевает, что к карточке, которая находится в индексе N, придано особое значение. Это не относится к карточной игре, которую я знаю.

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

Чтобы разрешить дубликаты, но при этом иметь равенство, не зависящее от порядка, используется тип Multiset Гуавы. Например HashMultiset или ImmutableMultiset. Обратите внимание, что большинство реализаций мультимножества представляют несколько «равных» карт, храня только карту и счетчик, поэтому при итерации по ним дубликаты карты, которая находится у вас в руке, всегда должны появляться вместе. Если важно позволить пользователю свободно контролировать порядок карт в своей руке, вам понадобится LinkedListMultiset.

Теперь, когда время урока закончилось ... хорошо, давайте будем честными. Вызов myHand.equals(yourHand) или использование всей руки в качестве ключа для Map - это не на самом деле , что вы когда-либо собираетесь делать ... так что продолжайте и используйте ArrayList, вы ' все будет хорошо. : -)

3 голосов
/ 03 февраля 2012

Я думаю, что хорошей идеей будет использование интерфейса (List, если элемент упорядочен, или Set, если элементы не упорядочены. Вы можете использовать реализацию, которую вы предпочитаете, например:

List<Card> deck = new ArrayList<Card>();

или

Set<Card> deck = new HashSet<Card>();
1 голос
/ 03 февраля 2012

Во-первых, использование Vector не рекомендуется в последних версиях Java, поэтому вы, вероятно, можете его игнорировать.

Во-вторых, как вы узнаете, если вы прочитали Javadoc об этих оставшихся классах, у них всех есть свои преимущества или недостатки. У некоторых есть порядок, у некоторых могут быть повторяющиеся значения, у некоторых нет и так далее. Поэтому я думаю, что лучший подход - это написать некоторый псевдокод для вашего приложения, который не основан на определенном классе (просто напишите такие вещи, как «добавить карту в руку», «удалить карту из руки»). Получив этот псевдокод, вы сможете более четко увидеть ваши требования; Вы хотите держать карты в руке в определенном порядке? Вы хотите иметь возможность получить карты из руки с помощью ключа?

Тогда ваш выбор будет более понятным.

1 голос
/ 03 февраля 2012

Ну, HashSet быстрее (насколько я знаю), но если вы хотите сделать карточную игру, то, возможно, вы захотите отсортировать карты. Вот почему я бы предложил использовать список. Если вы новичок, то, возможно, лучше всего использовать ArrayList. Это легко использовать и понять. По крайней мере, это то, что я бы сделал. Если вы хотите узнать больше, я предлагаю прочитать об уникальных свойствах каждого из них, чтобы вы могли решить для себя. И да, как сказал ранее greuze, вам следует использовать интерфейс для большей гибкости.

1 голос
/ 03 февраля 2012

Храните их в ArrayList.

Карты в руке находятся в определенном порядке, а не в неупорядоченной стопке.Этот порядок сохраняется в List более Set.

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

Имейте в виду, что до тех пор, пока вы правильно проектируете свой класс Hand, вы всегда можете легко изменить эту структуру данных в любой момент в будущем.Пока вы помните об этом с любым классом, который вы разрабатываете, вы всегда можете изменить его, если поймете, что вам нужно что-то другое.

0 голосов
/ 03 февраля 2012

Хранение колоды в Списке имеет смысл, поскольку поддерживает порядок.Я склонен по умолчанию использовать Lists.newArrayList () для создания списка.Списки является частью гуавы.Я настоятельно рекомендую использовать и знакомиться с Гуавой, поскольку у нее много полезных предложений.

Было бы разумно иметь возможность держать руку в некоторой структуре данных, которую можно легко отсортировать по порядку.чтобы было легче сравнивать руки.OTOH, IIRC, руки джин-рамми не такие большие.

...