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

Покер. Поиск пар - C++

Восстановить пароль Регистрация
 
randy92
7 / 7 / 2
Регистрация: 23.04.2014
Сообщений: 59
14.05.2014, 17:26     Покер. Поиск пар #1
Добрый день, помогите решить задачку из учебника. Хочется самому как-то додуматься до всего, а не искать готовых ответов.

Необходимо создать игру "покер" и постепенно реализовать все его игровые правила. Пока программа умеет только перемешивать и сдавать 5 карт на руку. Следующим шагом нужно "научить" ее распознавать, когда у игрока на руках пара. Привожу код с комментами:

DeckOfCards.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
class DeckOfCards
{
public:
    DeckOfCards();
    void shuffle();
    void deal();
    void cardCombo();
 
private:
    int deck[ 4 ][ 13 ]; //колода карт
    int hand[ 4 ][ 13 ]; //карты, которые в данный момент на руках у игрока
};
DeckOfCards.cpp
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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include "DeckOfCards.h"
using namespace std;
 
DeckOfCards::DeckOfCards()
{
    for( int row = 0; row <= 3; row++ )
    {
        for( int column = 0; column <= 12; column++ )
        {
            deck[ row ][ column ] = 0; //Инициализируем колоду и карты на руках нулями
            hand[ row ][ column ] = 0;
        }
    }
    srand( time( 0 ) );
}
 
void DeckOfCards::shuffle()
{
    int row;
    int column;
 
    for( int card = 0; card <= 52; card++ ) // Перемешиваем карты
    {
      do
      {
          row = rand() % 4;
          column = rand() % 13;
      }
      while( deck[ row ][ column ] != 0 );
 
      deck[ row ][ column ] = card;
    }
}
 
void DeckOfCards::deal()
{
    static const char* suit[ 4 ] =
        { "Hearts", "Diamonds", "Clubs", "Spades" };
 
    static const char* face[ 13 ] =
        { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
        "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
 
        for( int card = 1; card <= 5; card++ ) //раздаем 5 карт
        {
            for( int row = 0; row <= 3; row++ )
            {
                for( int column = 0; column <= 12; column++ )
                {
                    if( deck[ row ][ column ] == card )
                    {
                        hand[ row ][column ] = card; //заносим в память текущую карту
                        cout << face[ column ] << " of " << suit[ row ] << endl; // просто вывод на экран всех разданных карт
                    }
                }
            }
        }
 
}
 
void DeckOfCards::cardCombo() 
{
 
}
main
C++
1
2
3
4
5
6
7
8
9
10
#include "DeckOfCards.h"
 
int main()
{
    DeckOfCards deckOfCards;
    deckOfCards.shuffle();
    deckOfCards.deal();
 
    return 0;
}
Моя идея такова: создать двумерный массив hand 4 на 13, в котором будут помечаться текущие карты на руках игрока. Затем каким-то образом его просканировать с помощью функции cardCombo() на наличие "пар". Если есть идеи: пишите, либо предлагайте иной способ. Спасибо!

Добавлено через 2 часа 18 минут
Сидел голову ломал, как это реализовать. И идея пришла, хотя пока и в сыром виде. Если кому интересно тоже : читайте далее.
Идея состоит в том, чтобы представить каждую карту на руках в численном виде и записать полученный численный ряд в одномерный массив hand. Вот как я переводил каждую карту в число:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for( int card = 1; card <= 5; card++ ) //раздаем 5 карт
        {
            for( int row = 0; row <= 3; row++ )
            {
                for( int column = 0; column <= 12; column++ )
                {
                    if( deck[ row ][ column ] == card )
                    {
                        hand[ card ] = ((row * 100) + 100) + (column + 1);
                        cout << face[ column ] << " of " << suit[ row ] << endl; // просто вывод на экран всех разданных карт
                        cout << hand[ card ] << endl;
                    }
                }
            }
        }
В результате, количество сотен соответствовало порядковому номеру масти ( 1 = "Hearts", 2 = "Diamonds", 3 = "Clubs", 4 = "Spades"), а оставшееся число - ее достоинство.

чтобы найти пару, применяется следующий алгоритм:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void DeckOfCards::cardCombo()
{
    int amountsOfPairs[ 13 ] = { 0 };
 
    for( int i = 1; i <= 5; i++ )
    {
        amountsOfPairs[ hand[ i ] % 100 ]++;
        cout << " number added...." << endl;
    }
 
    for( int j = 0; j < 13; j++ )
    {
        if( amountsOfPairs[ j ] == 2 )
            cout << "Pair" << endl;
    }
}
Думаю, подобным образом получится реализовать все остальные задачи.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2014, 17:26     Покер. Поиск пар
Посмотрите здесь:

C++ Поиск противоположных пар чисел
Для встречающихся в заданном тексте пар расположенных символов указать, сколько раз встречается каждое из таких пар C++
C++ Для встречающихся в заданном тексте пар расположенных символов указать, сколько раз встречается каждое из таких пар.
Покер C++
Покер C++
поиск нечетных пар C++
C++ Бинарный поиск таких пар чисел массива, чтобы их сумма попадала в заданный диапазон
C++ Покер

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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