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

Как раздать по 5 карт - C++

Восстановить пароль Регистрация
 
akav
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 3
06.07.2012, 02:45     Как раздать по 5 карт #1
Из 5 издания Дэйтелов.
Задача
Создается массив 4х13 и иниц. случайными значениями от 1 - 52(номер)
затем создаются 2 массива: с мастями; и с номиналами
и по номеру карты раздаются: номинал of масть ТОЕСТЬ ВСЕ 52 КАРТЫ
Вопрос
Как заставить программу раздавать карты по 5 штук для каждого игрока ( а не все 1 )
да так чтобы раздавались спрева всем по 1 потом по 2 карты и т.д.?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2012, 02:45     Как раздать по 5 карт
Посмотрите здесь:

Цикл for и 56 карт C++
Колода карт C++
Массив карт C++
Колода карт C++
Клас колода карт C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nunuvin
2 / 2 / 0
Регистрация: 04.07.2012
Сообщений: 11
06.07.2012, 07:59     Как раздать по 5 карт #2
Цитата Сообщение от akav Посмотреть сообщение
Как заставить программу раздавать карты по 5 штук для каждого игрока ( а не все 1 )
Можно в главном цикле сделать проверку на четность. Если чет значит карта 2, а нечет 1.
akav
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 3
06.07.2012, 10:54  [ТС]     Как раздать по 5 карт #3
2 часа назад задал этот вопрос нашему главному программисту...Он до сих пор не может понять как
реализовать такой простой примерчик и никто из группы 6 чел.

Nunuvin подскажите пожалуйста, я не совсем понял, как мне это поможет...
Lucky_spirit
2 / 2 / 1
Регистрация: 10.05.2012
Сообщений: 45
06.07.2012, 16:50     Как раздать по 5 карт #4
Цитата Сообщение от akav Посмотреть сообщение
Из 5 издания Дэйтелов.
Задача
Создается массив 4х13 и иниц. случайными значениями от 1 - 52(номер)
Простите, а если вдруг (ну, бывает такое) 2 карты инициализируются одним номером? То в колоде 2 пиковых туза будет? Ну, нормально так: для шулеров в самый раз.
akav
0 / 0 / 0
Регистрация: 06.07.2012
Сообщений: 3
07.07.2012, 05:05  [ТС]     Как раздать по 5 карт #5
Ну там цикл будет генерировать новые числа пока данная яцейка не будет равна 0 и только тогда может присвоить значение от 1 - 52. Масивв при определение иниц. нулями
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
08.07.2012, 14:11     Как раздать по 5 карт #6
Цитата Сообщение от akav Посмотреть сообщение
Из 5 издания Дэйтелов.
Задача
Создается массив 4х13 и иниц. случайными значениями от 1 - 52(номер)
затем создаются 2 массива: с мастями; и с номиналами
и по номеру карты раздаются: номинал of масть ТОЕСТЬ ВСЕ 52 КАРТЫ
Вопрос
Как заставить программу раздавать карты по 5 штук для каждого игрока ( а не все 1 )
да так чтобы раздавались спрева всем по 1 потом по 2 карты и т.д.?
Ну вот не пойму я: если сначала раздавать 1, затем 2, и затем 3 карты, то получается 6 карт, а не 5...
Итого получается максимум игроков, на которых можно раздать по 6 карт, это 8 человек: 6*8=48, и 4 остаются в колоде.

У меня вот так получилось:

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
#include<iostream>
#include<cstdlib>           //для генерирования
#include<ctime>             //случайных чисел
using namespace std;
 
bool number_kart[52];   //массив для хранения уникального номера карты
 
int& proverka_vipadenia_chisla(int &GENERIIK_SHISLO);       //проверка уникальности числа(если число уже было, возвращает другое число)
 
void view_kart(int kart);                                   //отображает номинал и масть карты
 
int main()
{
    setlocale(LC_ALL,"Rus");            //русский язык
 
    int kol_vo_igrokov=0;
 
    cout<<"Введите кол-во игроков(от 1 до 8): ";
 
    cin>>kol_vo_igrokov;
 
    ///////////////////выделяем память под двумерный массив [кол-во игроков][кол-во карт]////////////////////////
 
    int **kart_igrokov=new int*[kol_vo_igrokov];        //выделяем память под кол-во игроков
 
    register int i=0,j=6;                           
 
    for(i=0;i<kol_vo_igrokov;i++)                       //и под 6 карт
    {
        kart_igrokov[i]=new int[j];
        
        for(j=0; j<6;j++)
            kart_igrokov[i][j]=0;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    /////////////////////////обнуляем массив bool number_kart[52]//////////////////////////////////////////////////
    for(i=0;i<52;i++)
        number_kart[i]=false;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
    srand(time(0));
 
    int generik_chislo=0;                   //сгенерированное число
 
    int number_igrok=0;                     //номер игрока, которому раздается карта
 
    int counter=0;                          //сдаем карты три раза(сначала по одной, потом по две, потом по три)
    
    j=0;
 
    //////////////////////раздаем по одной карте////////////////////////////////////////////////////////////////////
    counter=1;
 
    while(counter>0)                        
    {
            number_igrok=0;
 
            while(number_igrok<kol_vo_igrokov)
            {
                generik_chislo=rand()%52;                                   //генерируем число от 0 до 51
                generik_chislo=proverka_vipadenia_chisla(generik_chislo);   //проверяем уникальность числа
 
                kart_igrokov[number_igrok][j]=generik_chislo;
 
                number_igrok++;
            }
                counter--;
                j++;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    //////////////////////раздаем по две карты////////////////////////////////////////////////////////////////////
    counter=2;
    
    while(counter>0)                        
    {
            number_igrok=0;
 
            while(number_igrok<kol_vo_igrokov)
            {
                generik_chislo=rand()%52;                                   //генерируем число от 0 до 51
                generik_chislo=proverka_vipadenia_chisla(generik_chislo);   //проверяем уникальность числа
 
                kart_igrokov[number_igrok][j]=generik_chislo;
 
                number_igrok++;
            }
                counter--;
                j++;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    //////////////////////раздаем по три карты////////////////////////////////////////////////////////////////////
    counter=3;
    
    while(counter>0)                        
    {
            number_igrok=0;
 
            while(number_igrok<kol_vo_igrokov)
            {
                generik_chislo=rand()%52;                                   //генерируем число от 0 до 51
                generik_chislo=proverka_vipadenia_chisla(generik_chislo);   //проверяем уникальность числа
 
                kart_igrokov[number_igrok][j]=generik_chislo;
 
                number_igrok++;
            }
                counter--;
                j++;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
    ///////////////////////////////выводим выпавшие у игроков карты//////////////////////
 
    for(i=0;i<kol_vo_igrokov;i++)                       
    {
        cout<<"У игрока "<<i+1<<" след. карты:  ";
        
        for(j=0; j<6;j++)
        {
            int temp=kart_igrokov[i][j];
            view_kart(temp);
        }
 
        cout<<endl;
    }
    ////////////////////////////////////////////////////////////////////////////////////
 
 
    ///////////////////////////////выводим оставшиеся карты////////////////////////////
    cout<<"********************В колоде остались: ******************"<<endl;
 
        for(i=0;i<52;i++)
        {
 
            if(number_kart[i]==false)
            {
                view_kart(i);   
            }
        }
 
        cout<<endl;
    //////////////////////////////////////////////////////////////////////////////////
 
 
    ///////////////////////////////////освобождаем память////////////////////////////
    for(i=0;i<kol_vo_igrokov;i++)
        delete [] kart_igrokov[i];
 
    delete [] kart_igrokov;
    ///////////////////////////////////////////////////////////////////////////////////
 
    return 0;
}
 
 
 
int& proverka_vipadenia_chisla(int &GENERIIK_SHISLO)
{
    if(number_kart[GENERIIK_SHISLO]==false)         //если число не выпадало
    {
        number_kart[GENERIIK_SHISLO]=true;          //ставим, что оно выпало
        return GENERIIK_SHISLO;                     //и возвращаем его
    }
    else                                            //иначе, если выпадало
    {
        for(int i=0;i<52;i++)                       //ищем число, которое не выпало
        {   
            if(number_kart[i]==false)               //если числа не было
            {
                GENERIIK_SHISLO=i;                  //присваиваем ему значение
                number_kart[i]=true;                //отмечаем, что значение присвоено
 
                return GENERIIK_SHISLO;             //возвращаем его
            }
        }   
    }
 
    cout<<"Ошибка"<<endl;
    exit(0);
}
 
 
 
void view_kart(int kart)
{
    char rank[52][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K",     //номинал карты
                      "A","2","3","4","5","6","7","8","9","10","J","Q","K",
                      "A","2","3","4","5","6","7","8","9","10","J","Q","K",
                      "A","2","3","4","5","6","7","8","9","10","J","Q","K"};
 
    int suit[52]={3,3,3,3,3,3,3,3,3,3,3,3,3,        //черви
                  4,4,4,4,4,4,4,4,4,4,4,4,4,        //буби
                  5,5,5,5,5,5,5,5,5,5,5,5,5,        //трефы
                  6,6,6,6,6,6,6,6,6,6,6,6,6};       //пики
    
    cout<<rank[kart]<<(char)suit[kart]<<" ";                                    //вывод
}
Миниатюры
Как раздать по 5 карт   Как раздать по 5 карт  
Lucky_spirit
2 / 2 / 1
Регистрация: 10.05.2012
Сообщений: 45
09.07.2012, 10:36     Как раздать по 5 карт #7
Реализация интересная, но заметил в скриншотах результатов, что в колоде оставшиеся карты идут по масти. В случае 4-х игроков, карты остались пиковой масти. В другом случае - сначала бубновые карты, потом пика. Это просто вывод так реализован?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.07.2012, 12:51     Как раздать по 5 карт
Еще ссылки по теме:

Редактор карт на C++, SFML C++
C++ Программа перетасовки карт
C++ Генерация набора карт

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

Или воспользуйтесь поиском по форуму:
DPS
 Аватар для DPS
32 / 32 / 3
Регистрация: 12.11.2011
Сообщений: 107
Завершенные тесты: 1
09.07.2012, 12:51     Как раздать по 5 карт #8
Генерируется число от 0 до 51 и на его основе выбирается уникальная карта. Если число уже было, выбирается другое число.
Конкретно в этом листинге недостаток состоит в проверке совпадения числа, если число уже было(например, берем 4), то начинается проверка, начиная от нуля. Если ноль не выпадал, то выбираем его и т.д. по нарастающей. Это самый примитивный алгоритм.

C++
1
2
3
4
5
6
7
8
   for(int i=0;i<52;i++)                       
        {   
            if(number_kart[i]==false)               
            {
                GENERIIK_SHISLO=i;                  
                number_kart[i]=true;                
 
                return GENERIIK_SHISLO;
Естественно, шанс выпасть у червей будет побольше, чем у пик, т.к. в нашей конкретной реализации проверка и присвоение начинается от нуля. Можно изменить шанс выпадения наоборот, если осуществлять проверку от 52 и вниз.Соответственно тогда шансы выпасть у пик будут больше.

Но это все поправимо, необходимо лишь изменить реализацию выбора числа в случае совпадения.
Yandex
Объявления
09.07.2012, 12:51     Как раздать по 5 карт
Ответ Создать тему
Опции темы

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