Форум сайта python.su
Доброго времени суток.
Есть колода карт. Есть несколько игроков. У каждого есть 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']
Отредактировано (Июль 4, 2008 15:51:29)
Офлайн
Просто как валенок. Введите коефициенты для комбинаций и считайте их для каждого набора.
Офлайн
Ferromanне понял.
Введите коефициенты для комбинаций и считайте их для каждого набора.
Офлайн
Да, верно. При чём можно сделать так, что бы одинаковые комбинации имели разный вес в зависимости от карт.
Офлайн
FerromanВот как это сделать?
При чём можно сделать так, что бы одинаковые комбинации имели разный вес в зависимости от карт.
if hand1 > hand2: ... победил первый elif hand1 < hand2: ... победил второй else: ... ничья
Отредактировано (Июль 4, 2008 16:12:58)
Офлайн
Вы не считайте только вес карт. Вы считайте вес комбинаций. А вес карт считайте отдельно.
Тогда у вас получится 2 числа - одно вес комбинации в руке, а второе - вес карт в каждой комбинации (грубо - сумма веса каждой карты).
То есть для каждой “руки” - пара (вес комбинации, вес карт).
Да, по скольку есть ещё и масти, то можно ещё добавлять дополнительные баллы, там, где это имеет значение. Или подсчитывать отдельный коэффициент для этого, как будет проще.
Отредактировано (Июль 4, 2008 16:27:19)
Офлайн
Ferromanвот в этом вся загвоздка.
(грубо - сумма веса каждой карты).
То есть для каждой “руки” - пара (вес комбинации, вес карт).
>>> [3, 3, 3, 2, 2] > [2, 2, 2, 13, 13] True
Офлайн
Вы не читаете посты. Вес комбинации и сумма весов карт - разные цифры.
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)
Офлайн
Да, а зачем Вам скорость? Вы разницу заметите только если будуте сравнивать 1000 комбинаций.
Офлайн
Вы не читаете посты. Вес комбинации и сумма весов карт - разные цифры.Сорри, очевидно не так понял.
Такое сравнение как у Вас в посте - некоректно, поскольку не всегда даст правильный результат. Например если тройка и пара будут идти в обратном порядке, чем у Вас.порядок не имеет значения. его можно и поменять. если это фулл, то сначала можно и даже нужно поставить трипс. Думаю, это будет решаться на стадии выделения комбинации из семерки.
Офлайн