Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Алгоритм подсчета покерной руки

Ответить
Настройки темы
Алгоритм подсчета покерной руки

(*.*)


Сообщения: 36564
Благодарности: 6696


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 19-04-2005
Вложения
Тип файла: txt project.txt
(8.0 Kb, 23 просмотров)
Тип файла: txt five_integers.txt
(1.2 Kb, 42 просмотров)
Тип файла: txt calc_hand.txt
(2.6 Kb, 34 просмотров)
Доброго времени суток!

Вот добрался я и до этого форума Сразу скажу, что программист я никакой, и весь мой опыт программирования сводится к нескольким заданиям в рамках курса VB.NET в универе. Курс предназначен для людей, не имеющих опыта программирования, и знакомит с элементарными понятиями. Поскольку курс преподается на англ. языке, я знаю только английскую терминологию. Предположу, что array - массив, a data structure - структура данных.

Финальный проект курса формулируется так. Надо сгенерировать колоду карт на 52 листа. Сначала нужно создать структуру данных, у которой два члена: face (номинал карты) и suit (масть). Затем нужно сформировать массив, который и будет наполнен 52 картами. Затем нужно сгенерировать 5 случайных уникальных номеров от 0 до 51 (или от 1 до 52) и на основе этих номеров сформировать покерную руку. Ну и самое главное - определить покерную комбиниацию, которая получится в рез-те. Покерные комбинации такие

Flush (все одной масти)
Четверка (четыре карды одного номинала)
Full house (3+2)
Тройка
Две пары
Пара
Ничего

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

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

Прикрепленный файл

Если я что-то упустил, то буду признателен, если вы укажете на ошибки.

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

Основная идея: в руке не может быть более двух различных совпадающих номиналов карт. Т.е. если есть два туза и два короля, то пятой карте пары уже точно не будет. Значит надо подсчитать сколько раз совпали два различных номинала.

Прикрепленный файл

Ну а дальше уже детали. По порядку проверяем следующие условия:
  1. Если все карты одной масти, то flush (масти берутся из массива на основе 5 уникальных чисел, сгенерированных ранее)
  2. Если первый счетчик равен 4, то у нас четверка.
  3. Если счетчики 3+2 или 2+3, то у нас full house.
  4. Если первый счетчик равен 3, то тройка (причем, второй счетчик может быть равен 3 только в случае 2+3).
  5. Если счетчики 2+2, то две пары.
  6. Если первый счетчик равен 2, то пара (причем второй счетчик может быть равен 2 только в случае 3+2 или 2+2)
  7. Ну а во всех остальных случаях нету даже пары.

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

Спасибо за внимание.

P.S. Полный код проекта прикреплен.

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 11:05, 18-04-2005

 

(*.*)


Сообщения: 36564
Благодарности: 6696

Профиль | Сайт | Отправить PM | Цитировать


Цитата:
покажет все пары, тройки и каре...
A как насчет полного дома и двух пар? А, понял...

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

-------
Канал Windows 11, etc | Чат @winsiders


Последний раз редактировалось Vadikan, 04-05-2005 в 04:25.


Отправлено: 04:08, 04-05-2005 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 401
Благодарности: 10

Профиль | Отправить PM | Цитировать


Цитата:
Все равно, слишком много переменных вводится, тогда уж лучше массив...
ну, для четырех мастей только три комбинации (пара, тройка, каре), если не считать покера (каре + джокер)
вводить массив не вижу смысла...
ок, рассмотрим гипотетический случай с MaxSuit мастями, MaxFaces количеством карт в каждой масти и MaxCardsOnHand картами в руках игрока, тогда
Цитата код:
' упс!.. не заметил в первый раз:
' не стоит проверять по нескольку раз (дубляжи получаются)
For i = 0 to MaxCardsOnHand-1 ' не сравниваем последнюю (а с кем? )
For j = i+1 to MaxCardsOnHand ' не сравниваем саму с собой и с проверенными ранее (вот они дубляжи!)
If hand(i).face = hand(j).face then ' And i <> j - это условие теперь лишнее
matches(face) += 1
End If
Next j
Next i
' время собирать камни
For i = 0 to MaxFaces
combinations(matches(i)) += 1 ' тут вроде понятно: combinations(2) - количество пар, combinations(3) - количество троек...
Next i
' показываем
For i = 2 to MaxSuits ' "комбинации" младше пары нас не интересуют, да их и нету
if combinations(i) > 0 then
? i;"-к = ";combinations(i)
endif
Next i
' дальше уже смотрим спецкомбинации:
if combinations(2) > 0 and combinations(3) > 0 then
? "фулхаус"
endif
' и т.д.
вроде ниче так получилось
но это только одинаковые значения карт.
опять же можно ввести джокеров и даже смотреть их старшинство (b.e. "пара дам с красным джокером" бьет "пару дам с синим")
стриты, флешрояли и иже с ними рассмотрим в следующей главе

-------
Успехов.


Последний раз редактировалось aESThete, 04-05-2005 в 10:47. Причина: синтаксические ошибки


Отправлено: 10:37, 04-05-2005 | #22


(*.*)


Сообщения: 36564
Благодарности: 6696

Профиль | Сайт | Отправить PM | Цитировать


aESThete
Сорри, я что-то не получил уведомления о последнем сообщении.
Код: Выделить весь код
if combinations(i) > 0 then
      ? i;"-к = ";combinations(i)
   endif
Вот среднюю я строчку я не понял. Поясни, плиз ;-)

Между тем, я получил за проект 100% с комментарием "Очень хороший проект" и в целом за курс А+, что является максимально возможно оценкой. Спасибо всем, кто принял участие в обсуждении

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 09:46, 17-05-2005 | #23


Старожил


Сообщения: 401
Благодарности: 10

Профиль | Отправить PM | Цитировать


поздравляю!
Код: Выделить весь код
if combinations(i) > 0 then ' уже писал в предыдущем посте: combinations(2) - количество пар, combinations(3) - количество троек
    ? i;"-к = ";combinations(i)
    ' просто печатает сколько каких комбинаций, например если при i=2 выведет: 2-к=2, то следует читать: двоек[пар] = две
    ' или при i=3 выведет: 3-к=1 (читай как: троек карт - одна)
endif
if combinations(2) > 0 and combinations(3) > 0 then ' по аналогии - количество пар и кол-во троек карт больше нуля
   ? "фулхаус"
endif
это что, мне тут на днях (домой в автобусе ехал, мысли витали в облаках ) пришла мысля,что можно сданные карты (руку) засунуть в граф, где вершинами являются масти и значения карт, создать матрицу смежности графа (или просто создать массив вида H(масть,значение), что в сущности одно и тоже) а потом уж издеваться над этим как угодно: плясать от любой вершины по связям и т.д. (все согласно теории графов )
нуууу ооооочень красиво получается
но есть подозрение, что ваш препод тогда или поседеет раньше времени, или в дурку попадет

-------
Успехов.


Отправлено: 14:23, 17-05-2005 | #24


Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


Жалко что не на си))) было бы в сто раз понятнее, код хороший, я вот хочу сделать калькулятор шансов (подсчет аутов), велосипед (покерную руку) делать не очень хотелось.

-------
В каждом из нас спит гений... avelyev.ucoz.ru


Отправлено: 05:02, 04-11-2011 | #25



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Алгоритм подсчета покерной руки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
FreeBSD - Кривые руки xolod. Общий по FreeBSD 2 14-05-2009 12:02
[решено] мои руки\цп\мать кто виноват и что делать) SoA Непонятные проблемы с Железом 12 14-08-2008 17:34
DNS (опустились руки) 53 порт локального сервера Virtus1k Microsoft Windows NT/2000/2003 3 03-01-2008 11:16
Программа подсчета трафика. NewWind Общий по Linux 1 04-06-2007 16:37
Кривые руки при разгоне - и комп перестал грузится... Shaytan Непонятные проблемы с Железом 13 06-03-2005 21:56




 
Переход