PROGRAM COLOBINGO;

(* Pour l'‚nonc‚ du programme, voir la proc‚dure AVERTIS.
   Ce programme est trŠs semblable … CARTES au niveau de son fonctionnement.
   Il s'agit de distribuer des num‚ros … un certain nombre de joueurs.
   Ce programme n'est pas long mais demande une bonne maŒtrise de la gestion des tableaux.*)

USES CRT;

TYPE INT60 = ARRAY [1..3,1..20] OF INTEGER;

VAR  SAC: INT60;  (* Contient 3 lignes (couleurs) et 20 colonnes (num‚ros) *)

PROCEDURE AVERTIS;
          BEGIN
          WRITELN ('Ce programme est un jeu de Bingo faisant appel aux couleurs.');
          WRITELN ('L''ordinateur possŠde un sac avec 20 num‚ros Rouges, 20 Verts et 20 Bleus.');
          WRITELN ('L''ordinateur va distribuer ces jetons entre 12 joueurs (5 … chacun)');
          WRITELN ('et va ensuite afficher, pour chaque joueur, les jetons re‡us.');
          WRITELN ('Les num‚ros seront class‚s dans l''ordre :');
          WRITELN ('- d''abord les Rouges');
          WRITELN ('- ensuite les Verts');
          WRITELN ('- et enfin les Bleus');
          WRITELN ;
          WRITELN ('Pour effectuer la distribution et afficher les jeux des joueurs, tapez ENTREE');
          READLN;
          END;

PROCEDURE INITIALISE (VAR SAC: INT60);
          VAR NUMERO, COULEUR: INTEGER;

(* Mˆme principe que pour plusieurs programmes d‚j… r‚alis‚s :
   On met 0 dans toutes les cases du tableau
   Quand le num‚ro est tir‚, on remplace le 0 par le num‚ro du joueur. *)

          BEGIN
          FOR COULEUR := 1 TO 3 DO
              FOR NUMERO := 1 TO 20 DO
                  SAC [COULEUR, NUMERO] := 0;
          END;

PROCEDURE TIRE (VAR SAC: INT60);
          VAR JETON, JOUEUR, NUMERO, COULEUR: INTEGER;

          BEGIN
          FOR JETON := 1 TO 5 DO         (* 5 jetons … distribuer par joueur *)
              FOR JOUEUR := 1 TO 12 DO   (* 12 joueurs *)
                  BEGIN                  (* la petite boucle tournera donc 60 fois (le nombre de billes) *)
                  REPEAT
                        COULEUR := RANDOM (3) + 1;    (* On tire la couleur au sort *)
                        NUMERO  := RANDOM (20)+ 1;    (* On tire le num‚ro au sort  *)
                  UNTIL SAC [COULEUR, NUMERO] = 0;    (* Le tirage n'est accept‚ que quand il y a 0 dans cette case *)
                  SAC [COULEUR, NUMERO] := JOUEUR;    (* On met le num‚ro du joueur auquel a ‚t‚ donn‚ le jeton *)
                  END;
          END;

PROCEDURE AFFICHE (SAC: INT60);
          VAR JOUEUR, COULEUR, NUMERO: INTEGER;

          BEGIN
          CLRSCR;
          FOR JOUEUR := 1 TO 12 DO                (* Passage de chaque joueur en revue *)
              BEGIN
              WRITELN ('Jeu du joueur ',JOUEUR);  (* Pour chaque joueur, un petit titre pour son jeu *)
              WRITELN;
              FOR COULEUR := 1 TO 3 DO            (* Balayage de tout le tableau pour ce joueur ... *)
                  FOR NUMERO := 1 TO 20 DO        (* les 3 couleurs et les 20 num‚ros *)
                      IF SAC [COULEUR, NUMERO] = JOUEUR THEN  (* Si la case contient le num‚ro du joueur... *)
                         BEGIN
                         WRITE ('Jeton ',NUMERO:2);          (* On affiche le num‚ro  du jeton *)
                         CASE COULEUR OF                      (* On affiche la couleur du jeton *)
                              1: WRITELN (' Rouge');
                              2: WRITELN (' Vert');
                              3: WRITELN (' Bleu');
                              END;
                         END;
              WRITELN;
              WRITELN ('Pour la suite, tapez ENTREE');
              READLN;          (* Pause pour avoir le temps de contempler le jeu du joueur *)
              CLRSCR;
              END;
          END;

BEGIN (* du programme principal *)
RANDOMIZE;
CLRSCR;
AVERTIS;
INITIALISE (SAC);
TIRE (SAC);
AFFICHE (SAC);
END.
