/* ==================================== *\
 *	File      : Bridge.c                 *
 *	Påbegyndt : 05.02.03 Henning Karlby  *
 *	Færdig    :                          *
 *	Ændret    :                          *
 * Et program som blander og udskriver  *
 * et spil kort                         *
\* ==================================== */

/* ---- INCLUDES ------- */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
//---------------------------------------------------------------------
struct SKort
{
   const char *Nummer;
   const char *Farve;
};
/* --------------------------------------------------------------- *\
   SKort er en mærkat som definerer en struktur.
   const foran en erklæring betyder at indholdet ikke kan ændres
   under programgennemløbet.
   char * = Pointer til en char
   *Nummer er oprettelse af en Pointervariabel til 13 kort pr. farve
   *Farve  er oprettelse af en Pointervariabel til de 4 farver
\* --------------------------------------------------------------- */
typedef struct SKort TKort; // Oprettelse af en type til strukturen

void OpretSpil( TKort * const, const char *[], // Oprettelse af prototyper
                const char *[]);               // til procedurerne i
void Bland( TKort * const);                    // i programmet
void GivKort( const TKort * const);
//---------------------------------------------------------------------
void main(void)
{
      TKort KortSpil[52];
      const char *Nummer[] = {"Es", "To", "Tre", "Fire", "Fem",
                            "Seks", "Syv", "Otte", "Ni", "Ti",
                            "Knaegt", "Dame", "Konge"};
      // Erklæring af Pointervariabel til kortene i hver farve
      const char *Farve[] = {"Kloer", "Ruder", "Hjerter", "Spar"};
      // Erklæring af de 4 farver
      char a;

      srand(time(NULL));

      OpretSpil(KortSpil, Nummer, Farve); // Procedurerne aktiveres
      Bland(KortSpil);                    // KortSpil er adressen til
      GivKort(KortSpil);                  // array'et, Nummer og Farve
      a = getch();                        // er også adresser til array's
}
//---------------------------------------------------------------------
void OpretSpil(TKort * const wKortSpil, const char * wNummer[],
               const char * wFarve[])
{
   int i;
   for( i = 0; i <= 51; i++)
   {
      wKortSpil[i].Nummer = wNummer[i % 13]; // i%13 = 0, 1, 2, 3, ...... 13.
      wKortSpil[i].Farve = wFarve[i/13];     // i/13 = 0, 1, 2, 3.
   }
}
//---------------------------------------------------------------------
void Bland(TKort * const wKortSpil)
{
   int i, j;
   TKort Temp;

   for(i = 0; i <= 51; i++)
   {
      j = rand() % 52;          // Restværdien ved heltalsdivision med 52
      Temp = wKortSpil[i];      // Tag kort nr. j og placer det på den i'te
      wKortSpil[i] = wKortSpil[j]; // plads og sæt derpå det i'te kort ind
      wKortSpil[j] = Temp;      // på kort j's plads.
   }
}
//---------------------------------------------------------------------
void GivKort (const TKort * const wKortSpil)
{
   int i;

   for(i = 0; i <= 51; i++)   // Skriv kortene ud i to kolonner
	   printf("%7s af %-9s%c", wKortSpil[i].Nummer,
                              wKortSpil[i].Farve,
                              (i+1)%2 ? '\t' : '\n');
}
//---------------------------------------------------------------------
