Использование регулярного выражения для подсчета очков за покерную комбинацию
Вопрос
Я разрабатываю игру в покер на 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 ).
Использование строки для представления раздачи кажется неудачным решением.Моя рекомендация состояла бы в том, чтобы использовать Перечисление для представления Масти, а другое - для представления числового значения карты.