используя словарь, пытаясь найти значение и ключ (игра в покер) - PullRequest
0 голосов
/ 04 марта 2011

Я пытаюсь создать основную игру в покер, используя c #.

До сих пор я получал карты случайным образом, используя эти три линии:

Suit suit = (Suit)randomCardSelector.Next(4);
Value value = (Value)randomCardSelector.Next(13);
Card abc = new Card(suit, value);

Теперь то, что я пытаюсьДостигается то, что раздача карт только тем, кто еще не сдается.Теперь, чтобы сделать это, я создал две коллекции «словаря», одну под названием «колода», а другую - «сдал».Я думал о том, чтобы изначально добавить все карты в колоду, а затем, когда они сдаются на стол, они должны быть удалены из колоды и добавлены для раздачи с использованием уникального ключа карт.

Что, по вашему мнению, будет лучшим способом продвижения?об этом?Я в принципе не хочу дублировать карты, например комбинация Ace Hearts и Ace Hearts в одной колоде.Как я могу предотвратить это?

Ответы [ 4 ]

2 голосов
/ 04 марта 2011

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

Когда вы раздаете карты, просто вытолкните следующую карту из стопки.

Есть еще один вопрос здесь о том, как перетасовать список в C #.

0 голосов
/ 04 марта 2011

Ваш Dictionary подход должен сработать, но я думаю, что самым простым способом будет сгенерировать List карточек, сначала в некотором естественном порядке, а затем перемешать их. Затем просто следите за тем, сколько карт из списка вы раздали. Когда дело доходит до перетасовки карт, вы (и все, кто еще не читал это) должны прочитать эту превосходную статью о ловушках перетасовки .

0 голосов
/ 04 марта 2011

Обычно это не так. Большинство карточных игр, которые я видел, имеют структуру колоды, которая обычно представляет собой массив значений [0..51] в диапазоне 0..51. Для каждого значения мастью является (cardValue / 13), а значением является (cardValue% 13). Вы изначально создаете колоду для новой игры, инициализируя свой массив до 0..51, а затем случайным образом меняя карту в каждой позиции на карту в другой случайной позиции. После того, как вы это сделали, вы просто выбираете карты с одного конца и «сдаете» игрокам по мере необходимости.

0 голосов
/ 04 марта 2011

Я думаю, что самый простой способ будет:

A: Переопределите функцию GetHashCode() и создайте хеш, используя значение карты и масти карты. B: Реализуйте IEquatable<Card> и сравните как костюмы, так и значения.

Тогда, просто имейте одну HashSet<Card>, которая содержит все раздающиеся карты (нет необходимости в словаре), и попросите генератор карт проверить, существует ли карта уже.

...