#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SUITS 4
#define FACES 13
#define CARDS 52

void initializeDeck(int deck[][FACES]);
void shuffle(int deck[][FACES]);
void printDeck(int deck[][FACES]);

void deal(int deck[][FACES],
          const char *face[],
          const char *suit[]);


int main(void)
{
    int deck[SUITS][FACES];

    const char *suit[SUITS] =
    { "Hearts", "Diamonds", "Clubs", "Spades" };

    const char *face[FACES] =
    {
        "Ace", "Deuce", "Three", "Four", "Five",
        "Six", "Seven", "Eight", "Nine", "Ten",
        "Jack", "Queen", "King"
    };

    srand((unsigned int)time(NULL));

    initializeDeck(deck);

    printf("The deck before shuffle:\n");
    printDeck(deck);

    shuffle(deck);

    printf("\nThe deck after shuffle:\n");
    printDeck(deck);

    printf("\nThe cards after dealing:\n");
    deal(deck, face, suit);

    return 0;
}


void initializeDeck(int deck[][FACES])
{
    int card = 1;

    for (int row = 0; row < SUITS; ++row)
    {
        for (int column = 0; column < FACES; ++column)
        {
            deck[row][column] = card;
            ++card;
        }
    }
}


void shuffle(int deck[][FACES])
{
    for (int row = 0; row < SUITS; ++row)
    {
        for (int column = 0; column < FACES; ++column)
        {
            int randomRow = rand() % SUITS;
            int randomColumn = rand() % FACES;

            int hold = deck[row][column];

            deck[row][column] =
                deck[randomRow][randomColumn];

            deck[randomRow][randomColumn] = hold;
        }
    }
}


void printDeck(int deck[][FACES])
{
    for (int row = 0; row < SUITS; ++row)
    {
        for (int column = 0; column < FACES; ++column)
        {
            printf("%4d", deck[row][column]);
        }

        puts("");
    }
}


void deal(int deck[][FACES],
          const char *face[],
          const char *suit[])
{
    for (int card = 1; card <= CARDS; ++card)
    {
        int found = 0;

        for (int row = 0; row < SUITS && found == 0; ++row)
        {
            for (int column = 0;
                 column < FACES;
                 ++column)
            {
                if (deck[row][column] == card)
                {
                    printf("%5s of %-8s",
                           face[column],
                           suit[row]);

                    if (card % 4 == 0)
                    {
                        puts("");
                    }
                    else
                    {
                        printf("\t");
                    }

                    found = 1;
                    break;
                }
            }
        }
    }
}