Выбор лучшей руки из 7 карт (покер техасский холдем) - PullRequest
6 голосов
/ 03 мая 2011

Я реализовал игру в Техасский Холдем с использованием C #.
Я написал такие классы, как Карточка, Колода, Игрок, Стол и т. Д. ...
Например:

    Player player1 = new Player("player1");
    player1.Card1 = new Card(4, Symbol.Clubs, true);
    player1.Card2 = new Card(5, Symbol.Clubs, true);

    Card card1 = new Card(4, Symbol.Clubs, true);
    Card card2 = new Card(7, Symbol.Hearts, true);
    Card card3 = new Card(2, Symbol.Spades, true);
    Card card4 = new Card(4, Symbol.Diamonds, true);
    Card card5 = new Card(4, Symbol.Clubs, true);
    Card[] tableCards = {card1, card2, card3, card4, card5};

IЯ также написал несколько методов для оценки массива карт, таких как IsFlush, IsStraight, IsPair и т. д.
У меня вопрос, как выбрать лучшую комбинацию, если я получил 7 карт (2 руки, 5 из таблицы).
В этом примере кода это {4,4,4,4,7}.

Ответы [ 5 ]

3 голосов
/ 03 мая 2011

Не пишите свой код против 5-карточных рук.Вместо этого напишите это в общем.Итак,

ContainsStraightFlush
ContainsFourOfAKind
ContainsFullHouse

и т. Д.Съел бы коллекцию карт и вернул бы истину, если некоторое подмножество этих карт - стрит-флеш, четыре типа и т. д. соответственно.

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

2h Kh Qh Jh Th 9h 6c

ContainsStraightFlush вернет true, а затем вы можете выбрать 9h Th Jh Qh Kh как лучшую руку.

2 голосов
/ 03 мая 2011

Самый простой способ сделать это - сделать каждую коллекцию из 5 карт возможной и собрать ценность руки.Запомни лучшую руку.Есть только 21 комбинация для ситуации с 7 картами, так что это нехорошо с точки зрения оптимальности, но это не страшно, если вы не используете это для исследования.

foreach (possible 5 card combination in allCards)
    bestHand = Max(bestHand, GetValue(possible));

В качестве альтернативы вы можете создать массив, который имеет1 запись для каждой карты, и каждый индекс является указателем на новый массив, который имеет все 2 комбинации карт, и каждый индекс в этом является массивом для всех 3 комбинаций карт и т. Д. Если вы решите все возможные абстракции масти и рангаобщий размер структуры данных составляет около 128 МБ в памяти.На форумах 2 + 2 имеется эталонная реализация в c ++.

2 голосов
/ 03 мая 2011

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

1 голос
/ 03 мая 2011

Не делайте так, это ужасно медленно и на самом деле довольно громоздко писать (логика довольно волосатая).Кроме того, для симуляций Монте-Карло, в которых вам необходимо выполнить сотни миллионов раздач, такой подход просто недопустим.

См. эту ссылку для обзора доступных методов.На самом деле, использование алгоритмов сравнения на основе таблиц намного проще для кодирования, чем использование набора операторов if.

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

[Первая высокопроизводительная оригинальная идея - там , и использует таблицы поиска, совершенные хэши и хороший трюк умножения простых чисел для оценки рукис первого взгляда.]

0 голосов
/ 03 мая 2011

создайте массив карт и добавьте первые 5 карт.Затем, на каждой дополнительной карточке, найдите самую младшую в карточной руке и посмотрите, больше ли дополнительная карточка, если так, поменяйте их.Помня о том, что вам нужно найти пары, стриты, фулл-хаусы и тому подобное

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