Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Покер. Опознание двух пар. ошибка Debugger Exception Notification 
V
    Опции темы
odys
Дата 13.2.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Пишу модель игры в покер. Возникла проблема с опознанием двух пар.
в FirstFace[i] содержится номинал i-ой карты (без масти, масть содержится в другом массиве указателей). к примеру {2, В, T, 2, B)
Код

   for( int i = 1; i <= 4; i++)
      for( int j = i + 1; j <=  5; j++)
      if (FirstFace[i] == FirstFace[j])           /// После того как обнаружили одну пару, смотрим нет ли второй.

      {

      for(int m = 1; m <= 4, m != i, m != j; m++)
      for( int n = m + 1; n <=  5, m != i, m != j; n++)
      if (FirstFace[m] == FirstFace[n])                                          /// Здесь возникакает ошибка, если в программе выпадают 2 пары.
       cout<<endl<<"((((((00000000000 You have two pair 0000000000))))))))))";
      }


}



Код всей программы. если возникнет необходимость... Прошу прощения надо уйти до 12, и не хватило времени привести ее в нормальный стиль. Да и не думаю что она вся понадобиться.
Код

#include <iostream>
#include <iomanip>
#include <stdlib>
#include <time>

using namespace std;

//void shuffle (int [] [13]);
void shuffle2(int [] [13]);
void deal( int[][13],  char *[],  char *[]);
//void hand(const int[][13], const char *[], const char *[]);
void firstHand( int wDeck[][13], char *FirstFace[], char *FirstSuit[],  char *wFace[],  char *wSuit[]);

void combinacia(char *FirstFace[], char *FirstSuit[]);

main ()
{
  char *suit[4] = {"Chervi", "Bybni", "Trefi", "Piki"};
  char *face[13] = {"Tyz", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valet",
                   "Dama", "Korol"};
       char *hand1suit[5];
       char *hand1face[5];

 int deck[4][13] = {0};
  char z;
 cout<<" VVedit 0 dlia vihoda"<<endl;
 cin>>z;
 while ( z != 0)
 {
 srand(time(NULL));
   shuffle2(deck);
//   deal(deck, face, suit);
   firstHand(deck, hand1face, hand1suit,  face, suit);
     cout<<" 5 first cards"<<endl;
     for (int i=1; i<=5; i++)
     {

               std::cout
                        <<hand1face[i]<<"  "

                        <<hand1suit[i]<<"    ";

     }
// hand(deck, face, suit);
  combinacia(hand1face, hand1suit);
   cin>>z;
}

cin>>z;
 return 0;
}

//------------------------------------------------------------------------------
 /*
void shuffle(int wDeck[][13])
{
   int row, column;
   for (int card = 1; card<=52; card++)
   {
      row = rand()%4;
      column = rand()%13;

      while(wDeck[row][column] != 0)
      {
         row = rand()%4;
         column = rand()%13;
      }

      wDeck[row][column] = card;
   }
}
   */
//------------------------------------------------------------------------------

void deal( int wDeck[][13],  char *wFace[],  char *wSuit[])
{
   for (int card = 1; card <=52; card++)
      for (int row = 0; row <=3; row++)
         for (int column = 0; column <= 12; column++)
            if (wDeck[row][column] == card)
               std::cout<< setw(9) <<setiosflags(ios::right)
                        <<wFace[column]<<"  "
                        <<setw(5) <<setiosflags(ios::left)
                        <<wSuit[row]
                        << (card%2 ==0 ? '\n' : '\t');
}

//------------------------------------------------------------------------------
/*
void hand (const int wDeck[][13], const char *wFace[], const char *wSuit[])
{
char carta1, carta2, carta3, carta4, carta5;
std::cout<<"I have in my hand "<<endl;
 for (int card = 1; card <=5; card++)
   for (int row = 0; row <=3; row++)
         for (int column = 0; column <= 12; column++)
            if (wDeck[row][column] == card)
            {
            std::cout<<wFace[column]<<"  "<<wSuit[row]<<"   ";
            carta1 = wFace[column]
            }
}
  */
//------------------------------------------------------------------------------
// Второй способ тосовать колоду
void shuffle2(int wDeck[][13])
{
int row, column, rRow, rCol, rTemp, number;
for (int card=1; card<=52; card ++)
   {
   row = card % 4;
   column = card % 13;
   wDeck[row][column] = card;
   }
number = rand() % 10000 + 500;
for (int cicl = 1; cicl <= number; cicl++)
   {
   rRow = rand() % 4;
   rCol = rand() % 13;

   rTemp = wDeck[rRow][rCol];
   wDeck[rRow][rCol] = wDeck[(rRow+1) % 4][rCol];
   wDeck[(rRow+1) % 4][rCol] = rTemp;
   }
number = rand() % 10000;
for (int cicl = 1; cicl <= number; cicl++)
   {
   rRow = rand() % 4;
   rCol = rand() % 13;

   rTemp = wDeck[rRow][rCol];
   wDeck[rRow][rCol] = wDeck[rRow][(rCol+1) % 13];
   wDeck[rRow][(rCol+1) % 13] = rTemp;
   }

}

//------------------------------------------------------------------------------

void firstHand( int wDeck[][13], char *FirstFace[], char *FirstSuit[],  char *wFace[],  char *wSuit[])
{
    for (int card = 1; card <=5; card++)
      for (int row = 0; row <=3; row++)
         for (int column = 0; column <= 12; column++)
            if (wDeck[row][column] == card)
                {
                FirstFace[card] = wFace[column];
                FirstSuit[card] = wSuit[row];
                }


}

//------------------------------------------------------------------------------

void combinacia(char *FirstFace[], char *FirstSuit[])
{

   for(int i = 1; i <= 4; i++)
      for( int j = i + 1; j <=  5; j++)
      if (FirstFace[i] == FirstFace[j])
      cout<<endl<<" You have pair ";
   for(int i = 1; i <= 3; i++)
      for( int j = i + 1; j <=  4; j++)
         for ( int z = j + 1; z <= 5; z++)
      if ((FirstFace[i] == FirstFace[j]) && (FirstFace[i] == FirstFace[z]))
      cout<<endl<<" !!!!!!!!!!----You have Trio---!!! ";
   for(int i = 1; i <= 4; i++)
      for( int j = i + 1; j <=  5; j++)
      if (FirstFace[i] == FirstFace[j])

      {

      for(int m = 1; m <= 4, m != i, m != j; m++)
      for( int n = m + 1; n <=  5, m != i, m != j; n++)
      if (FirstFace[m] == FirstFace[n])
       cout<<endl<<"((((((00000000000 You have two pair 0000000000))))))))))";
      }


}

PM MAIL   Вверх
zim22
Дата 13.2.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(odys @  13.2.2009,  12:37 Найти цитируемый пост)
 for(int m = 1; m <= 4, m != i, m != j; m++)

ты используешь оператор запятая в условии. это значит, что будет проверяться только самое правое условие m != j. Остальные будут проигнорированы.

Попробуй например скомпилить это и посмотри, какое условие выполнится:
Код
for (size_t i = 0; i != 5, i < 2, i != 0, i < 10; ++i)
    {
        std::cout << i << std::endl;
    }




--------------------
PM MAIL   Вверх
Gluttton
Дата 13.2.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Код

   for( int i = 1; i <= 4; i++)
      for( int j = i + 1; j <=  5; j++)
      if (FirstFace[i] == FirstFace[j])                                                  
      // После того как обнаружили одну пару, смотрим нет ли второй.
      {
          // Для этого перебирая все карты
          for(int m = 1; m <= 4; m++) 
          // игнорируя первую пару
          if(( m!=i ) && ( m!=j ))
          {
              // ищем одинаковые
              for( int n = m + 1; n <=  5; n++)
              // среди тех, которые не входят в первую пару                      
              if ((n!=i) && (n!=j) && (FirstFace[m] == FirstFace[n]))
              cout<<endl<<"((((((00000000000 You have two pair 00000000000))))))))))";
          }
      }


Вот такого плана можно попробовать вариант. Но на самом деле это не является решением проблемы.
1. По такому вот алгоритму ты вместо Full House выдашь Two Pair.
2. Для комбинаций карт, в которых первая идет пара (Two Pair, 3 of k, Full House, 4 of k) твоя программа будет выдовать пару. (Могу ошибаться).
Например:  
2 2 3 3 4 ;
2 2 2 5 6;
2 2 2 3 3;
2 2 2 2 4.
Для всех этих комбинаций будет выигрыш - пара.

Предлагаю другой вариантв на квазипсевдокоде с коментарием  smile .
Код

bool fhSign=false;    Признак фул хауса
bool trSign=false;    Признак тройки
bool twpSign=false;   Признак двух пар
bool trSign=false;    Признак тройки
bool pSign=false;     Признак пыры
for ( i )                                        Открываем вложеный цикл
{  for ( i )                                     для поиска пары
   {   if ( F[i]==F[i] )                         Если пара есть, то ищем третью карту
       {   for ( k )                             Для этого отрывает новый цикл
           {   if ( F[i]==F[k] )                 Если тройка есть,
               {   for ( l )                     то ищем каре (в новом цикле)
                   {   if ( F[i]==F[l] )         Если находим, то
                       {   fourSign=true;        каре
                           break;        
                       }
                       else                      Если нет, то это не каре, но может быть фул хаус
                       {                         для проверки открываем вложеный цикл, где ищем пару
                           if ( ) fhSign=true    если находим, то фул хаус, 
                           else ( ) trSign=true  а если нет, то тройка 
                       } 
                    }
                }
                else                             Если не тройка, но пара есть,
                {
                    for ( m )
                    {   for ( n )                то ищем ещё одну пару
                        {   if ( N[m]==N[n])      если находим, 
                            {                    
                               for ( o )         то проверяем не тройка ли
                               if ( N[o]==N[n])  если находим, 
                                   fhSign=true   то фул хаус
                               else
                                   twpSign=true; а если нет, то две пары
                            }
                        }
                    }
                    else pSign=true;             Пара
                }
            }
        }
    }
}


После такого цикла тебе останется написать условие на флэшь, стрит и их гибрид  smile , но это уже задача намного легче.

В конце программы проверяешь "флажки", от старшего выигрыша к младшему, где true - там и победа.




--------------------
Слава Україні!
PM MAIL   Вверх
odys
Дата 13.2.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Изначально я планировал сделать приблизительно так:
Расположить в порядке возростания позиции в покере, и если к примеру выполнялось условия пара - присвоить индикатору 1, две пары - 2, 3 of k - 3. И так далее. Таким образом пара бы поглащалась в более сильных условиях, и не только пара.
Застрал только на двух парах.
Хотел сделать быстро, и понадеелся, что в цикле можно довать несколько условий, но ошибся... Сейчас буду смотреть.
Спасибо за код)
PM MAIL   Вверх
Dobermann
Дата 13.2.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



А чО, карточные боты еще в моде??? smile 
PM   Вверх
odys
Дата 13.2.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Нашел очень забавный выход))) Спасибо всем тема исчерпана)
PM MAIL   Вверх
Dobermann
Дата 13.2.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 992
Регистрация: 7.1.2008

Репутация: нет
Всего: 0



Какой?
PM   Вверх
odys
Дата 13.2.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 9.11.2008

Репутация: нет
Всего: нет



Код

   int cPair = 0;
   for(int i = 1; i <= 4; i++)
      for( int j = i + 1; j <=  5; j++)
      if (FirstFace[i] == FirstFace[j])
      {
       cPair++;
      }
    if (cPair == 1)
    cout<<endl<<" You have ONE PAIR "<<endl;
    if (cPair == 2)
    cout<<endl<<" You have TWO PAIRs "<<endl;
    if (cPair == 3)
    cout<<endl<<" Tree of kind "<<endl;
    if (cPair == 4)
    cout<<endl<<" FULL HOUSE "<<endl;
    if (cPair == 6)
    cout<<endl<<" FOUR of KIND "<<endl;


Смысл в том что одна пару комп найдет 1 раз, две пары 2 раза, 3 одного вида найдет 3 раза, фул хаус 4 раза, и 4 одного вида 6 раз... Теперь думаю над стритом)
PM MAIL   Вверх
Gluttton
Дата 13.2.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: нет
Всего: 54



Стрит:

1. Находим наименьшую карту.
2. Ищем мин.+(1, ..., 4)
3. Если хоть одну не находим, то не стрит, если цикл "доехал" до конца, то стрит.


Код

int strSign=0;
for (int i=1; i<=4; i++)
{   
    for (int j=1; j<=5; j++)
    {
        if (min == F[i]-i)
        {   strSign++;
             break;
        }
    }
}
if (strSign == 5)
    ...


И ещё, рекомендую посмотреть в сторону enum вместо char *, они специально придуманы для обозначения дней недели, света светофора и мастей  smile .


--------------------
Слава Україні!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.