Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/74: Рейтинг темы: голосов - 74, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.07.2009
Сообщений: 14

Поиск алгоритма для реализации игры "Покер"

21.07.2009, 19:19. Показов 14643. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
И так задача следующая : нужно написать игру покер (Техасский холдем) для win32 console application. Многие из Вас наверно знакомы с правилами . Суть игры в том что вам изначально на руки приходит 2 карты , а потом крупье выкидывает на стол еще 3,4,5 карт ( в зависимости от ситуации) . И имея свои карты и те что на столе, вы собираете всевозможные комбинации ( можно посмотреть по ссылке выше ) . Так вот вся загвоздка в том, что надо как то эти комбинации определять у игроков , ну и собственно давать банк тому у кого круче комбинация. Меня интересует как лучше организовать этот алгоритм определения комбинации,которых ОЧЕНЬ много.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2009, 19:19
Ответы с готовыми решениями:

Программа для игры в покер
Никак не могу понять суть ооп. До прихода в с++ програмировал на С микроконтроллеры. Там всё просто. Есть начало программы, и пишеш...

Программа-бот для игры в покер.
Здравствуйте. Сам я будующий программист, учусь на 2 курсе, потихоньку осваиваю С++. У меня вопрос к уже сложившимся и опытным...

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

9
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
21.07.2009, 22:02
Все просто. Задай рейтинги комбинации вида
#define PAIR 100
Code
1
2
3
4
5
6
7
8
9
10
11
#define TWO_PAIRS 200
#define THREE 300 
#define FULLHOUSE 400
#define STRAIGHT 500
#define FLUSH 600
#define FLUSH_STRAIGHT 700
....
#define TWO 1
#define THREE 2
...
#define ACE 13
итоговый рейтинг = рейтинг комбинации + рейтинг старшей карты(ну во флеше до двойки - рейтинг двойки)

Комбинации определять тоже несложно, просто рутинно. Я не знаю универсального простого алгоритма и скорее всего его просто нет.

Добавлено через 3 минуты 14 секунд
можно упростить задачу, представляя руку игрока и карты на столе в разном виде. К примеру,держать массив кол-ва карт каждой масти, держать массив стоимостей карт без учета масти. В таком духе.
1
0 / 0 / 0
Регистрация: 07.07.2009
Сообщений: 14
21.07.2009, 22:10  [ТС]
Хитрый Минтай , спасибо но это я и так знал Но все равно спасибо, хотя у меня немного другой подход,но суть одинакова. Я просто думал, авось я тупой и есть что то по-универсальнее, чем я придумал. Ну да ладно буду все в тупую делать...
0
1 / 1 / 0
Регистрация: 02.02.2010
Сообщений: 18
05.02.2010, 13:54
поделись тем что получилось
0
5 / 5 / 1
Регистрация: 06.02.2010
Сообщений: 33
08.02.2010, 11:57
Это кстати олимпиадная задача, вот я её решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#include <iostream>
 
using namespace std;
char szBw[] = "Black Win";
char szWw[] = "White Win";
char szN[] = "Pit";
int nBStar1 =0;
int nBStar2= 0;
int nWStar1 = 0;
int nWStar2 = 0;
int nBStar3= 0;
int nWStar3 = 0;
 
int velichina (char v) {
    switch (v) {
        case 'T':
        return 10;
        case 'J':
        return 11;
        case 'Q':
        return 12;
        case 'K':
        return 13;
        case 'A':
        return 14;
    }
    return atoi(&v);
}
bool strit(char szRuka[15],int nWho) {
    int nVelich[5]={velichina(szRuka[0]),velichina(szRuka[3]),velichina(szRuka[6]),velichina(szRuka[9]),velichina(szRuka[12])};
    bool bImeetsa;
    int nPosled;
    for (int i=2;i<11;i++) {
        nPosled=0;
        for (int k=i;k<=(i+4);k++) {
            bImeetsa = 0;
            for (int z=0;z<5;z++) {
                 if(nVelich[z]==k) {
                     bImeetsa=1;
                 }
            }
            if(bImeetsa) {
                nPosled++;
            }else{
                break;
            }
        }
        if(nPosled==5)  {
            return 1;
        }
    }
    return 0;
}
bool flash(char szRuka[15],int nWho) {
    char szMast[6]={szRuka[1],szRuka[4],szRuka[7],szRuka[10],szRuka[13]};
    for (int i=0;i<5;i++) {
        if(szMast[i]!=szMast[0]) {
            return 0;
        }
    }
    return 1;
}
 
int kombinaziya (char szRuka[15],int nWho)  {
    bool nKolKomb=0;
    char szKarta;
    if(strit(szRuka,nWho) and flash(szRuka,nWho)) {
        return 8;
    }
    if(flash(szRuka,nWho)) {
        return 5;
    }
    if(strit(szRuka,nWho)) {
        return 4;
    }
    char szVelich[6]={szRuka[0],szRuka[3],szRuka[6],szRuka[9],szRuka[12]};
    int nInd=1;
    int nPomosh=0;
    for (int i=0;i<6;i++) {
        for (int b=i+1;b<6;b++) {
            if(szVelich[i]==szVelich[b] and szVelich[b] !='z') {
                szKarta = szVelich[i];
                szVelich[b]='z';
                nInd++;
            }
        }
        switch(nInd) {
            case 2:
            if (!nKolKomb) {
                if (nWho==0) {
                    nBStar1= velichina(szKarta);
                } else {
                    nWStar1= velichina(szKarta);
                }
                nKolKomb =1;
            }else{
                if (nWho==0) {
                    nBStar2= velichina(szKarta);
                } else {
                    nWStar2= velichina(szKarta);
                }
            }
            nPomosh +=2;
            break;
            case 3:
            if (nWho==0) {
                nBStar3= velichina(szKarta);
            } else {
                nWStar3= velichina(szKarta);
            }
            nKolKomb =1;
            nPomosh +=3;
            break;
            case 4:
            if (nWho==0) {
                nBStar1= velichina(szKarta);
            } else {
                nWStar1= velichina(szKarta);
            }
            nKolKomb =1;
            nPomosh +=4;
            break;
        }
        nInd=1;
    }
    switch(nPomosh) {
        case 2:
        return 1;
        case 4:
        if((nBStar2+nWStar2)==0) {
            return 8;
        }
        return 2;
        case 3:
        return 3;
        case 5:
        return 6;
    }
    return 0;
}
char* starshaya (char bRuka[15],char wRuka[15], int nKomb) {
    int nBlack[5] = {velichina(bRuka[0]),velichina(bRuka[3]),velichina(bRuka[6]),velichina(bRuka[9]),velichina(bRuka[12])};
    int nWhite[5] = {velichina(wRuka[0]),velichina(wRuka[3]),velichina(wRuka[6]),velichina(wRuka[9]),velichina(wRuka[12])};
    int bNaibolsh;
    int wNaibolsh;
    if (nKomb==1) {
        if (nBStar1>nWStar1) {
            return &szBw[0];
        }
        if (nBStar1<nWStar1) {
            return &szWw[0];
        }
        if (nBStar1==nWStar1) {
            nKomb=0;
        }
    }
    if (nKomb==2) {
        if (nBStar1<nBStar2) {
            nBStar1 = nBStar1 + nBStar2;
            nBStar2 = nBStar1 - nBStar2;
            nBStar1 = nBStar1 - nBStar2;
        }
        if (nWStar1<nWStar2) {
            nWStar1 = nWStar1 + nWStar2;
            nWStar2 = nWStar1 - nWStar2;
            nWStar1 = nWStar1 - nWStar2;
        }
        if (nBStar1>nWStar1) {
            return &szBw[0];
        }
        if (nBStar1<nWStar1) {
            return &szWw[0];
        }
        if (nBStar1==nWStar1) {
            if (nBStar2>nWStar2) {
                return &szBw[0];
            }
            if (nBStar2<nWStar2) {
                return &szWw[0];
            }
            if (nBStar2==nWStar2) {
                nKomb=0;
            }
        }
    }
    if (nKomb==3) {
        if (nBStar3>nWStar3) {
            return &szBw[0];
        }
        if (nBStar3<nWStar3) {
            return &szWw[0];
        }
    }
    if (nKomb==4 or nKomb==5 or nKomb==8) {
        nKomb=0;
    }
    if (nKomb==6) {
        if (nBStar3>nWStar3) {
            return &szBw[0];
        }
        if (nBStar3<nBStar3) {
            return &szWw[0];
        }
    }
    if (nKomb==7) {
        if (nBStar1>nWStar1) {
            return &szBw[0];
        }
        if (nBStar1<nWStar1) {
            return &szWw[0];
        }
        if (nBStar1==nWStar1) {
            return &szN[0];
        }
    }
    if (nKomb==0) {
        for (int c=0;c<5;c++) {
            bNaibolsh = nBlack[0] ;
            for (int i=0;i<5;i++) {
                if (nBlack[i]>bNaibolsh) {
                    bNaibolsh = nBlack[i];
                }
            }
            wNaibolsh = nWhite[0] ;
            for (int i=0;i<5;i++) {
                if (nWhite[i]>wNaibolsh) {
                    wNaibolsh = nWhite[i];
                }
            }
            if (bNaibolsh>wNaibolsh and bNaibolsh>1 and wNaibolsh>1) {
                return &szBw[0];
            }
            if (bNaibolsh<wNaibolsh and bNaibolsh>1 and wNaibolsh>1) {
                return &szWw[0];
            }
            for (int i=0;i<5;i++) {
                if(nWhite[i]==wNaibolsh) {
                    nWhite[i]=0;
                }
            }
            for (int i=0;i<5;i++) {
                if(nBlack[i]==bNaibolsh) {
                    nBlack[i]=0;
                }
            }
        }
    }
    return &szN[0];
}
 
int main()
{
    char szKarti[30];
    char szRukaBlack[15];
    char szRukaWhite[15];
    int nKombBlack;
    int nKombWhite;
    gets(szKarti);
 
    for(int i=0;i<15;i++) {
        szRukaBlack[i]=szKarti[i];
    }
    for(int i=0;i<15;i++) {
        szRukaWhite[i]=szKarti[i+15];
    }
 
    nKombBlack = kombinaziya(szRukaBlack,0);
    nKombWhite = kombinaziya(szRukaWhite,1);
    if (nKombBlack>nKombWhite) {
        cout << szBw<< "\n";
    }
    if (nKombWhite>nKombBlack) {
        cout << szWw << "\n";
    }
    if (nKombWhite==nKombBlack) {
        cout << starshaya (szRukaBlack,szRukaWhite, nKombBlack) <<"\n";
    }
    system("PAUSE");
}
Протестируй её на всякий случай.
На вход подаются 2 строки в каждой по 5 карт. Карта обозначается как буква(масть) а затем величина.
Вот подсказка:
C - КРЕСТА
D - БУБА
H - ЧЕРВА
S - ПИКА
T - 10
J - ВАЛЕТ
Q - ДАМА
K - КОРОЛЬ
A - ТУЗ
0
0 / 0 / 0
Регистрация: 26.04.2012
Сообщений: 3
26.04.2012, 19:41
Что вообще делает этот выше приведенный код? В int main () вообще задается массив из 30! элементов - т.е. должно вводится 30 карт для сравнения?

Добавлено через 6 минут
Так же компилятор 2010 Express не понимает "and" и "or" в теле if - это решается подключением какой-либо библиотеки?

Добавлено через 15 минут
Кто-нибудь может поделиться готовым кодом?
0
[R]ISEN
27.04.2012, 03:59
KUL, замени "and" на "&&", "or" на "||".
0 / 0 / 0
Регистрация: 28.08.2022
Сообщений: 3
28.08.2022, 17:32
1.возьми стол из 5-ти карт и руку из 2-ух карт и заполни такую матрицу 4х13 (ее формат bool)

| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | В | Д | К | Т |
черва| 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
бубна| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
пика | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
треф | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |

2.теперь заполни вектор (int)

SUM | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 4 | 0 | 0 | 0 | 0 | 1 | - суммы номиналов (например 0 двоек или 4 девятки)

3.как видно, комбинации:
pare, doublePare, set, care и fullHouse ты уже сможешь четко проверить, используя лишь вектор SUM

4. для street вот такая строчка подойдет
for (int j = 12; j >= 4; j--)
{
if (SUM[j] && nom[j - 1] && SUM[j - 2] && SUM[j - 3] && SUM[j - 4]) {
return j; // возвращаю номинал стрита (старшую его карту)
}
}

5. для флеша попробуй сделать вектор SUM2 и подсчитай количество черв, буб, треф и пик в исходной матрице.
у нас получится что-то такое |3||1||2||1| --- для флеша ищи в векторе значение 5 и выше

6. stFlash
я прохожусь по всей матрице
for (int i = 0; i < 4; i++)
{
bool flag = true;
for (int j = 0; j < 9; j++)
{
if (Matrix[i][j] && Matrix[i][j + 1] && Matrix[i][j + 2]
&& Matrix[i][j + 3] && Matrix[i][j + 4]) {
return j + 4;
}
}
}
return -1 // если не нашел


а у меня каре кстати))

Добавлено через 58 секунд
еее бэйби ответил на сообщение 2010 года. только сейчас увидел
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
29.08.2022, 14:38
на github смотрите, уже давно всё написано по 100500 раз
c++ https://github.com/search?l=C%... positories
c https://github.com/search?l=C&... positories
0
фрилансер
 Аватар для Алексей1153
6444 / 5637 / 1128
Регистрация: 11.10.2019
Сообщений: 14,994
29.08.2022, 15:07
izobar, не прошло и десяти лет
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.08.2022, 15:07
Помогаю со студенческими работами здесь

Отрисовка карт в реализации игры покер
Ребят, программированием занимаюсь недавно, начал делать упрощенный покер, составляю карты с помощью перечислителя и возник вопрос как...

ИИ для игры в покер
Здравствуйте. Подскажите, насколько реально и сложно написать ИИ бота для игры в покер, имеется в ввиду простейшее приложение где человек...

Алгоритм для игры в покер
Есть идея задать игроков в покер с помощью функций которые я буду искать с помощью интерполяции по переменным(размер банка, стиль игрока,...

Прокси для игры в покер
Сижу в интернете на работе с ноутбука, подключенного к гостевому вай-фаю для клиентов. Все сайты открывает спокойно, но многие клиентские...

Клиент-сервер для игры покер
Всем доброго времени суток, задача написать клиент-сервер и GUI приложение для игры в покер 1х1, подскажите где копать, какие библиотеки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru