Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.02.2011, 11:55
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 10
Сообщение Покер

По теме такой популярной игры, как покер, нужна помощь.

Мужики, помогите с элементарной вещью, наверняка у кого-то уже есть такой кусок кода, а если нет может кто все равно может помочь. Мне нужен правильный рабочий алгоритм, который будет определять старшую комбинацию из 7 карт (т.е. 2 карты которые на руках + 5 на board'е), но если у кого-то есть для 5 карт, тоже пойдет. Причем комбинация должна быть определена не просто скажем стрит, а стрит со старшей картой такой-то; если пара то пара чего и какие 3 остальные старшие карты, т.е. чтобы можно было сравнивать с комбинацией которая собралась у партнера. У меня такая процедурка уже написана, но что-то работает не правильно. Выяснил это очень просто: посчитал с помощью нее как стоит одна рука против другой (т.е. процент выйгрыша одной руки против другой) и сверил с pokerstove, получилось что значения немного расходятся, а иногда и не немного совсем.
Кодом программы могу поделится, если нужно, не вопрос.
Ответить с цитированием
  #2  
Старый 14.02.2011, 12:02
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от ak3000
Мне нужен правильный рабочий алгоритм, который будет определять старшую комбинацию из 7 карт (т.е. 2 карты которые на руках + 5 на board'е), но если у кого-то есть для 5 карт, тоже пойдет.
Хоть опиши что оно такое.
Я вот например в покер не играл и не собираюсь начинать.
Но если будет описание, но сделать прогу не впорос.

Описание в виде:
такая-то хрень - комбинация из 5 разнх карт где то.. и то.. и...
Ответить с цитированием
  #3  
Старый 14.02.2011, 12:19
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Ок, сейчас поясню...
Вот ссылка например на то какие комбинации существуют:
http://www.pokerlistings.ru/poker-hand-ranking
Да, речь идет об обычном виде покера - техасский холдем.

Вот даже кое какой рабочий код (всю прогу скидывать наверное пока не буду, слишком сложно разобраться будет):
http://ak3000.by.ru/123.txt
Ответить с цитированием
  #4  
Старый 14.02.2011, 19:34
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Вобщем кое-как понял.

В проге что именно для вашего проекта критично?

1- Минимум памяти.
2- Минимум количесва операций.
3- Простота и понятность программы.

(можно выбрать только 1-но)

Ну или 4-е:
4- Та не важно, хоть как-то, лишь бы правильно работала.


П.с.: это все часть курсовой?) или дела куда серьезней?

Последний раз редактировалось Konrad, 14.02.2011 в 19:40.
Ответить с цитированием
  #5  
Старый 15.02.2011, 06:20
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Отлично!
В программе самое важное это скорость ее работы, т.к. потом нужно будет посчитать очень много значений вероятностей, как одна рука стоит против другой (т.е. к примеру 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  
Старый 15.02.2011, 09:18
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Хорошо,
до след понедельника, думаю, смогу написать программу.
Так как сейчас работы многовато
Ответить с цитированием
  #7  
Старый 15.02.2011, 12:11
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Отлично!
Там правда и писать то особо не нужно, хотя может лучше будет и заново написать.
У меня уже все есть, но где-то ошибочка закралась, как я и говорил...
В принципе кое-какие куски вполне можно и из моего проекта скопирнуть себе, даже если основные процедуры и функции писать заново.
Ответить с цитированием
  #8  
Старый 15.02.2011, 12:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Тема игр вообще интересна а тут есть над чем поломать голову. Как я понимаю расчет вероятности должен происходить для каждого конкретного игрока и этот игрок не знает, что находится в колоде и что на руках у игроков. Т.е. использоваться при этом должны только открытые карты и те что на руках у данного конкретного игрока. Так?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #9  
Старый 15.02.2011, 14:27
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Где-то, в закоулках моей памяти (а возможно, и винчестера) что-то подобное уже делалось, и даже работало. Правда, это была не сетевая игра (игроки должны были по очереди выгонять друг друга из комнаты, прежде чем продолжать игру за себя), но были даже простенькие боты.

Konrad
, если что, ты у меня в ICQ есть, пиши - помогу, чем смогу
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #10  
Старый 15.02.2011, 17:21
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 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  
Старый 15.02.2011, 17:43
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Так-с...

Что-о мы наверное о разных вещах говорим.

Я правильно понял:

У нас есть 5 карт ( любых)
Нужна функция:
accka9funkci9(karta1,karta2,karta3,karta4,karta5): string;

тогда

accka9funkci9(karta1,karta2,karta3,karta4,karta5)= суперфлешрояль
ну или несупернефлешнерояль)

?
Ответить с цитированием
  #12  
Старый 15.02.2011, 20:42
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Да, все правильно. Т.е. функция должна определить комбинацию. Если во входных параметрах будет не 5 карт, а 7 то будет лучше. Но в принцепи и так попрет. )
Ответить с цитированием
  #13  
Старый 16.02.2011, 21:15
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Был завален работой

Вобщем пока что черновой вариант, работает так как показано на картинках с примера. ( возможны ошибки, так как эта игра сама по себе меня мало интересует, а поэтому реализовал то что увидел)

Скорость где-то 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 код:
function accka9funkci9(k1,k2,k3,k4,k5:byte):string;
var
i,j:integer;
tm,amo,ado:byte;
a:array[1..5]of byte;
s:string;
begin
s
:='xren6';
a[1]:=k1;
a[2]:=k2;
a[3]:=k3;
a[4]:=k4;
a[5]:=k5;
for 
i:=1 to 4 do
  for 
j:=1 to 4 do
    if 
a[j]<a[j+1then
      begin
        tm
:=a[j];
        
a[j]:=a[j+1];
        
a[j+1]:=tm;
      
end;
amo:=a[1mod 4// 0-3
ado:=a[1div 4// 0-12

if (a[2mod 4=amo)and(a[3mod 4=amo)and (a[4mod 4=amo)and(a[5mod 4=amothen
    begin
      
if ado=12 then
        begin
          
if a[5div 4 =8 then s:='FR';
        
end
      
else
        if (
a[1]-a[5])=16 then s:='SF' else s:='F';
    
end
  
else
    
begin
      
if (ado-a[2]div 4)>1 then
        s
:='Hc'
      
else
      if 
ado =a[4div 4 then s:='FoK'
        
else
          
begin
            
if (ado=a[3]div 4then
              begin
                
if (a[4]div 4 a[5]div 4then s:='FH' else s:='ToK';
              
end
              
else
              
begin
                
if (ado=a[2]div 4then
                    
if (a[3]div 4 a[4]div 4then s:='Tp'
                  
else
                    
begin
                      
if (a[1div 4 a[5div 4)=4 then s:='S' else s:='Op';
                    
end;
              
end;
          
end;
    
end;
result:=s;
end
Ответить с цитированием
  #14  
Старый 16.02.2011, 21:27
ak3000 ak3000 вне форума
Прохожий
 
Регистрация: 14.02.2011
Сообщения: 13
Репутация: 10
По умолчанию

Так, отлично, уже кое-что есть над чем подумать...
Сверю твою функцию со своей попозже, посмотрим что получится.

Ну а так вообще конечно нужно дальше делать, не только первые буквы.
Ответить с цитированием
  #15  
Старый 16.02.2011, 21:30
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от ak3000
Ну а так вообще конечно нужно дальше делать, не только первые буквы.
Буквы сделать - пару сек))))
Просто замени скажем 'Tp' на 'супер пупер Две пары | Two-pair')))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter