|
#1
|
|||
|
|||
Покер
По теме такой популярной игры, как покер, нужна помощь.
Мужики, помогите с элементарной вещью, наверняка у кого-то уже есть такой кусок кода, а если нет может кто все равно может помочь. Мне нужен правильный рабочий алгоритм, который будет определять старшую комбинацию из 7 карт (т.е. 2 карты которые на руках + 5 на board'е), но если у кого-то есть для 5 карт, тоже пойдет. Причем комбинация должна быть определена не просто скажем стрит, а стрит со старшей картой такой-то; если пара то пара чего и какие 3 остальные старшие карты, т.е. чтобы можно было сравнивать с комбинацией которая собралась у партнера. У меня такая процедурка уже написана, но что-то работает не правильно. Выяснил это очень просто: посчитал с помощью нее как стоит одна рука против другой (т.е. процент выйгрыша одной руки против другой) и сверил с pokerstove, получилось что значения немного расходятся, а иногда и не немного совсем. Кодом программы могу поделится, если нужно, не вопрос. |
#2
|
||||
|
||||
Цитата:
Я вот например в покер не играл и не собираюсь начинать. Но если будет описание, но сделать прогу не впорос. Описание в виде: такая-то хрень - комбинация из 5 разнх карт где то.. и то.. и... |
#3
|
|||
|
|||
Ок, сейчас поясню...
Вот ссылка например на то какие комбинации существуют: http://www.pokerlistings.ru/poker-hand-ranking Да, речь идет об обычном виде покера - техасский холдем. Вот даже кое какой рабочий код (всю прогу скидывать наверное пока не буду, слишком сложно разобраться будет): http://ak3000.by.ru/123.txt |
#4
|
||||
|
||||
Вобщем кое-как понял.
В проге что именно для вашего проекта критично? 1- Минимум памяти. 2- Минимум количесва операций. 3- Простота и понятность программы. (можно выбрать только 1-но) Ну или 4-е: 4- Та не важно, хоть как-то, лишь бы правильно работала. П.с.: это все часть курсовой?) или дела куда серьезней? Последний раз редактировалось Konrad, 14.02.2011 в 19:40. |
#5
|
|||
|
|||
Отлично!
В программе самое важное это скорость ее работы, т.к. потом нужно будет посчитать очень много значений вероятностей, как одна рука стоит против другой (т.е. к примеру AhKc vs QdJs), а потом 3-х мерную таблицу для 3-х игроков сразу (т.е. к примеру AhKc vs QdJs vs 9h7c). В первом случае AhKc 64.3% выиграет при вскрытии карт (соответственно в 35.7% QdJs выигрывает). А во втором случае AhKc имеет только 45.45% на победу, QdJs 31.14%, а 9h7c 23.42%. Эти значения можно посмотреть в простенькой бесплатной программе PokerStove, с ней я в конце и сверяюсь. Нет, это не курсовая. Проект будет очень интересным я думаю, можно будет много чего научится считать вспомогательного, чтобы игра была эффективнее. На данном этапе я хочу написать программу которая будет "измерять удачу" грубо говоря. Ну а потом дальше буду думать, но это самое основное. Да, кстати, там в файле не написано что такое MyArray1. Вот что я объявлял у себя выше: type MyArray1 = array[1..13] of byte; MyArray2 = array[1..52] of boolean; THand = record Card1 : char; Card2 : char; Color1 : char; Color2 : char; end; Последний раз редактировалось ak3000, 15.02.2011 в 08:54. |
#6
|
||||
|
||||
Хорошо,
до след понедельника, думаю, смогу написать программу. Так как сейчас работы многовато |
#7
|
|||
|
|||
Отлично!
Там правда и писать то особо не нужно, хотя может лучше будет и заново написать. У меня уже все есть, но где-то ошибочка закралась, как я и говорил... В принципе кое-какие куски вполне можно и из моего проекта скопирнуть себе, даже если основные процедуры и функции писать заново. |
#8
|
||||
|
||||
Тема игр вообще интересна а тут есть над чем поломать голову. Как я понимаю расчет вероятности должен происходить для каждого конкретного игрока и этот игрок не знает, что находится в колоде и что на руках у игроков. Т.е. использоваться при этом должны только открытые карты и те что на руках у данного конкретного игрока. Так?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
||||
|
||||
Где-то, в закоулках моей памяти (а возможно, и винчестера) что-то подобное уже делалось, и даже работало. Правда, это была не сетевая игра (игроки должны были по очереди выгонять друг друга из комнаты, прежде чем продолжать игру за себя), но были даже простенькие боты.
Konrad, если что, ты у меня в ICQ есть, пиши - помогу, чем смогу Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#10
|
|||
|
|||
Страдалецъ, тут можно подойти и с той стороны что ты описываешь. Смотря какая цель перед тобой стоит. Но основа здесь одна - как раз об этой основе идет речь. Опишу еще раз, постараюсь поподробнее:
1) Какая задача стоит сейчас? Предположим что мы видим 2 карты своих и 2 карты противника, и при этом на столе еще нет общих карт. Мы хотим посчитать вероятности на победу наших 2 карт, против его 2 карт на текущий момент. В процессе игры на стол могут выйти 5 общих карт, если игра не завершится раньше (если все игроки сдадутся одному, т.е. откажутся повышать ставку). Каждый игрок старается собрать комбинацию как можно старше из своих 2 карт и общих карт лежащих на листе. Соответственно, нам в любом раскладе нужна функция которая будет определять у кого какая комбинация получилась. И после того как она будет написана мы, зная 2 своих карты, 2 карты противника (предположим что мы сейчас играем вдвоем), переберем все возможные комбинации карт которые могут выйти на стол при вскрытии (все комбинации из 5 карт) и определив в каждой их них кто выиграл, мы можем подсчитать в скольки случаях выиграл 1-ый игрок, в скольки 2-ой, сколько раз была ничья и исходя из этих цифр определить наконец вероятности на победу. 2) Для чего нам это нужно? В моем случае это нужно для того чтобы быстро смотреть вероятности на победу одной руки (2 карты у игрока называются его рукой) против другой. Потому что я заранее посчитаю все все эти вероятности и сохраню в файл. А также эту процедурку можно будет использовать и например для следующего: можно будет считать вероятности на победу своих карт по мере того как открываются общие карты. Ниже я привел пример того, какую строку возвращает моя программа после того как определила комбинацию. { 1 - флэш рояль = 1 2 - стрейт флэш = 2 Q -> где дама старшая карта в стрите 3 - каре = 3 T A -> T T T T A (туз - старшая карта) 4 - фул хаус = 4 3 J -> 3 3 3 J J (сначала та карта которых три штуки) 5 - флэш = 5 Q J 7 5 3 (в порядке убывания все карты) 6 - стрэйт = 6 7 (7 - старшая карта) 7 - сет или тройка = 7 4 K J 8 - две пары = 8 5 3 A (тоже по убыванию + старшая карта) 9 - пара = 9 Q A K J (пара дам + 3 старшие карты) 0 - ничего = 0 A K T 9 4 (0 + пять старших карт) } DJ PhoeniX, если ты у себя найдешь готовый рабочий правильный код, то вообще шикарно будет. Последний раз редактировалось ak3000, 15.02.2011 в 17:23. |
#11
|
||||
|
||||
Так-с...
Что-о мы наверное о разных вещах говорим. Я правильно понял: У нас есть 5 карт ( любых) Нужна функция: accka9funkci9(karta1,karta2,karta3,karta4,karta5): string; тогда accka9funkci9(karta1,karta2,karta3,karta4,karta5)= суперфлешрояль ну или несупернефлешнерояль) ? |
#12
|
|||
|
|||
Да, все правильно. Т.е. функция должна определить комбинацию. Если во входных параметрах будет не 5 карт, а 7 то будет лучше. Но в принцепи и так попрет. )
|
#13
|
||||
|
||||
Был завален работой
Вобщем пока что черновой вариант, работает так как показано на картинках с примера. ( возможны ошибки, так как эта игра сама по себе меня мало интересует, а поэтому реализовал то что увидел) Скорость где-то 1000000 вар/сек. Понатное что это не предел, там многое можно ускорить... но сами понимаете - долго над функцией не думал... Карты нумеруются от 0 до 51: 0 - 2 чир, 1 - 2 буб, 2 - 2 крес, 3 - 2 пик, 4 - 3 чир, 5 - 3 буб, 6 - 3 крес, 7 - 3 пик ........... 48 - Т чир, 49 - Т буб, 50 - Т крес, 51 - Т пик. 1 байт --> 1 карта. Чтобы сохранить все возможные варианты - понадобится 1,3Гб на диске. Результат строка с начальными буквами комбинаций. PHP код:
|
#14
|
|||
|
|||
Так, отлично, уже кое-что есть над чем подумать...
Сверю твою функцию со своей попозже, посмотрим что получится. Ну а так вообще конечно нужно дальше делать, не только первые буквы. |
#15
|
||||
|
||||
Цитата:
Просто замени скажем 'Tp' на 'супер пупер Две пары | Two-pair'))) |