program tp31;
uses graph, crt;

var x,p:  integer;
pilote, mode : integer;
k,y,z,w,q,e,a,f,t,u,i,m,r: char;
n: string;


procedure score;
forward;(* ce forward permet de faire de declarer de des procedure qui ont score dedans mais de declarer*)
 (* score a
 la fin pour que p ai une valeur*)

procedure intro;         (*presentation du programme a venir*)
        Begin
        clrscr;

        setcolor(red);
        settextstyle(1, horizdir, 1);
        outtextXY(20,30,'Bienvenue dans un programme concu par Gabrielle Picotte,');
        outtextXY(120,60,'Vincent Desjardin & Guillaume Belzile');
        setcolor(green);
        outtextXY(80,100,'Ce programme permet d''exercer votre memoire.');
        outtextXY(80,120,'Vous verrez appaitre a l''ecran une serie de cubes.');
        outtextXY(80,140,'Votre travail est de repeter la sequence a lecran apres');
        outtextXY(80,160,'la disparition des cubes.  utiliser les touches: ');
        outtextXY(80,180,'q-w-e-r(premiere rangee),a-s-d-f(deuxieme rangee)');
        outtextXY(80,200,'z-x-c-v(troisieme rangee),t-y-u-i(quatrieme rangee)');
        outtextXY(80,220,'pour faire reapparaitre les cubes dans l''ordre');
        setcolor(blue);
        outtextXY(20,300,'Appuyez sur enter si vous vous avez bien compris!');
        readln;


        End;
       procedure tableau;  (* grille de jeu*)
       begin
       setcolor(green);
             setlinestyle(0,$c3,3);
             line(60,40,60,440);(*ligne verticale extreme gauche*)
                         line(580,40,580,440);   (*ligne verticale extreme droite*)

                        line(60,40,580,40);    (*ligne horizontale superieure*)
                        line(60,440,580,440);    (*ligne horizontale inferieure*)
                        line(190,40,190,440);    (*premiere ligne verticale*)
                        line(450,40,450,440);    (*troisieme ligne verticale*)
                        line(320,40,320,440);    (*deuxieme ligne verticale*)
                        line(60,140,580,140);     (*premiere ligne horizontale*)
                        line(60,240,580,240);     (*deuxieme ligne horizontale*)
                        line(60,340,580,340);     (*troisieme ligne horizontale*)
                         outtextxy(64,44,'Q');
                          outtextxy(194,44,'W');
                           outtextxy(324,44,'E');
                            outtextxy(454,44,'R');
                             outtextxy(64,144,'A');
                              outtextxy(194,144,'S');    (* lettre qui vont apparaitre dans le cadriller pour aider le joueur*)
                               outtextxy(324,144,'D');
                                outtextxy(454,144,'F');
                                 outtextxy(64,244,'Z');
                                  outtextxy(194,244,'X');
                                   outtextxy(324,244,'C');
                                    outtextxy(454,244,'V');
                                     outtextxy(64,344,'T');
                                      outtextxy(194,344,'Y');
                                       outtextxy(324,344,'U');
                                        outtextxy(454,344,'I');
                                         outtextxy(80,450,'Reproduire dans l''ordre(attendre la disparition des carres)');
                       end;


procedure menu;
forward;(* ce foward permet de faire revenir au menu en declarant les niveaux avant menu*)
        procedure niveau1;  (* procedure qui permet au joeur de jouer au niveau 1 *)
        begin
        pilote:= detect;
             initgraph(pilote,mode,'M:\bgi');
             randomize;
             tableau;
                        setfillstyle(4,yellow);
                         delay(3100);
                         bar(62,42,188,138);
                         delay(250);
                         bar(192,242,318,338);
                         delay(250);
                         bar(452,342,578,438);
                         delay(250);
                         bar(452,42,578,138);
             setfillstyle(1,black);
                delay(200);
                bar(62,42,188,138);
                delay(200);
                bar(192,242,318,338);
                delay(200);
                bar(452,342,578,438);
                delay(200);
                bar(452,42,578,138);
                delay(200);


                    cleardevice;
              tableau;
              repeat
              delay(100);
              until keypressed;

             m:=readkey;
             if m = 'q' then
             begin
             p:= p+1;
             setfillstyle(4,1);
             bar(61,41,189,139);
             repeat
             delay(100);
             until keypressed;
             m:= readkey;
                    if m = 'x' then
                    begin
                    p:= p+1;
                    setfillstyle(4,1);
                    bar(191,241,319,339);
                     repeat
                      delay(100);
                      until keypressed;
                       m:= readkey;
                           if m = 'i' then
                           begin
                           p:=p+1;
                           bar(450,340,580,440);
                           repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'r' then
                            begin
                            p:=p+1;
                            bar(450,40,580,140);

                            end;
                           end;
                           end;
                           end
                           else


                           outtext('vous avez appuyer sur une mauvaise touche, retour au menu');
                           delay(1000);
                           cleardevice;
                           score;
                           menu;

                           clrscr;
                   score;
                 menu;
             closegraph;



        end;

        procedure niveau2; (* procedure qui permet au joeur de jouer au niveau 2*)
        begin

                  pilote:= detect;
                  initgraph(pilote,mode,'M:/bgi');
                     randomize;
                     tableau;
                  setfillstyle(4,yellow);

                  delay(3100);
                  bar(62,42,188,138);
                  delay(250);
                  bar(192,242,318,338);
                  delay(250);
                  bar(452,342,578,438);
                  delay(250);
                  bar(62,142,188,238);
                  delay(250);
                  bar(322,42,448,138);
                  delay(250);
                  bar(452,142,578,238);
                  delay(250);
                  setfillstyle(4,black);
                  bar(62,42,188,138);
                  delay(200);
                  bar(192,242,318,338);
                  delay(200);
                  bar(452,342,578,438);
                  delay(200);
                  bar(62,142,188,238);
                  delay(200);
                  bar(322,42,448,138);
                  delay(200);
                  bar(452,142,578,238);
                  delay(200);


                       cleardevice;
                  tableau;
                  repeat
              delay(100);
              until keypressed;

             m:=readkey;
             if m = 'q' then
             begin
             p:= p+1;
             setfillstyle(4,1);
            bar(62,42,188,138);
             repeat
             delay(100);
             until keypressed;
             m:= readkey;
                    if m = 'x' then
                    begin
                    p:= p+1;
                    bar(192,242,318,338);
                     repeat
                      delay(100);
                      until keypressed;
                       m:= readkey;
                           if m = 'i' then
                           begin
                           p:=p+1;
                           bar(452,342,578,438);
                           repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'a' then
                            begin
                            p:=p+1;
                             bar(62,142,188,238);;


                             repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;

                            if m = 'e' then
                            begin
                            p:=p+1;
                            bar(322,42,448,138);

                             repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'f' then
                            begin
                            p:=p+1;
                             bar(452,142,578,238);
                            end;
                            end;

                            end;
                           end;
                           end;
                           end
                           else


                           outtext('vous avez appuyer sur une mauvaise touche, retour au menu');
                           delay(1000);
                           cleardevice;
                           score;
                           menu;

                           clrscr;
                   score;
               

        end;


        procedure niveau3;    (* procedure qui permet au joeur de jouer au niveau trois*)
         begin
        randomize;
                  pilote:= detect;
                  initgraph(pilote,mode,'M:/bgi');
                   randomize;
                   tableau;
                  setfillstyle(4,yellow);
                  delay(3100);
                  bar(62,42,188,138);
                  delay(250);
                  bar(62,142,188,238);
                  delay(250);
                  bar(62,342,188,438);
                  delay(250);
                  bar(192,242,318,338);
                  delay(250);
                  bar(322,42,448,138);
                  delay(250);
                  bar(322,342,448,438);
                  delay(250);
                  bar(452,142,578,238);
                  delay(250);
                  bar(452,342,578,438);

                  setfillstyle(3,black); (*cube noir qui efface les cubes de couleurs*)
                     delay(150);
                  bar(62,42,188,138);
                  delay(200);
                  bar(62,142,188,238);
                  delay(200);
                  bar(62,342,188,438);
                  delay(200);
                  bar(192,242,318,338);
                  delay(200);
                  bar(322,42,448,138);
                  delay(200);
                  bar(322,342,448,438);
                  delay(200);
                  bar(452,142,578,238);
                  delay(200);
                  bar(452,342,578,438);

                   delay(200);
                  cleardevice;
                  tableau;



                  cleardevice;
                  tableau;
                   repeat(*debut proceduss compteur*)
              delay(20);
              until keypressed;

                  m:=readkey;
             if m = 'q' then
             begin
             p:= p+1;
             setfillstyle(4,random(15));
            bar(62,42,188,138);;
             repeat
             delay(100);
             until keypressed;
             m:= readkey;
                    if m = 'a' then
                    begin
                    p:= p+1;
                     bar(62,142,188,238);
                     repeat
                      delay(100);
                      until keypressed;
                       m:= readkey;
                           if m = 't' then
                           begin
                           p:=p+1;
                           bar(62,342,188,438);
                           repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'x'
                             then
                            begin
                            p:=p+1;
                            bar(192,242,318,338);


                             repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;

                            if m = 'e' then
                            begin
                            p:=p+1;
                            bar(322,42,448,138);

                             repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'u' then
                            begin
                            p:=p+1;
                             bar(322,342,448,438);
                              repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'f' then
                            begin
                            p:=p+1;
                             bar(452,142,578,238);
                              repeat
                           delay(100);
                           until keypressed;
                            m:= readkey;
                            if m = 'i' then
                            begin
                            p:=p+1;
                             bar(452,342,578,438);
                            end;
                            end;
                            end;
                           end;
                           end;
                           end;
                           end;
                           end
                           else


                           outtext('vous avez appuyer sur une mauvaise touche, retour au menu');
                           delay(1000);
                           cleardevice;
                           score;
                           menu;

                           clrscr;
                   score;
               


         end;(* fin du compteur*)


        procedure menu;
        begin

                  randomize;
                  setbkcolor(black);

        outtextxy(100,140,'1- Niveau 1 ( 4 images)');
        outtextxy(100,170,'2- Niveau 2 ( 6 images)');
        outtextxy(100,200,'3- Niveau 3 ( 8 images)');
        outtextxy(100,230,'k- Sortir du programme');
        k:=readkey;

        case k of  (*selection qui permet de renvoyer le joueur au different niveau*)

        '1':
        niveau1;

        '2':
        niveau2;

        '3':
        niveau3;


        'k':
        begin
        cleardevice;   (* message de au revoir*)
        outtextxy(200,200,'Merci beaucoup d''avoir jouer');
        outtextxy(210,230,n);
        outtextxy(220,260,' A la proxima!!!!!!!!! XD ');
        end;

        else  (*Debut Section du programme qui fait apparaitre une tete de mort pour chaque mauvaise touche*)
        repeat
         pilote:= detect;
                  initgraph(pilote,mode,'M:/bgi');
        randomize;
        sound(500);
        delay(100);
        sound(400);
        delay(100);
        sound(200);
        delay(100);

        setcolor(green);
        outtextxy(60,40,'                               ...----....                              ');
        setcolor(green);
        outtextxy(60,45,'                         ..-:"''''         ''''"-..                         ');
        setcolor(green);
        outtextxy(60,50,'                      .-''                      ''-.                      ');
        setcolor(green);
        outtextxy(60,55,'                    .''              .     .       ''.                    ');
        setcolor(green);
        outtextxy(60,60,'                  .''   .          .    .      .    .''.                 ');
        setcolor(green);
        outtextxy(60,65,'                .''  .    .       .   .   .     .   . ..:.               ');
        setcolor(green);
        outtextxy(60,70,'              .'' .   . .  .       .   .   ..  .   . ....::.             ');
        setcolor(green);
        outtextxy(60,75,'             ..   .   .      .  .    .     .  ..  . ....:IA.            ');
        setcolor(green);
        outtextxy(60,80,'            .:  .   .    .    .  .  .    .. .  .. .. ....:IA.           ');
        setcolor(green);
        outtextxy(60,85,'           .: .   .   ..   .    .     . . .. . ... ....:.:VHA.          ');
        setcolor(green);
        outtextxy(60,90,'           ''..  .  .. .   .       .  . .. . .. . .....:.::IHHB.         ');
        setcolor(green);
        outtextxy(60,95,'          .:. .  . .  . .   .  .  . . . ...:.:... .......:HIHMM.        ');
        setcolor(green);
        outtextxy(60,100,'         .:.... .   . .''::''''.. .   .  . .:.:.:II;,. .. ..:IHIMMA        ');
        setcolor(green);
        outtextxy(60,105,'         '':.:..  ..::IHHHHHI::. . .  ...:.::::.,,,. . ....VIMMHM        ');
        setcolor(green);
        outtextxy(60,110,'        .:::I. .AHHHHHHHHHHAI::. .:...,:IIHHHHHHMMMHHL:. . VMMMM        ');
        setcolor(green);
        outtextxy(60,115,'       .:.:V.:IVHHHHHHHMHMHHH::..:'' .:HIHHHHHHHHHHHHHMHHA. .VMMM.       ');
        setcolor(green);
        outtextxy(60,120,'       :..V.:IVHHHHHMMHHHHHHHB... . .:VPHHMHHHMMHHHHHHHHHAI.:VMMI       ');
        setcolor(green);
        outtextxy(60,125,'       ::V..:VIHHHHHHMMMHHHHHH. .   .I":IIMHHMMHHHHHHHHHHHAPI:WMM       ');
        setcolor(green);
        outtextxy(60,130,'       ::". .:.HHHHHHHHMMHHHHHI.  . .:..I:MHMMHHHHHHHHHMHV:'':H:WM       ');
        setcolor(green);
        outtextxy(60,135,'       :: . :.::IIHHHHHHMMHHHHV  .ABA.:.:IMHMHMMMHMHHHHV:''. .IHWW       ');
        setcolor(green);
        outtextxy(60,140,'       ''.  ..:..:.:IHHHHHMMHV'' .AVMHMA.:.''VHMMMMHHHHHV:'' .  :IHWV       ');
        setcolor(green);
        outtextxy(60,145,'        :.  .:...:''.:.:TP''   .AVMMHMMA.:. ''VMMHHHP.:... .. :IVAI       ');
        setcolor(green);
        outtextxy(60,150,'       .:.   ''... .:"''   .   ..HMMMHMMMA::. .''VHHI:::....  .:IHW''       ');
        setcolor(green);
        outtextxy(60,155,'       ...  .  . ..:IIPPIH: ..HMMMI.MMMV:I:.  .:ILLH:.. ...:I:IM        ');
        setcolor(green);
        outtextxy(60,160,'     : .   .'''''''''' .:.V''. .. .  :HMMM:IMMMI::I. ..:HHIIPPHI::''''.P:HM.       ');
        setcolor(green);
        outtextxy(60,165,'     :.  .  .  .. ..:.. .    :AMMM IMMMM..:...:IV'':T::I::.''.:IHIMA      ');
        setcolor(green);
        outtextxy(60,170,'     ''V:.. .. . .. .  .  .   ''VMMV..VMMV :....:V:.:..:....::IHHHMH      ');
        setcolor(green);
        outtextxy(60,175,'       "IHH:.II:.. .:. .  . . . '''' :HB'''' . . ..PI:.::.:::..:IHHMMV"      ');
        setcolor(green);
        outtextxy(60,180,'        :IP""HHII:.  .  .    . . .''V:. . . ..:IH:.:.::IHIHHMMMMM"       ');
        setcolor(green);
        outtextxy(60,185,'        :V:. VIMA:I..  .     .  . .. . .  .:.I:I:..:IHHHHMMHHMMM        ');
        setcolor(green);
        outtextxy(60,190,'        :"VI:.VWMA::. .:      .   .. .:. ..:.I::.:IVHHHMMMHMMMMI        ');
        setcolor(green);
        outtextxy(60,195,'        :."VIIHHMMA:.  .   .   .:  .:.. . .:.II:I:AMMMMMMHMMMMMI        ');
        setcolor(green);
        outtextxy(60,200,'        :..VIHIHMMMI...::.,:.,:!"I:!"I!"I!"V:AI:VAMMMMMMHMMMMMM''        ');
        setcolor(green);
        outtextxy(60,205,'        '':.:HIHIMHHA:"!!"I.:AXXXVVXXXXXXXA:."HPHIMMMMHHMHMMMMMV         ');
        setcolor(green);
        outtextxy(60,210,'          V:H:I:MA:W''I :AXXXIXII:IIIISSSSSSXXA.I.VMMMHMHMMMMMM          ');
        setcolor(green);
        outtextxy(60,215,'            ''I::IVA ASSSSXSSSSBBSBMBSSSSSSBBMMMBS.VVMMHIMM''"''           ');
        setcolor(green);
        outtextxy(60,220,'             I:: VPAIMSSSSSSSSSBSSSMMBSSSBBMMMMXXI:MMHIMMI              ');
        setcolor(green);
        outtextxy(60,225,'            .I::. "H:XIIXBBMMMMMMMMMMMMMMMMMBXIXXMMPHIIMM''              ');
        setcolor(green);
        outtextxy(60,230,'            :::I.  '':XSSXXIIIIXSSBMBSSXXXIIIXXSMMAMI:.IMM               ');
        setcolor(green);
        outtextxy(60,235,'            :::I:.  .VSSSSSISISISSSBII:ISSSSBMMB:MI:..:MM               ');
        setcolor(green);
        outtextxy(60,240,'            ::.I:.  '':''SSSSSSSISISSXIIXSSSSBMMB:AHI:..MMM.              ');
        setcolor(green);
        outtextxy(60,245,'            ::.I:. . ..:"BBSSSSSSSSSSSSBBBMMMB:AHHI::.HMMI              ');
        setcolor(green);
        outtextxy(60,250,'            :..::.  . ..::":BBBBBSSBBBMMMB:MMMMHHII::IHHMI              ');
        setcolor(green);
        outtextxy(60,255,'            '':.I:... ....:IHHHHHMMMMMMMMMMMMMMMHHIIIIHMMV"              ');
        setcolor(green);
        outtextxy(60,260,'              "V:. ..:...:.IHHHMMMMMMMMMMMMMMMMHHHMHHMHP''               ');
        setcolor(green);
        outtextxy(60,265,'               '':. .:::.:.::III::IHHHHMMMMMHMHMMHHHHM"                  ');
        setcolor(green);
        outtextxy(60,270,'                 "::....::.:::..:..::IIIIIHHHHMMMHHMV"                  ');
        setcolor(green);
        outtextxy(60,275,'                   "::.::.. .. .  ...:::IIHHMMMMHMV"                    ');
        setcolor(green);
        outtextxy(60,280,'                      "V::... . .I::IHHMMV"''                            ');
        setcolor(green);
        outtextxy(60,285,'                         ''"VHVHHHAHHHHMMV:"''                            ');
        setcolor(green);
        outtextxy(60,300,'Vous avez rentre une mauvaise  commande, FERMETURE DU PROGRAMME!!!');
        nosound;
        k:=readkey;

        until  k < '4';
        clrscr;
        menu;
        closegraph;
         end;      (*Fin  Section du programme qui fait apparaitre une tete de mort pour chaque mauvaise touche*)
         readln;
         end;

         procedure score; (* procedure qui permet au joueur de voir son score*)
           begin
           case p of
           0:
           outtextxy(100,240,'Votre score est 0!!!! t un nullard');
           1:
           outtextxy(100,240,'Votre score est 1!!');
           2:
           outtextxy(100,240,'Votre score est 2!!');
           3:
           outtextxy(100,240,'Votre score est 3!!');
           4:
           outtextxy(100,240,'Votre score est 4!!');
           5:
           outtextxy(100,240,'Votre score est 5!!');
           6:
           outtextxy(100,240,'Votre score est 6!!');
           7:
           outtextxy(100,240,'Votre score est 7!!');
           8:
           outtextxy(100,240,'Votre score est 8!!');
           9:
           outtextxy(100,240,'Votre score est 9!!');
           10:
           outtextxy(100,240,'Votre score est 10!!');
           11:
           outtextxy(100,240,'Votre score est 11!!');
           12:
           outtextxy(100,240,'Votre score est 12!!');
           13:
           outtextxy(100,240,'Votre score est 13!!');
           14:
           outtextxy(100,240,'Votre score est 14!!');
           15:
           outtextxy(100,240,'Votre score est 15!!');
           16:
           outtextxy(100,240,'Votre score est 16!!');
           17:
           outtextxy(100,240,'Votre score est17!!');
           18:
           outtextxy(100,240,'Votre score est 18!!');
           else
           outtextxy(100,240,'Vous etes trop fort on ne compte plus vos points');
           end;
           end;


                         (*cleardevice*)

begin
 pilote:= detect;
 initgraph(pilote,mode,'M:/bgi'); (*ouverture du mode graphique*)
intro;
cleardevice;
randomize;
setbkcolor(black);
textcolor(random(15));
outtextxy(80,60,'Bonjour, bienvenue au super jeux de memoire GUYVINGAB!!!');
outtextxy(100,90,'Quel est ton nom?');
readln(n);
outtextxy(25,120,'Alors est-tu pret a jouer? Alors Choisit un niveau  de difficulte:');
p:=0;
menu;
closegraph;
readln;
end.