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

StackOverflow https://stackoverflow.com/questions/244114

  •  04-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

//            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)

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

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

Использование строки для представления раздачи кажется неудачным решением.Моя рекомендация состояла бы в том, чтобы использовать Перечисление для представления Масти, а другое - для представления числового значения карты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top