![]() |
|
#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'))) |