#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;
}