Использование RegEx для получения покерной руки - PullRequest
0 голосов
/ 28 октября 2008

Я занимаюсь разработкой игры в покер на C #. В данный момент я пытаюсь получить счет игроков, используя RegEx. Я ищу строку (состоящую из масти и номера карт) и ищу масти или цифры, соответствующие RegEx. Если я получу 2 матча, у игрока есть пара, 3 матча у него 3 вида.

В данный момент у меня есть 3 класса, класс карт (с номером и мастью), класс колод (содержит 52 карты) и класс рук, который получает пять карт из перетасованной колоды.

Класс колоды имеет shuffleDeck(); Класс Hand имеет функции для подсчета очков (именно в этих функциях я использую RegEx).

Я генерирую строку, на которой использую RegEx, добавляя 5 мастей и чисел, которые есть у руки.

Это хорошая идея или я должен сделать это по-другому, если да, то как?

Спасибо за вашу помощь

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

Ответы [ 5 ]

13 голосов
/ 28 октября 2008

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

7 голосов
/ 28 октября 2008

Вы не предоставили много подробностей, но из того, что я прочитал, я предполагаю, что вы не слишком далеко продвигаете ООП ...

У меня был бы класс Card с экземплярами классов Rank и Suit. Тогда у меня был бы класс колоды, который обрабатывает тасование / раздачу ...

Тогда у меня будет класс Hand, который будет содержать вашу покерную комбинацию из n объектов Card ...

Таким образом, вы можете создавать правила для оценки каждого объекта руки, что делает его более гибким и расширяемым в будущем ... скажем, если вы хотите создать другую карточную игру / добавить поддержку другого варианта покера ...

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

2 голосов
/ 16 декабря 2010

Я думаю, что простые числа - хорошее решение для этого. рассмотрим:

//            D H S C    
colors =    [7,5,3,2]

//           A  Q  K  J  T  9  8  7  6  5  4  3  2    
ranks =     [61,59,53,43,41,37,31,29,23,19,17,13,11,61]

уникальная карта идентифицируется простым цветным числом * ранговое простое число. (например, по состоянию на бриллианты: простое число = 7 * 61)

Таким образом, каждая уникальная колода или комбинация идентифицируются как простое * простое * простое * простое * простое

в случае сброса алмазов идентификатор простых чисел колоды из 5 карт должен делиться (mod = 0) на идентификатор сброса алмазов (7 ^ 5, потому что простое число бриллиантов равно 7)

2 голосов
/ 28 октября 2008

Я бы согласился с остальными, что Regex кажется плохим выбором. Это может работать с парами, 3 в своем роде, 4 в своем роде. Однако, это может быть сложно (или невозможно), если вы начнете смотреть на руки, такие как флеши, стриты и две пары.

Я думаю, что лучшим решением было бы оценить карты от лучшей руки к худшей руке, , как показано здесь , и как только вы найдете совпадение, тогда это ваша рука. Это гарантирует, что вы не перепутаете 4 вида с 2 парами. Или стрит-флеш для стрита, или просто флеш. Я бы использовал mmattax и создал бы объект для карты и объект для руки, а затем вы можете оценить карты в каждой руке, чтобы увидеть, соответствуют ли они требуемым критериям для каждой руки.

1 голос
/ 28 октября 2008

Использование строки для представления руки кажется плохим решением. Я рекомендую использовать Enum для представления масти, а другую - для числового значения карты.

...