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

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

Восстановить пароль Регистрация
 
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
01.08.2013, 22:53     стрит-флеш #1
Написал функцию проверки на образование комбинации стрит-флеш....помидорами не закидывать писал не очень вдумчиво но здесь какие то ошибки при использовании алгоритмов 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;
           }
     }
  }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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;
           }
     }
}
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
02.08.2013, 01:32  [ТС]     стрит-флеш #3
только операторы сравнения нужно было добавить?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 01:47     стрит-флеш #4
Там только масть, наверное, не нужно сравнивать, то это уже сами.
Yandex
Объявления
02.08.2013, 01:47     стрит-флеш
Ответ Создать тему
Опции темы

Текущее время: 00:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru