Уведомления

Группа в Telegram: @pythonsu

#1 Июль 4, 2008 15:43:45

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Доброго времени суток.

Есть колода карт. Есть несколько игроков. У каждого есть 7 карт из которых надо выбрать лучшую комбинацию , состоящую из 5 карт.
выигрывает лучшая комбинация из всех.

Вопрос 1: как из 7 карт выбрать лучшую возможную?
Вопрос 2: Как сравнить эти 2 комбинации?

Немного рабочей инфы (для тех, кто не знаком с покером):
Масти карт:
d - diamonds (бубна)
h - hearts (черва)
s - spades (пик)
с - clubs (трефа)

Карты:
A - туз
K - король
Q - дама
J - валет
T - 10
9 … 2 - все остальные


Всего групп комбинаций - 10 (с примерами):

Самая сильная - Флеш-рояль: A K Q J T одной масти
Стрит флеш: (A 2 3 4 5 ) или (K Q J T 9) одной масти
каре: (2 2 2 2 <любая карта>) или (A A A A <любая карта>)
фулл хаус или просто фулл: (2 2 2 5 5) или (A A A Q Q) в общем 3 карты одного достоинства и 2 другого
Флеш: 5 любых карт одной масти ( As Ts 9s 6s 2s )
Стрит: 5 карт подряд разных мастей (As Kd Qh Js Tc)
Тройка или трипс: 3 карты одного достоинства (2 2 2 <любая карта> <любая карта>)
Две пары: 2 пары карт одинакового достоинства: (A A 4 4 <любая карта>)
Пара: Просто пара карт (A A <любая карта> <любая карта> <любая карта>)
И пустая комбинация, то есть когда нет ничего из вышеперечисленного.

Сравнение идет просто: Любая комбинация бьет ту, что ниже ее.. то есть фулл бьет трипсу, а флеш-рояль бьет вообще все.
Если 2 игрока имеют комбинации одинакового ранга, то сравнивается достоинство “главных карт” комбинации. Например если у одного стрит от 9 до K а у другого от 6 до T то выигрвает первый. Если оба собрали, допустим, по паре тузов, то дальше смотрятся их остальные карты (кикеры). Пример: 1: (A A T 6 7) 2: (A A J 2 3) - выигрывает второй или 1: (A A J 3 2 ) 2: (A A J 6 2) - выигрывает второй, так как 6 > 3.
Если 2 комбинации пустые, то побеждает та, у которой самая высшая карта из неодинаковых (она же кикер).

Теперь к питону:
У меня есть списки карт
например

['Ks', 'Qs', '7c', 'Jc', 'Td', 'Ah', 'Ad']
надо эти списки сравнить и найти максимальный.

PS: задача эта “для себя”. Просто хочу понять алгоритм.
Идея как составить максимальную комбинацию из 7, вроде есть – просто пройти вниз по возможным комбинациям (от флеш рояля до пары) и найти ту, которая соответствует какой-то группе.
Но вот как сравнить 2 комбинации мой гуманитарный мозг отказывается придумывать :(

PPS: Может кому еще задача интересной покажется :)



Отредактировано (Июль 4, 2008 15:51:29)

Офлайн

#2 Июль 4, 2008 15:52:32

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Просто как валенок. Введите коефициенты для комбинаций и считайте их для каждого набора.

Офлайн

#3 Июль 4, 2008 15:57:28

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Ferroman
Введите коефициенты для комбинаций и считайте их для каждого набора.
не понял.

то есть, например пустая комбинация - 0, пара - 1 и тд?



Офлайн

#4 Июль 4, 2008 16:02:17

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Да, верно. При чём можно сделать так, что бы одинаковые комбинации имели разный вес в зависимости от карт.

Офлайн

#5 Июль 4, 2008 16:12:24

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Ferroman
При чём можно сделать так, что бы одинаковые комбинации имели разный вес в зависимости от карт.
Вот как это сделать?
Я сначала придумал, что вес карты - число 2=2 3=3 A=13
Но тут есть нюанс:
туз может быть самой старшей картой в комбинации стрит и самой младшей. то есть

A 2 3 4 5 - стрит
и A K Q J T - тоже стрит, но уже больше, чем первый. Вот в этом основная загвоздка.
Вообще в этом загвоздка и при выделении комбинации из 7 карт.

и еще пример

2 2 2 A A фулл и 3 3 3 K K - фулл, второй – больше чем первый.

У меня есть класс - рука. в ней как раз список из 7 карт. мне нужно сравнить 2 экземпляра этого класса.
грубо говоря:
if hand1 > hand2:
    ... победил первый
elif hand1 < hand2:
    ... победил второй
else:
    ... ничья



Отредактировано (Июль 4, 2008 16:12:58)

Офлайн

#6 Июль 4, 2008 16:24:50

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Вы не считайте только вес карт. Вы считайте вес комбинаций. А вес карт считайте отдельно.
Тогда у вас получится 2 числа - одно вес комбинации в руке, а второе - вес карт в каждой комбинации (грубо - сумма веса каждой карты).
То есть для каждой “руки” - пара (вес комбинации, вес карт).

Да, по скольку есть ещё и масти, то можно ещё добавлять дополнительные баллы, там, где это имеет значение. Или подсчитывать отдельный коэффициент для этого, как будет проще.

Отредактировано (Июль 4, 2008 16:27:19)

Офлайн

#7 Июль 4, 2008 17:15:27

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Ferroman
(грубо - сумма веса каждой карты).
То есть для каждой “руки” - пара (вес комбинации, вес карт).
вот в этом вся загвоздка.

222AA в сумме дают 32
33344 дают 17
или
A2345 = 27
23456 = 20

но второй случай - больше первого.

или какая другая сумма имелась ввиду?
Суммы я с самого начала пытался приделать.

PS: пока писал придумал вот что:
>>> [3, 3, 3, 2, 2] > [2, 2, 2, 13, 13]
True
на сколько этот вариант быстр и корректен? может действительно можно одно число получить, чтобы сравнивать не листы, а числа, что, мне кажется, быстрее.
—-
ну это вроде как становится ясно. Теперь бы придумать как выделить из семи - пятерку лучшего варианта. Идея с перебором всего возможного кажется слишком тормозной.



Офлайн

#8 Июль 4, 2008 17:26:31

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Вы не читаете посты. Вес комбинации и сумма весов карт - разные цифры.
222AA - даёт список с 2-мя парами - ((8,3),(2,26))
33344 - даёт список с 2-я другими парами - ((8,6)(2,6))
Вот эти списки и сравнивайте. Ну или можно по-другому - сразу учитывая возможные комбинации пар (2 пары, пара+3) и рассматривать их как отдельные комбинации со своими весами.
Обращаю внимание что “вес” “тройки” я взял от балды - “8”, а пару посчитал как “2”. В примере карта “2” имеет вес “1” (как наименьшая), “3” - “2”, “4”-“3” а “А” - “13”. У Вас могут быть другие “весы”.

Такое сравнение как у Вас в посте - некоректно, поскольку не всегда даст правильный результат. Например если тройка и пара будут идти в обратном порядке, чем у Вас.

PS. Я прошу прощения, но я в покере не силён.

Отредактировано (Июль 4, 2008 17:27:55)

Офлайн

#9 Июль 4, 2008 17:38:01

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

Да, а зачем Вам скорость? Вы разницу заметите только если будуте сравнивать 1000 комбинаций.

Офлайн

#10 Июль 4, 2008 17:44:34

ice
От:
Зарегистрирован: 2008-01-12
Сообщения: 156
Репутация: +  0  -
Профиль   Отправить e-mail  

Оприделить "вес" комбинации. Опять нужен алгоритм.

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



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version