#include <time.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
int players_cards[5][14]; // [][]матрица, карты на руках игроков
// [][0] выдано карт по мастям
// [0][0] количество полностью выданных мастей
// [0][] Зарезервировано
int players = 6;
int deals = 2; // количество раздач после первой
void dispenser(int s, int p){ // выдаём карту игроку
int offset = rand() % (13 - players_cards[s][0]); // по случайному смещению
int card = 1;
while(players_cards[s][card] || offset){ // из списка имеющихся карт
if(!players_cards[s][card]) offset --;
card++;
}
players_cards[s][card] = p;
if (++players_cards[s][0] >= 13) players_cards[0][0]++; // если не осталось карт этой масти, их выбор сокращается
}
int main(void) {
char cards[] = "2 3 4 5 6 7 8 9 0 J Q K A";
char suits[] = " HDCS";
srand(time(NULL));
for(int i = 0 ; i <= 4; i++) // обнуляем маccив выданных карт
for(int j = 0 ; j <= 13; j++)
players_cards[i][j] = 0;
for(int p = 1 ; p <= players ; p++) // каждому игроку
for(int suit = 1; suit <= 4; suit++) // каждой масти по 1
dispenser(suit, p);
for(int k = 0; k < deals && players_cards[0][0] < 4; k++) // и теперь то что осталось раздаём K раз
for(int p = 1 ; p <= players && players_cards[0][0] < 4; p++){ // каждому игроку
int offset = rand() % (4 - players_cards[0][0]); // по случайному смещению
int suit = 1;
while(players_cards[suit][0] >= 13 || offset){ // из списка имеющихся мастей (выдано <13)
if(players_cards[suit][0] < 13) offset--;
suit++;
}
dispenser(suit, p);
}
printf(" | %s\n",cards);
printf("------------------------------------------\n");
for(int i = 1 ; i <= 4; i++){
printf("%c|",suits[i]);
for(int j = 1 ; j <= 13; j++)
if (players_cards[i][j] > 0)
printf("%2d ", players_cards[i][j]);
else
printf(" ");
printf("| All cards: %d\n", players_cards[i][0]);
}
return 0;
}