Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
#1

стрит-флеш - C++

01.08.2013, 22:53. Просмотров 412. Ответов 3
Метки нет (Все метки)

Написал функцию проверки на образование комбинации стрит-флеш....помидорами не закидывать писал не очень вдумчиво но здесь какие то ошибки при использовании алгоритмов STL и моей структуры(я так думаю)
мб и сам алгоритм не правильный...кому не в западло разобраться в моем говнокоде подскажите)) ОШибка в 53 и в 102 строке
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
struct card
{
       
       int first; //величина карты
       int second; //её масть
       card(int f, int s) : first(f), second(s) {}
       card() : first(0), second(0) {}
      
       card& operator=(const card& cop)
       {
             first = cop.first;
             second=cop.second;
        return *this;
       }
      
};
 
 
 
bool op(const card& c1, const card& c2)
{
     return c1.first<c2.first; //критерий сортировки карт
}
 
 
 
typedef vector<card> col_card;
 
 
 
 
bool str_flash(const col_card& board, const col_card& play, int& points, int& x, bool& flash) // board - коллекция карт на столе 
{                                                                                  //play-коллекция карт игрока 
  if(x==3)//  если х=3 первый вызов, нужно проверить одой ли масти карты игрока,      points-очки x-индикатор flash-если комбинация                                                                         
  {                                                                     //флеш, а не стрит флеш flash=true что бы в дальнейшем не тратить время
     col_card comb(5), tmp(7);                                         //на поиск комбинации флеш
     int max_v, n=0; // max_v максимальное значение среди карт, n- cчетчик
     
     if(play[0].second == play[1].second) //если карты игрока одной масти
     {
           play[0].first > play[1].first ? max_v=play[0].first : max_v=play[1].first; //находим старшую карту игрока(без учета масти)
           
           for(int i=0; i<5; i++)
                if(board[i].second==play[0].second) //проверяем каждую карту со стола на сходство масти с картой игрока
                {
                         n++;  // если масть карты на столе равна масти игрока счетчик увеличивается
                         comb.push_back(board[i]); // сохраняем карту для далнейшей проверки на комбинацию стрит(5 карт подряд)
                }
           if(n>=3) // если на столе 3+  карт тойже масти что и 2 карты игрока = 3+2= 5 комбинация флеш(5 карт одной масти)
           {
                   col_card::iterator n_end;//новый конец 
                   
                   n_end=set_union(play.begin(), play.end(), comb.begin(), comb.end(), tmp.begin()); // обьединаем карты игрока и найденые карты  той же масти
                   sort(tmp.begin(), n_end, op);  //сортируем 
                   n_end=unique(tmp.begin(), n_end); //удаляем дубликаты( поскольку нам необходимо  определить в текушей последовательности
                   tmp.erase(n_end, tmp.end()); // есть ли 5 карт идущих подряд например 2,3,4,5,6, или 7,8,9,10,11
                   
                   n=0; //обнуляем счетчик
                   for(int i=(tmp.size()-2); i>=0; i--){ // ищем в обратном напрвлении что бы найти последовательность из 5 карт со старшей картой
                   if((tmp[i].first+1)==tmp[i+1].first) // если значения соседних карт отличяются на единицу счетчик увеличивается
                   {
                          n++;             
                   }}
                   if(n==5)
                   {
                           points=max_v*100000000; // если найденые карты соотв комбинации флеш + они идут подряд значит это комб стрит-флеш
                           return true; //старшую карту умножаем на 100000000 у старше карта в комбинации тому и принадлежит комбинация
                   }
                   else
                   {
                       flash=true;             //если найденые карты не идут подряд значит это просто флеш тут нужно будет добавить очки
                       return false;
                   }
                   
           }
           else                          // если найдено меньше 3 карт тойже масти что и у игрока значит стрит-флеша и флеша уже не будет
           {
               points=0;
               return false;
           }
     }
     else { str_flash(board, play, points, ++x, flash);} // если масти 2 катр игрока разные вызываем эту же функцию с увеличенным значением Х
  }                                                   //функция должа будет вызватся 2 раза что бы проверить каждую карту игрока на образование комбинации с картами со стола
  else //дальше все по аналогии только для одной карты
  {
     col_card comb(5), tmp(7);
     int max_v=play[x].first, n=0;
     
     
           for(int i=0; i<5; i++)
                if(board[i].second==play[x].second)
                {
                         n++;
                         comb.push_back(board[i]);
                }
           if(n>=4)
           {
                   col_card::iterator n_end;
                   
                   tmp.push_back(play[x]);
                   sort(tmp.begin(), tmp.end(), op);
                   n_end=unique(tmp.begin(), n_end);
                   tmp.erase(n_end, tmp.end());
                   
                   n=0;
                   for(int i=tmp.size()-2; i>=0; i--)
                   if(tmp[i].first+1==tmp[i+1].first)
                   {
                          n++;
                   }
                   if(n==5)
                   {
                           points=max_v*100000000;
                           return true;
                   }
                   else
                   {
                       flash=true;
                       return false;
                   }
                   
           }
           else
           {
               if(++x!=2)
               str_flash(board, play, points, x, flash);
               
               points=0;
               return false;
           }
     }
  }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2013, 22:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос стрит-флеш (C++):

Проверка на стрит(покер) - C++
В одном из заданий из книги Дейтелов необходимо определить, имеется ли на руках у игрока стрит(пять карт последовательных номиналов). Но...

Определить, выпал ли стрит? - C++
Добрый день, задача следующая, нужно определить выпал ли стрит(5 карт последовательно любой масти) Изначально выдается 5 карт случайных....

Защита флеш накопителя - C++
Наткнулся на прогу по защите флеш накопителей. Алгоритм очень прост, активируете - и ВСЯ память до 0 флешки заполняется, деактивируете и...

Заблокировать запись на флеш накопитель - C++
Не знаю в какой раздел лучше отнести данную тему. Состоит вопрос в чем. Нужно написать некую программу при помощи которой можно отслеживать...

бот для браузерной флеш-игры - C++
ребят, понадобилась помощь! никогда не работал из с++ с флешь и браузером. это для меня в новинку.может кто знает как написать бота для...

Возможно ли определить куда ранее подключался флеш-накопитель? - C++
Здравствуйте. Возможно ли, имея флеш-накопитель, определить к каким устройствам он ранее подключался? Если возможно, то как это можно...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 00:48 #2
Кликните здесь для просмотра всего текста
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
#include <vector>
#include <algorithm>
using namespace std;
 
struct card
{
       
       int first; //величина карты
       int second; //её масть
       card(int f, int s) : first(f), second(s) {}
       card() : first(0), second(0) {}
      
       card& operator=(const card& cop)
       {
             first  = cop.first;
             second = cop.second;
        return *this;
       }
 
       bool operator==(const card& cop)
       {
             if (first == cop.first && second == cop.second)
                 return true;
             else return false;
       }
 
       bool operator>(const card& cop)
       {
             if (first > cop.first && second > cop.second)
                 return true;
             else return false;
       }
 
       bool operator<(const card& cop)
       {
             if (first < cop.first && second < cop.second)
                 return true;
             else return false;
       }
      
};
 
 
bool op(const card& c1, const card& c2)
{
     if (c1.first < c2.first) return true; //критерий сортировки карт
     return false;
}
 
 
typedef vector<card> col_card;
 
bool str_flash(col_card& board, col_card& play, int& points, int& x, bool& flash) // board - коллекция карт на столе 
{                                                                                  //play-коллекция карт игрока 
  if(x==3)//  если х=3 первый вызов, нужно проверить одой ли масти карты игрока,      points-очки x-индикатор flash-если комбинация                                                                         
  {                                                                     //флеш, а не стрит флеш flash=true что бы в дальнейшем не тратить время
     col_card comb(5), tmp(7);                                         //на поиск комбинации флеш
     int max_v, n=0; // max_v максимальное значение среди карт, n- cчетчик
     
     if(play[0].second == play[1].second) //если карты игрока одной масти
     {
           play[0].first > play[1].first ? max_v=play[0].first : max_v=play[1].first; //находим старшую карту игрока(без учета масти)
           
           for(int i=0; i<5; i++)
                if(board[i].second==play[0].second) //проверяем каждую карту со стола на сходство масти с картой игрока
                {
                         n++;  // если масть карты на столе равна масти игрока счетчик увеличивается
                         comb.push_back(board[i]); // сохраняем карту для далнейшей проверки на комбинацию стрит(5 карт подряд)
                }
           if(n>=3) // если на столе 3+  карт тойже масти что и 2 карты игрока = 3+2= 5 комбинация флеш(5 карт одной масти)
           {
                   col_card::iterator n_end;//новый конец 
                   
                   n_end=set_union(play.begin(), play.end(), comb.begin(), comb.end(), tmp.begin()); // обьединаем карты игрока и найденые карты  той же масти
                   sort(tmp.begin(), n_end, op);  //сортируем 
                   n_end=unique(tmp.begin(), n_end); //удаляем дубликаты( поскольку нам необходимо  определить в текушей последовательности
                   tmp.erase(n_end, tmp.end()); // есть ли 5 карт идущих подряд например 2,3,4,5,6, или 7,8,9,10,11
                   
                   n=0; //обнуляем счетчик
                   for(int i=(tmp.size()-2); i>=0; i--){ // ищем в обратном напрвлении что бы найти последовательность из 5 карт со старшей картой
                   if((tmp[i].first+1)==tmp[i+1].first) // если значения соседних карт отличяются на единицу счетчик увеличивается
                   {
                          n++;             
                   }}
                   if(n==5)
                   {
                           points=max_v*100000000; // если найденые карты соотв комбинации флеш + они идут подряд значит это комб стрит-флеш
                           return true; //старшую карту умножаем на 100000000 у старше карта в комбинации тому и принадлежит комбинация
                   }
                   else
                   {
                       flash=true;             //если найденые карты не идут подряд значит это просто флеш тут нужно будет добавить очки
                       return false;
                   }
                   
           }
           else                          // если найдено меньше 3 карт тойже масти что и у игрока значит стрит-флеша и флеша уже не будет
           {
               points=0;
               return false;
           }
     }
     else { str_flash(board, play, points, ++x, flash);} // если масти 2 катр игрока разные вызываем эту же функцию с увеличенным значением Х
  }                                                   //функция должа будет вызватся 2 раза что бы проверить каждую карту игрока на образование комбинации с картами со стола
  else //дальше все по аналогии только для одной карты
  {
     col_card comb(5), tmp(7);
     int max_v=play[x].first, n=0;
     
     
           for(int i=0; i<5; i++)
                if(board[i].second==play[x].second)
                {
                         n++;
                         comb.push_back(board[i]);
                }
           if(n>=4)
           {
                   col_card::iterator n_end;
                   
                   tmp.push_back(play[x]);
                   sort(tmp.begin(), tmp.end(), op);
                   n_end=unique(tmp.begin(), n_end);
                   tmp.erase(n_end, tmp.end());
                   
                   n=0;
                   for(int i=tmp.size()-2; i>=0; i--)
                   if(tmp[i].first+1==tmp[i+1].first)
                   {
                          n++;
                   }
                   if(n==5)
                   {
                           points=max_v*100000000;
                           return true;
                   }
                   else
                   {
                       flash=true;
                       return false;
                   }
                   
           }
           else
           {
               if(++x!=2)
               str_flash(board, play, points, x, flash);
               
               points=0;
               return false;
           }
     }
}
1
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
02.08.2013, 01:32  [ТС] #3
только операторы сравнения нужно было добавить?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 01:47 #4
Там только масть, наверное, не нужно сравнивать, то это уже сами.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2013, 01:47
Привет! Вот еще темы с ответами:

Реально ли как-то заставить их работать флеш элементы сайтов без флеш-плеера? - Софт
Собственно решил отказаться от этой гадости, но некоторые сайты всё таки требуют его для показа содержимого или воспроизведения видео. Хочу...

Для браузерной онлайн игры нужны: 1 программист (php+mysql+флеш), 1 дизайнер (флеш,образы,оружие и т.д.) - Графика и игры
Приветствую, для браузерной онлайн игры требуются: 1 программист (php+mysql+флеш), 1 дизайнер (флеш, интерфейсный...

3d во флеш - Flash
Здравствуйте ! Заинтересовал такой вопрос. Как в браузерных играх реализуется возможность одевать вещи непосредственно на...

Галерея во флеш - ActionScript
Здраствыйте! Подсткажите пожалуйста как сделать галерею в виде книги чтоб какбы береш за кончик страници и перетаскиваеш открывается еще 2...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2013, 01:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru