PROGRAM JEU_DE_CARTES;

(* Pour l'‚nonc‚ du programme, voir la proc‚dure AVERTIS.
   Ce programme est un exercice int‚ressant dans la manipulation abstraite
   des r‚f‚rences d'une matrice et des valeurs correspondant … ces r‚f‚rences.
   Le jeu de cartes est repr‚sent‚ par une matrice de 4 lignes et 13 colonnes.
   On l'initialise en mettant 0 dans toutes les cases, signalant que la carte
   correspondante n'a pas encore ‚t‚ distribu‚e.
   Lors du tirage, le 0 est remplac‚ par le num‚ro du joueur auquel elle a ‚t‚
   attribu‚e. Lorsque tout le jeu a ‚t‚ distribu‚, il suffit de balayer le tableau
   pour reconstituer le jeu de chaque joueur tout en classant les cartes par ordre. *)

USES CRT;

TYPE INT52 = ARRAY [1..4,2..14] OF SHORTINT;  (* Entier court (de -128 … +127), suffisant dans ce cas-ci (4 joueurs) *)

VAR  JEU: INT52;   (* Matrice de 4 lignes (couleurs) et 13 colonnes (valeurs) repr‚sentant le jeu de cartes *)
                   (* On remarque que les valeurs vont de 2 … 14. L'as, sup‚rieur au roi, aura le num‚ro 14 *)
PROCEDURE AVERTIS;
          BEGIN
          WRITELN ('Ce programme simule la distribution d''un jeu de 52 cartes … 4 joueurs.');
          WRITELN ('Chaque joueur re‡oit donc 13 cartes.');
          WRITELN ('En fin de distribution, le programme affiche le jeu de chaque joueur,');
          WRITELN ('les cartes ‚tant class‚es dans l''ordre :');
          WRITELN ('- d''abord des couleurs (Coeur, Carreau, TrŠfle, Pique)');
          WRITELN ('- ensuite, pour chaque couleur, par valeur (l''as ‚tant sup‚rieur au roi)');
          WRITELN;
          WRITELN ('Pour distribuer les cartes et afficher le jeu de chaque joueur, tape ENTREE');
          READLN;
          CLRSCR;
          END;

PROCEDURE INITIALISE (VAR JEU: INT52);
          VAR i, j: integer;

          BEGIN
          FOR i := 1 TO 4 DO
              FOR j := 2 TO 14 DO
                  JEU [i,j] := 0;  (* 0 signale que la carte n'a pas encore ‚t‚ distribu‚e *)
          END;

PROCEDURE DISTRIBUE (VAR JEU: INT52);
          VAR CARTE, JOUEUR, COULEUR, VALEUR: SHORTINT;

          BEGIN
          FOR CARTE := 1 TO 13 DO       (* 13 cartes … distribuer *)
              FOR JOUEUR := 1 TO 4 DO   (* entre 4 joueurs *)
                  BEGIN                 (* La petite boucle tournera donc 52 fois *)
                  REPEAT
                        COULEUR := RANDOM (4) + 1;  (* On tire une couleur de 1 … 4 *)
                        VALEUR  := RANDOM (13)+ 2;  (* On tire une valeur de 2 … 14 (as = 14) *)
                  UNTIL JEU [COULEUR,VALEUR] = 0;   (* Jusqu'… avoir 0 dans la case (carte non encore distribu‚e) *)
                  JEU [COULEUR,VALEUR] := JOUEUR;   (* On attribue … la carte le num‚ro du joueur qui l'a re‡ue *)
                  END;
          END;

PROCEDURE AFFICHE (JEU: INT52);
          TYPE INT4 = ARRAY [1..4] OF SHORTINT;   (* Tableau de 4 entiers courts qui vont "m‚moriser" le num‚ro de la ligne *)
          VAR  LIGNE: INT4;                       (* … laquelle afficher la carte pour chaque colonne *)
               JOUEUR, COULEUR, VALEUR: SHORTINT;

(* Cet affichage est sophistiqu‚ du fait que les jeux des 4 joueurs apparaissent sur le mˆme ‚cran.
   A l'examen, l'affichage se trouvant dans la proc‚dure AFFICHE_BIS ci-dessous est suffisant.

   L'‚cran possŠde 24 lignes et 80 colonnes. Les jeux seront donc affich‚s aux colonnes suivantes:
   Joueur 1: colonne 1; Joueur 2: colonne 21; Joueur 3: colonne 41; Joueur 4: colonne 61
   Le num‚ro de la ligne d‚pendra du nombre de cartes d‚j… affich‚es (m‚moris‚ dans le tableau LIGNE *)

          BEGIN
          FOR JOUEUR := 1 TO 4 DO
              BEGIN  (* Affichage des titres des colonnes et initialisation de LIGNE *)
              GOTOXY ((JOUEUR - 1) * 20 + 1, 1);
              WRITE ('Jeu du joueur nø',JOUEUR);
              LIGNE [JOUEUR] := 4;  (* On commencera l'affichage 3 lignes sous le titre de la colonne *)
              END;
          (* Balayage de tout le tableau *)
          FOR COULEUR := 1 TO 4 DO         (* Les lignes (couleurs) de 1 … 4   *)
              FOR VALEUR := 2 TO 14 DO     (* les colonnes (valeurs) de 2 … 14 *)
                  BEGIN
                  JOUEUR := JEU [COULEUR,VALEUR];  (* On stocke de num‚ro du joueur auquel appartient cette carte *)
                  GOTOXY ((JOUEUR - 1) * 20 + 1, LIGNE [JOUEUR]);
                  (* On positionne le curseur dans la bonne colonne … la bonne ligne *)
                  (* et on va afficher en transformant les valeurs en clair (noms et couleurs des cartes)  *)
                  CASE VALEUR OF
                       11: WRITE ('Valet');
                       12: WRITE (' Dame');
                       13: WRITE ('  Roi');
                       14: WRITE ('   As')
                  ELSE
                      WRITE (VALEUR:5);
                  END;
                  CASE COULEUR OF
                       1: WRITE (' de coeur');
                       2: WRITE (' de carreau');
                       3: WRITE (' de trŠfle');
                       4: WRITE (' de pique');
                  END;
                  INC (LIGNE [JOUEUR]);  (* On incr‚mente la position de la ligne de ce joueur pour ne pas r‚‚crire dessus *)
                  END;
          READLN;
          END;

PROCEDURE AFFICHE_BIS (JEU: INT52);
          VAR JOUEUR, COULEUR, VALEUR: SHORTINT;

          BEGIN
          CLRSCR;
          FOR JOUEUR := 1 TO 4 DO
              BEGIN
              WRITELN ('Jeu du joueur nø',JOUEUR);
              WRITELN;
              (* Balayage de tout le tableau *)
              FOR COULEUR := 1 TO 4 DO         (* Les lignes (couleurs) de 1 … 4   *)
                  FOR VALEUR := 2 TO 14 DO     (* les colonnes (valeurs) de 2 … 14 *)
                      IF JEU [COULEUR, VALEUR] = JOUEUR THEN
                         BEGIN
                         (* et on va afficher en transformant les valeurs en clair (noms et couleurs des cartes)  *)
                         CASE COULEUR OF
                              11: WRITE ('Valet');
                              12: WRITE (' Dame');
                              13: WRITE ('  Roi');
                              14: WRITE ('   As')
                         ELSE
                             WRITE (VALEUR:5);
                             END;
                         CASE COULEUR OF
                              1: WRITELN (' de coeur');
                              2: WRITELN (' de carreau');
                              3: WRITELN (' de trŠfle');
                              4: WRITELN (' de pique');
                              END;
                         END;
              WRITELN;
              WRITELN ('Pour la suite, tape ENTREE');
              READLN;
              CLRSCR;
              END;
          END;


BEGIN (* du programme principal *)
RANDOMIZE;
CLRSCR;
AVERTIS;
INITIALISE (JEU);
DISTRIBUE (JEU);
AFFICHE (JEU);
AFFICHE_BIS (JEU);
END.

