{
 ____  _
|  _ \(_)
| |_) |_  ___ _ ____   _____ _ __  _   _  ___      __ _
|  _ <| |/ _ \ '_ \ \ / / _ \ '_ \| | | |/ _ \    / _` |
| |_) | |  __/ | | \ V /  __/ | | | |_| |  __/   | (_| |
|____/|_|\___|_| |_|\_/ \___|_| |_|\__,_|\___|    \__,_|


  _____ _      _____ _____  ______    __  __           ____________
 / ____| |    |_   _|  __ \|  ____|  |  \/  |   /\    |___  /  ____|
| (___ | |      | | | |  | | |__     | \  / |  /  \      / /| |__
 \___ \| |      | | | |  | |  __|    | |\/| | / /\ \    / / |  __|
 ____) | |____ _| |_| |__| | |____   | |  | |/ ____ \  / /__| |____
|_____/|______|_____|_____/|______|  |_|  |_/_/    \_\/_____|______|



 LE PLUS IMPORTANT DE TOUT : POUR AVOR UNE MEILLEURE COMPREHENSION DE CE
 PROGRAMME...... JOUEZ-Y EN PREMIER!!!!!!!!!!!!!

 Bienvenue  a  mon  programme.  C'est un programme d'un jeu  nomme SLIDE MAZE
 Pour savoir comment jouer, il suffit de debuter le programme et d'aller dans
 la section  'COMMENT JOUER'  du menu.  Le programme est basee sur un tableau
 12X12.  Ce tableau sera utiliser  comme une matrice et represente  l'aire de
 jeu.  L'aire  de  jeu est de 10X10,  il  possede  des  bordures tout autour,
 c'est  pour cela qu'il  sera necessaire  d'utiliser  une  matrice 12X12 pour
 creer l'aire de jeu.  Pour dessiner les objets sur l'aire de jeu, il suffira
 de  creer des procedures qui possedent  les  variables  X  et  Y  du tableau
 ( i.e. Tableau[x,y] )  pour  pouvoir dessiner ces objets aux endroits precis
 voulu.  Une  fois  que  toutes les procedures de 'dessins' seront completer,
 il  sera  tres  facile de  creer  plusieurs niveau, car il suffit de changer
 la valeur  d'une  des cases  de la matrice pour  qu'il dessine l'objet voulu
 (i.e. si Tableau[2,2]:=1; alors un carree sera dessiner a la position x=2 et
 y=2).

 *************NOTE POUR LA COMPREHENSION DU RESTE DU PROGRAMME**************


 LE PLUS IMPORTANT DE TOUT : POUR AVOR UNE MEILLEURE COMPREHENSION DE CE
 PROGRAMME...... JOUER EN PREMIER!!!!!!!!!!!!!


  LEVEL1[X,Y]:=1;  CUBE/OBSTACLE
                   (VOIR PROCEDURE : CUBE)
  LEVEL1[X,Y]:=2;  PION BLANC QUI REPRESENTE LE JOUEUR (AUSSI APPELER PAC
                   DURANT LE PROGRAMME)
                   (VOIR PROCEDURE : PAC)
  LEVEL1[X,Y]:=3;  CIBLE/OBJECTF A ATTEINDRE DANS LES DIFFERENTS NIVEAUX
                   (VOIR PROCEDURE : WIN)
  LEVEL1[X,Y]:=4;  OBSTACLE FRANCHISSABLE DU HAUT VERS LE BAS, MAIS DANS
                   AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GODOWN)
  LEVEL1[X,Y]:=5;  OBSTACLE FRANCHISSABLE DE LA DROITE VERS LA GAUCHE, MAIS
                   DANS AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GOLEFT)
  LEVEL1[X,Y]:=6;  OBSTACLE FRANCHISSABLE DU BAS VERS LE HAUT, MAIS DANS
                   AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GOUP)
  LEVEL1[X,Y]:=7;  OBSTACLE FRANCHISSABLE DE LA GAUCHE VERS LA DROITE, MAIS
                   DANS AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GORIGHT)

  #72             REPRESENTE LA FLECHE DU HAUT SUR LE CLAVIER D'ORDINATEUR
  #80             REPRESENTE LA FLECHE DU BAS SUR LE CLAVIER D'ORDINATEUR
  #75             REPRESENTE LA FLECHE DE GAUCHE SUR LE CLAVIER D'ORDINATEUR
  #77             REPRESENTE LA FLECHE DE DROITE SUR LE CLAVIER D'ORDINATEUR

  POINTAGE : Le pointage dans ce jeu fonctionne de la maniere suivante:
             au debut d'un niveau le joueur a 1000 point pour le niveau.
             Lorsqu'il appuie sur une des fleche du clavier et que la pion
             peut se deplacer dans le sens voulu, il perdera 25 points des
             milles points. Lorsque le niveau est reussi, le pointage du
             niveau completer s'ajoutera au total des points du jeu.
             Le jeu ayant 10 niveau il sera donc impossible de faire plus
             que 10000 points au total.

 DIFFERENCE ENTRE X,Y ET XPAC,YPAC ([X,Y] VS [XPAC,YPAC])
 Pour dessiner mes differents niveau, je donne une valeur a une des cases
 de ma matrice (ex: Level[2,2]:=1;). En utilisant des boucles FOR...DO, je
 balaie l'aire de jeu  pour dessiner des carrees partout il y a des '1' et
 ainsi de suite avec tout les autres objets. A ce moment, Level[x,y]. Une
 fois que la boucle est fini, la position x,y memoriser par le programme
 sera a x=12 et y=12. Si je veux que mon Joueur puisse commencer a bouger
 a la position ou je l'ai dessiner il faut que je donne la valeur XPAC
 et YPAC a la position ou le joueur fut dessiner pour ne pas qu'il commence
 a bouger a la position [12,12]. Une fois que le niveau est dessiner,
 ce ne sera plus Level[x,y], mais Level[xpac,ypac]. Bref, [x,y] est utiliser
 pour dessiner les niveaux. [xpac,ypac]  defini la position du joueur sur
 l'aire de jeu.
 VOIR PROCEDURE DESSINELELEVEL POUR PLUS DE DETAILS


 ****POUR SAVOIR L'UTILITEE DE CHACUNE DES VARIABLES, S.V.P. SE REFERER*****
 *****A LA SECTION OU SONT LES VARIABLES AU DEBUT , UNE*********************
 *****DEFINITION  DETAILLEE SERA PRESENTE**********************************
____________________________________________________________________________
____________________________________________________________________________
----------------------------------------------------------------------------}

 Program GAME; uses crt,graph;

 const larg=40;  {40 est la largeur et la hauteur de chacun des carree de
                 l'aire de jeu de mon tableau 12X12. Cette constante me
                 sera utile pour dessiner les choses aux bons endroits
                 sans avoir a deviner la position en X et en Y.Il me suffira
                 de faire X(du tableau[x,y])*larg pour positioner un objet
                 horizontalement et Y(du tableau[x,y])*larg pour positioner
                 un objet verticalement.

 ___________________________________________________________________________
 ___________________________________________________________________________
 ___________________________________________________________________________}
 var

 {LONG INTEGER}

 linehor,linever, {Utliser pour dessiner le quadrillee horizontal et vertical
                  de l'aire de jeu.}
 Total,           {Total= le total des points accumuler durant les differents
                  niveaux du jeu.}
 Point,           {Point = points du niveau actuel dans lequel le joueur est
                  en train de jouer. Le total des points sera l'accumulation
                  des points de chacun des niveaux.}
 x,y,             {Differentes coordonees de mon tableau 12X12
                  (i.e. Tableau[x,y])}
 xpac,ypac,       {Differentes coordonnees de mon tableau 12X12 qui definit
                  la position du joueur APRES que le niveau soit dessiner.}

 {DIFFERENCE ENTRE X,Y ET XPAC,YPAC ([X,Y] VS [XPAC,YPAC])}
 {Pour dessiner mes differents niveau, je donne une valeur a une des cases
 de ma matrice (ex: Level[2,2]:=1;). En utilisant des boucles FOR...DO, je
 balaie l'aire de jeu  pour dessiner des carrees partout il y a des '1' et
 ainsi de suite avec tout les autres objets. A ce moment, Level[x,y]. Une
 fois que la boucle est fini, la position x,y memoriser par le programme
 sera a x=12 et y=12. Si je veux que mon Joueur puisse commencer a bouger
 a la position ou je l'ai dessiner il faut que je donne la valeur XPAC
 et YPAC a la position ou le joueur fut dessiner pour ne pas qu'il commence
 a bouger a la position [12,12]. Une fois que le niveau est dessiner,
 ce ne sera plus Level[x,y], mais Level[xpac,ypac]. Bref, [x,y] est utiliser
 pour dessiner les niveaux. [xpac,ypac]  defini la position du joueur sur
 l'aire de jeu.
 VOIR PROCEDURE DESSINELELEVEL POUR PLUS DE DETAILS}
 Level,           {Utiliser pour selectionner un niveau ou pour determiner
                  dans quel niveau on est}
 page,             {Utiliser dans le menu d'instructions pour pouvoir
                  changer les pages}
 babouin         {Pour la sortie du programme durant le jeu}
 :longint;

 {STRING}

 n,               {Nom de l'usager}
 totals,          {Total des points{longint) convertit en STRING pour
                  qu'on puisse l'ecrire dans un 'outtextxy'.}
 points,          {Points du niveaux {longint) convertit en STRING pour
                  qu'on puisse l'ecrire dans un 'outtextxy'.}
 levels,          {'Levels' = 'Level' convertit en string pour pouvoir
                  l'inserer dans un outtextxy}
 Text             {Du texte...}
 :string;

 {INTEGER}

 pilote,mode      {utiliser pour initier les fonctions graphiques}
 :integer;

 {CHAR}

 fleche,           {Pour lire une touche qu a ete pesee sur le clavier}
 instruction,
 choix
 :char;

 {ARRAY}

 Level1:array[1..12,1..12] of integer; {MATRICE 12X12 utiliser pour mon jeu}
                                       {voir premier paragraphe pour voir
                                       l'utiliter

 ___________________________________________________________________________
 ___________________________________________________________________________
 ___________________________________________________________________________}


                                                Procedure beginning;

{Procedure d'ouverture dans laquelle qui souhaite la bienvenue a
l'usager.
Les procedures graphiques sont deja initier.}
begin
cleardevice;
outtextxy((getmaxx-textwidth('Bonjour')) div 2, (getmaxy-textheight('Bonjour'))div 2,'Bonjour');
outtextxy((getmaxx-textwidth(n)) div 2, 250,n);
delay(2000);
setbkcolor(black);
end;


                                        Procedure gameover;
begin
str(Total,totals);
Bar(120,150,520,290);
Text:='   votre pointage final est de';
outtextxy((getmaxx-textwidth('Vous pouvez rejouer au menu!'))div 2,210,'Vous pouvez rejouer au menu!' );
outtextxy((getmaxx-textwidth(n+text))div 2,220, n+text);
outtextxy((getmaxx-textwidth(totals)) div 2, (getmaxy-textheight(totals))div 2, totals);
delay(2500);
end;


                                                Procedure Grille;

{Procedure qui dessine la grille de jeu mais sans les obstacles et
les pions. }
begin
setbkcolor(black);
setcolor(white);
Outtextxy(10,460,' R = RESET LEVEL        X = MENU');
For linehor:=1 to 11 do              {dessin des lignes horizontales}
line(120,linehor*larg,520,linehor*larg);
for linever:= 1 to 11 do              {dessin des lignes verticales}
line(linever*larg+80,40,linever*larg+80,440);
end;

                                                Procedure cube;

{Lorsque Level1[x,y]:=1; Un cube sera dessiner.}
begin
setfillstyle(1,1);
bar(x*larg+40,y*larg-40,x*larg+80,y*larg);  {Permet de dessiner le cube aux
                                            bons endroits.}
end;

                                                Procedure PAC;

{Lorsque Level1[x,y]:=2; alors le pion sera dessinee.
Ici, [xpac,ypac] est utiliser, car cette procedure sera utiliser
APRES que le niveau soit dessiner.}
begin
setfillstyle(1,15);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),18,18);
end;

                                                Procedure win;

{Lorsque Level1[x,y]:=3; alors la cible (procedure win;) sera dessiner.}
begin
{Alternance entre des cercles rouges et blanc de differentes grandeurs pour
faire le dessin d'une cible d'archer.
On utilise FILLELLIPSE et non CIRCLE pour avoir des cercle plein et non
seulement des le contour d'un cercle.}
setfillstyle(1,15);
fillellipse((x+1)*larg+(larg div 2),(y-1)*larg+(larg div 2),18,18);
setfillstyle(1,red);
fillellipse((x+1)*larg+(larg div 2),(y-1)*larg+(larg div 2),15,15);
setfillstyle(1,white);
fillellipse((x+1)*larg+(larg div 2),(y-1)*larg+(larg div 2),12,12);
setfillstyle(1,red);
fillellipse((x+1)*larg+(larg div 2),(y-1)*larg+(larg div 2),9,9);
setfillstyle(1,white);
fillellipse((x+1)*larg+(larg div 2),(y-1)*larg+(larg div 2),6,6);
setfillstyle(1,red);
fillellipse((x+1)*larg+(larg div 2),(y-1)*larg+(larg div 2),3,3);
end;


                                        procedure winafterrollover;

{Puisqu'on peux seulement passer un niveau en ARRETANT sur la cible,
lorsqu'on passe dessus, le procedure NOPAC (qui efface le dessin de PAC sur
l'ecran) l'effacerait. Alors il faut redessiner la cible une fois que le
pion (PAC) passe dessus.
[XPAC,YPAC] est utilisee parce que ceci est une procedure qui sera utlisee
APRES que le niveau soit dessiner.}
begin
{Alternance entre des cercles rouges et blanc de differentes grandeurs pour
faire le dessin d'une cible d'archer.
On utilise FILLELLIPSE et non CIRCLE pour avoir des cercle plein et non
seulement des le contour d'un cercle.}
setfillstyle(1,15);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),18,18);
setfillstyle(1,red);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),15,15);
setfillstyle(1,white);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),12,12);
setfillstyle(1,red);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),9,9);
setfillstyle(1,white);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),6,6);
setfillstyle(1,red);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),3,3);
end;


                                        Procedure godown;

{Lorsque Level1[x,y]:=4; la procedure godown sera dessinee.
Cette procedure fera le dessin d'un carree orange avec deux fleches
qu pointeront vers le bas. Cet 'obstacle' peut etre franchi lorsque
pac se deplace du haut vers le bas, mais dans aucun autre sens.}

begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [x,y] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
bar(x*larg+40,y*larg-40,x*larg+80,y*larg);
line(x*larg+40,y*larg-40,x*larg+60,y*larg-20);
line(x*larg+60,y*larg-20,x*larg+80,y*larg-40);
line(x*larg+40,y*larg-20,x*larg+60,y*larg);
line(x*larg+60,y*larg,x*larg+80,y*larg-20);
end;

                                        Procedure godownrollover;

{Lorsque pac (pion) passe par-dessus l'obstacle 'godown' (Level1[x,y]:=4;)
La procedure nopac(voir procedure 'nopac') dessinera un cercle noir par
apres pour effacer le pac qui sera sur 'godown'. Pour ne pas que le
dessin de l'obstacle 'godown' aie un cercle noir dessus, il faudra redessiner
l'obstacle. Cette procedure est identique a 'godown', mais on utilise
[XPAC,YPAC], car elle sera utilisee APRES que le niveau soit dessiner.}
begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [xpac,ypac] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
bar(xpac*larg+40,ypac*larg-40,xpac*larg+80,ypac*larg);
setcolor(white);
line(xpac*larg+40,ypac*larg-40,xpac*larg+60,ypac*larg-20);
line(xpac*larg+60,ypac*larg-20,xpac*larg+80,ypac*larg-40);
line(xpac*larg+40,ypac*larg-20,xpac*larg+60,ypac*larg);
line(xpac*larg+60,ypac*larg,xpac*larg+80,ypac*larg-20);
end;

                                  Procedure goup;

{Lorsque Level1[x,y]:=6; la procedure 'goup' sera dessinee.
Cette procedure fera le dessin d'un carree orange avec deux fleches
qui pointeront vers le haut. Cet 'obstacle' peut etre franchi lorsque
pac se deplace du bas vers le haut, mais dans aucun autre sens.}
begin
setfillstyle(1,6);
bar(x*larg+40,y*larg-40,x*larg+80,y*larg);     {Dessin du carree orange}
line(x*larg+40,y*larg-20,x*larg+60,y*larg-40); {et des lignes qui representent}
line(x*larg+60,y*larg-40,x*larg+80,y*larg-20); {les fleches.}
line(x*larg+40,y*larg,x*larg+60,y*larg-20);    {On utilise la constante 'larg'}
line(x*larg+60,y*larg-20,x*larg+80,y*larg);    {et les variables [x,y] pour}
end;                                      {que le dessin se fasse a l'endroit
                                           desirer dans la matrice 12X12.}


                                 Procedure gouprollover;

{Lorsque pac (pion) passe par-dessus l'obstacle 'goup' (Level1[x,y]:=6;)
LA procedure nopac(voir procedure 'nopac') dessinera un cercle noir par
apres pour effacer le pac qui sera dessiner sur 'goup'. Pour ne pas que le
dessin de l'obstacle 'goup' aie un cercle noir dessus, il faudra redessiner
l'obstacle.Cette procedure est identique a 'goup', mais on utilise
[XPAC,YPAC], car elle sera utilisee APRES que le niveau soit dessiner.}
begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [xpac,ypac] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
bar(xpac*larg+40,ypac*larg-40,xpac*larg+80,ypac*larg);
setcolor(white);
line(xpac*larg+40,ypac*larg-20,xpac*larg+60,ypac*larg-40);
line(xpac*larg+60,ypac*larg-40,xpac*larg+80,ypac*larg-20);
line(xpac*larg+40,ypac*larg,xpac*larg+60,ypac*larg-20);
line(xpac*larg+60,ypac*larg-20,xpac*larg+80,ypac*larg);
end;


                                  Procedure goleft;

{Lorsque Level1[x,y]:=5; la procedure 'goleft' sera dessinee.
Cette procedure fera le dessin d'un carree orange avec deux fleches
qui pointeront vers la gauche. Cet 'obstacle' peut etre franchi lorsque
pac se deplace de la droite vers la gauche, mais dans aucun autre sens.}
begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [x,y] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
bar(x*larg+40,y*larg-40,x*larg+80,y*larg);
line(x*larg+60,y*larg-20,x*larg+80,y*larg-40);
line(x*larg+60,y*larg-20,x*larg+80,y*larg);
line(x*larg+40,y*larg-20,x*larg+60,y*larg-40);
line(x*larg+40,y*larg-20,x*larg+60,y*larg);
end;

                                        Procedure goleftrollover;

{Lorsque pac (pion) passe par-dessus l'obstacle 'goleft' (Level1[x,y]:=5;)
La procedure nopac(voir procedure 'nopac') dessinera un cercle noir par
apres pour effacer le pac qui sera dessiner sur 'goleft'. Pour ne pas que le
dessin de l'obstacle 'goleft' aie un cercle noir dessus, il faudra redessiner
l'obstacle.Cette procedure est identique a 'goleft', mais on utilise
[XPAC,YPAC], car elle sera utilisee APRES que le niveau soit dessiner.}
begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [xpac,ypac] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
setcolor(white);
bar(xpac*larg+40,ypac*larg-40,xpac*larg+80,ypac*larg);
line(xpac*larg+60,ypac*larg-20,xpac*larg+80,ypac*larg-40);
line(xpac*larg+60,ypac*larg-20,xpac*larg+80,ypac*larg);
line(xpac*larg+40,ypac*larg-20,xpac*larg+60,ypac*larg-40);
line(xpac*larg+40,ypac*larg-20,xpac*larg+60,ypac*larg);
end;


                                        Procedure goright;

{Lorsque Level1[x,y]:=7; la procedure 'goright' sera dessiner.
Cette procedure fera le dessin d'un carree orange avec deux fleches
qu pointeront vers la droite. Cet 'obstacle' peut etre franchi lorsque
pac se deplace de la gauche vers la droite, mais dans aucun autre sens.}
begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [x,y] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
bar(x*larg+40,y*larg-40,x*larg+80,y*larg);
line(x*larg+40,y*larg-40,x*larg+60,y*larg-20);
line(x*larg+40,y*larg,x*larg+60,y*larg-20);
line(x*larg+60,y*larg-40,x*larg+80,y*larg-20);
line(x*larg+60,y*larg,x*larg+80,y*larg-20);
end;

                                        Procedure gorightrollover;

{Lorsque pac (pion) passe par-dessus l'obstacle 'goright' (Level1[x,y]:=7;)
La procedure nopac(voir procedure 'nopac') dessinera un cercle noir par
apres pour effacer le pac qui sera dessiner sur 'goright'. Pour ne pas que le
dessin de l'obstacle 'goright' aie un cercle noir dessus, il faudra redessiner
l'obstacle.Cette procedure est identique a 'goright', mais on utilise
[XPAC,YPAC], car elle sera utilisee APRES que le niveau soit dessiner.}
begin
{Dessin du carree orange et des lignes qui representent les fleches.
On utilise la constante 'larg' et les variables [xpac,ypac] pour que le
 dessin se fasse a l'endroit desirer dans la matrice 12X12.}
setfillstyle(1,6);
setcolor(white);
bar(xpac*larg+40,ypac*larg-40,xpac*larg+80,ypac*larg);
line(xpac*larg+40,ypac*larg-40,xpac*larg+60,ypac*larg-20);
line(xpac*larg+40,ypac*larg,xpac*larg+60,ypac*larg-20);
line(xpac*larg+60,ypac*larg-40,xpac*larg+80,ypac*larg-20);
line(xpac*larg+60,ypac*larg,xpac*larg+80,ypac*larg-20);
end;




                                        Procedure nopac;

{A chaque fois qu'une fleche du clavier sera peser, pac se deplacera en ligne
droite dans la direction voulu jusqu'a ce qu'il rencontre un obstacle qu'il
ne peux pas franchir dans sa direction donnee. La procedure nopac permet
qu'a chaque fois que pac se deplace d'une case, celui qui etait present sur
la case anterieure s'efface pour qu'il y aie un seul pac de present sur
l'ecran en tout temps.}
begin
setcolor(0);                   {0=noir}
setfillstyle(1,0);
fillellipse((xpac+1)*larg+(larg div 2),(ypac-1)*larg+(larg div 2),18,18);

{Cette secton de 'if' est tres importante. Nopac sera dessiner sur la case
anterieure de pac a tout les coups que celui-ci se deplacera. PAR CONTRE, si
la case sur laquelle le NOPAC est dessiner possedat une valeur autre que 0,
l'obstacle qui est present sur cette case sera redessinee. Voici l'utilitee
des procedure 'XXXXXX-rollover' precedente.}

if Level1[xpac,ypac]=3 then winafterrollover;
if Level1[xpac,ypac]=4 then godownrollover;
if Level1[xpac,ypac]=5 then goleftrollover;
if Level1[xpac,ypac]=6 then gouprollover;
if Level1[xpac,ypac]=7 then gorightrollover;
end;

                                        Procedure Pointage;

{Cette procedure se souvient et affiche le pointage du joueur. A chaque fois
qu'une des fleches du clavier sera peser, le pointage sera decrementee de
25 points(par contre cette decrementation se fait dans la
procedure 'BOUGER').}
begin
setfillstyle(1,black);       {Permet d'effacer le pointage qui etait ecrit}
bar(320,0,640,39);           {pour le remplacer par le nouveau. }
setcolor(white);             {Pour ecrire le pointage en blanc}
str(total,Totals);           {Transforme la valeur de Total en string}
outtextxy(450,10, Totals);   {Ecrit le total des points accumule}
str(point,points);           {Transforme la valeur de Point en string}
outtextxy(330,10, Points);   {Ecrit le nombre de points du niveau}
Outtextxy(400,10,'TOTAL');
Outtextxy(200,10,'POINT DU LEVEL');
end;


                                        procedure error;

{Si le joueur effectue une manoeurvre ou pac ne pourra pas bouger
alors la procedure error embarquera}
begin
{Fait un son d'erreur}
sound(262);delay(50);nosound;
end;

                                        procedure Bouger;

{Procedure TRES importante du programme. C'est celle-ci qui lira les touches
pesees sur le clavier et qui fera bouger pac.
NOTE :
 #72             REPRESENTE LA FLECHE DU HAUT SUR LE CLAVIER D'ORDINATEUR
 #80             REPRESENTE LA FLECHE DU BAS SUR LE CLAVIER D'ORDINATEUR
 #75             REPRESENTE LA FLECHE DE GAUCHE SUR LE CLAVIER D'ORDINATEUR
 #77             REPRESENTE LA FLECHE DE DROITE SUR LE CLAVIER D'ORDINATEUR
Ici [XPAC,YPAC] est utilisee, car c'est une procedure qui sera utilisee
APRES que la grille soit dessinee.}

begin
fleche:=readkey;    {fleche est un 'char'}


case fleche of


#72 :                      {Cette section peut sembler compliquee, mais en
                           l'analysant, elle est bien simple.}
if(Level1[xpac,ypac-1]<>1)   {Si la case au-dessus de pac n'est pas un cube}
and (Level1[xpac,ypac-1]<>4){ou n'est pas un 'godown' (voir procedure godown)}
and(Level1[xpac,ypac-1]<>5) {ou n'est pas un 'goleft'(voir procedure goleft)}
and(Level1[xpac,ypac-1]<>7) {ou n'est pas un 'goright' (voir procedure goright)}
                            {Noter que si la case au-dessus de pac est un
                            'goup' (Level1[xpac,ypac]:=6, alors pac
                            sera capable de passer}
then                       {ALORS}
begin
repeat                  {repete}
delay(15);              {un delaie de 15 millsecondes}
nopac;                  {Efface le pac en tracant un rond noir}
dec(ypac);              {Decremente ypac qui represente la position VERTICALE
                        de pac}
Pac;                    {Dessine un nouveau pac une case au-dessus de la case
                        precedente}
until                  {JUSQU'A CE QUE}
(Level1[xpac,ypac-1]=1)   {La case au dessus de pac soit un cube}
or(Level1[xpac,ypac-1]=4) {ou un 'godown'}
or(Level1[xpac,ypac-1]=5) {ou un 'goleft'}
or(Level1[xpac,ypac-1]=7);{ou un 'goright'}

if point>0 then dec(point,25); {Si le pointage pour le niveau n'est pas deja
                               a 0, alors decremente le pointage du niveau
                               actuel de 25 points.}
end
else error;                    {Si pac ne peut pas bouger, alors error (voir
                               procedure error pour plus de details)}

#75 :
{Meme principe qu'au-dessus,mais en utilisant les cases a gauche de pac.}
if (Level1[xpac-1,ypac]<>1) and (Level1[xpac-1,ypac]<>4)
and (Level1[xpac-1,ypac]<>6)and(Level1[xpac-1,ypac]<>7) then
begin
repeat delay(15);nopac; dec(xpac); Pac; until
(Level1[xpac-1,ypac]=1)or(Level1[xpac-1,ypac]=4)
or(Level1[xpac-1,ypac]=6)or(Level1[xpac-1,ypac]=7);
if point>0 then dec(point,25);
end
else error;

#80 :
{Meme prncipe qu'au-dessus, mais en utilisant analysant les cases en-dessous
de pac.}
if (Level1[xpac,ypac+1]<>1) and(Level1[xpac,ypac+1]<>5)
and (Level1[xpac,ypac+1]<>6)and(Level1[xpac,ypac+1]<>7) then
begin
repeat delay(15);nopac; inc(ypac);Pac;   until
(Level1[xpac,ypac+1]=1)or(Level1[xpac,ypac+1]=5)
or(Level1[xpac,ypac+1]=6)or(Level1[xpac,ypac+1]=7);
if point>0 then dec(point,25);
end
else error;

#77 :
{Meme prncipe qu'au-dessus, mais en utilisant analysant les cases a droite
de pac.}
if (Level1[xpac+1,ypac]<>1) and (Level1[xpac+1,ypac]<>4)
and (Level1[xpac+1,ypac]<>5) and (Level1[xpac+1,ypac]<>6) then
begin
repeat delay(15);nopac; inc(xpac); Pac;   until
 (Level1[xpac+1,ypac]=1)or(Level1[xpac+1,ypac]=4)
or(Level1[xpac+1,ypac]=5)or(Level1[xpac+1,ypac]=6);
if point>0 then dec(point,25);
end
else error;

end;       {FIN DU CASE}
end;       {FIN DE LA PROCEDURE}

                                        Procedure yay;

{Procedure utilisee lorsqu'un niveau est completer.
Suite successive de 5 notes qui realise une musique joyeuse de reussite.}
begin
sound(349);delay(100);
sound(392);delay(100);
sound(440);delay(100);
sound(494);delay(100);
sound(523);delay(100);
nosound;
end;


                                        Procedure ouverture;
{Procedure qui dessine l'ouverture du programme et qui presente le createur}
begin
outtextxy(260,260,'PESE ENTER');
readln;
cleardevice;
outtextxy(210,210,'Bienvenue au jeu SLIDE MAZE');
outtextxy(150,250,'Creer par SEAN BOLDUC aka DiscoSonOfABitch');
delay(500);
Level1[1,6]:=7;Level1[12,6]:=5;
for x:=1 to 12 do for y:=1 to 12 do
begin if Level1[x,y]=7 then goright; if Level1[x,y]=5 then goleft; end;
delay(200);
Level1[2,6]:=7;Level1[11,6]:=5;
for x:=1 to 12 do for y:=1 to 12 do
begin if Level1[x,y]=7 then goright; if Level1[x,y]=5 then goleft; end;
delay(200);
Level1[3,6]:=7;Level1[10,6]:=5;
for x:=1 to 12 do for y:=1 to 12 do
begin if Level1[x,y]=7 then goright; if Level1[x,y]=5 then goleft; end;
Level1[1,3]:=1;
Level1[2,3]:=2;
Level1[3,3]:=3;
Level1[5,3]:=4;
Level1[7,3]:=5;
Level1[9,3]:=6;
Level1[11,3]:=7;
for x:= 1 to 12 do
if level1[x,3]=1 then cube
else if Level1[x,3]=3 then win
else if Level1[x,3]=4 then godown
else if Level1[x,3]=5 then goleft
else if Level1[x,3]=6 then goup
else if Level1[x,3]=7 then goright
else if Level1[x,3]=2 then pac;
delay(100);
Outtextxy(250,330,'PESE ENTER');
readln;
end;



                                        Procedure Start;

{Procedure qui sera presente au debut de chaque niveau.
Elle souhaite la bienvenue a l'utilisateur au niveau.}
begin
Text:='Level  ';
str(Level,Levels);  {Transforme la valeur du niveau (i.e. de 1 a 10)
                   en string pour qu'il puisse etre utilsiee dans un outtext}
Outtextxy((getmaxx-textwidth('Bienvenue au ')) div 2,220,' Bienvenue au ');
Outtextxy((getmaxx-textwidth(Text+levels)) div 2, (getmaxy-textheight(Text+levels))div 2,Text+levels);
Outtextxy((getmaxx-textwidth(n)) div 2,250,n);
end;

                                        Procedure dessinelelevel;

{Procedure qui dessine le niveau. Elle sera utilisee au debut de chaque
niveau pour que le niveau apparaissent a l'ecran.
NOTE : Cette procedure dessine seulement les objets/obstacles du niveau.
       La grille de jeu est dessiner par la procedure 'Grille'.}
begin
Point:=1000;            {Puisque cette procedure est utilisee au debut de
                        chaque procedure de niveau. Je remet a 1000 le
                        pointage de niveau ici pour ne pas avoir a le repeter
                        10 fois.}
setfillstyle(1,black);
bar(320,0,640,39);     {efface le pointage du dernier niveau}
textcolor(white);
outtextxy(450,10,Totals); {Reecrit le nouveau pointage Total et du
                         celui du niveau (1000 points).}
outtextxy(330,10,Points);

for x:= 1 to 12 do                {Balaie la matrice 12X12 horizontalement}
for y:= 1 to 12 do                {Balaie la matrice 12X12 verticalement}
if level1[x,y]=1 then cube        {VOIR PROCEDURE CUBE}
else if Level1[x,y]=3 then win    {VOIR PROCEDURE WIN}
else if Level1[x,y]=4 then godown {VOIR PROCEDURE GODOWN}
else if Level1[x,y]=5 then goleft {VOIR PROCEDURE GOLEFT}
else if Level1[x,y]=6 then goup   {VOIR PROCEDURE GOUP}
else if Level1[x,y]=7 then goright{VOIR PROCEDURE GORIGHT}
else if Level1[x,y]=2 then
begin xpac:=x; ypac:=y; Pac; end; {Mets la position en X et en Y de pac
                                  comme [XPAC,YPAC] (voir note en haut
                                  de programme pour voir difference entre
                                  [XPAC,YPAC] et [X,Y]), pus dessine pac}


for x:= 1 to 12 do      {Trace une bordure au-dessus et en dessous de l'aire
                        de jeu pour ne pas que pac puisse sortir}
                        {Cette bordure sera invisible}
for x:= 1 to 12 do
begin
Level1[x,1]:=1;
Level1[x,12]:=1;
end;

for y:= 1 to 12 do   {Trace une bordure a gauche et a droite de l'aire
                        de jeu pour ne pas que pac puisse sortir}
                        {Cette bordure sera invisible}
begin
Level1[1,y]:=1;
Level1[12,y]:=1;
end;
end;


Procedure Level1e;

{Premier niveau du jeu.
NOTE:
  LEVEL1[X,Y]:=1;  CUBE/OBSTACLE
                   (VOIR PROCEDURE : CUBE)
  LEVEL1[X,Y]:=2;  PION BLANC QUI REPRESENTE LE JOUEUR (AUSSI APPELER PAC
                   DURANT LE PROGRAMME)
                   (VOIR PROCEDURE : PAC)
  LEVEL1[X,Y]:=3;  CIBLE/OBJECTF A ATTEINDRE DANS LES DIFFERENTS NIVEAUX
                   (VOIR PROCEDURE : WIN)
  LEVEL1[X,Y]:=4;  OBSTACLE FRANCHISSABLE DU HAUT VERS LE BAS, MAIS DANS
                   AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GODOWN)
  LEVEL1[X,Y]:=5;  OBSTACLE FRANCHISSABLE DE LA DROITE VERS LA GAUCHE, MAIS
                   DANS AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GOLEFT)
  LEVEL1[X,Y]:=6;  OBSTACLE FRANCHISSABLE DU BAS VERS LE HAUT, MAIS DANS
                   AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GOUP)
  LEVEL1[X,Y]:=7;  OBSTACLE FRANCHISSABLE DE LA GAUCHE VERS LA DROITE, MAIS
                   DANS AUCUNES AUTRES DIRECTIONS
                   (VOIR PROCEDURE : GORIGHT)}
begin
Level:=1;          {Donne la valeur '1' au niveau, elel sera utiliser dans
                   la procedure 'START'}
cleardevice;       {Efface l'ecran.}
start;             {Souhaite la bienvenue au joueur.}
delay(1000);
cleardevice;       {Reefface l'ecran.}
grille;            {Dessine le grille de jeu.}
for x:=1 to 12 do  {Remet toutes les cases du niveau a la valeur de '0'}
for y:= 1 to 12 do
Level1[x,y]:=0;

for y:= 2 to 11 do        {Donne des valeurs aux cases de la matrice 12X12.}
begin                     {Donne des valeurs aux cases de la matrice 12X12.}
Level1[5,y]:=1;           {Donne des valeurs aux cases de la matrice 12X12.}
Level1[7,y]:=1;           {Donne des valeurs aux cases de la matrice 12X12.}
end;                      {Donne des valeurs aux cases de la matrice 12X12.}

Level1[6,2]:=2;           {Donne des valeurs aux cases de la matrice 12X12.}
Level1[6,11]:=3;          {Donne des valeurs aux cases de la matrice 12X12.}

dessinelelevel;      {Dessine le niveau (VOIR PROCEDURE DESSINELELEVEL)}
pointage;            {Reecrit le pointage}
end;

Procedure Level2e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=2;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[2,2]:=2;
Level1[2,11]:=3;
for x:=2 to 10 do begin Level1[x,3]:=1; Level1[x,10]:=1; end;
for y:= 4 to 9 do Level1[10,y]:=1;
dessinelelevel;pointage;
end;

Procedure Level3e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=3;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[3,9]:=2;
Level1[11,6]:=3;

Level1[3,3]:=1;Level1[7,4]:=1;Level1[9,2]:=1;Level1[8,7]:=1;
dessinelelevel;pointage;
end;

Procedure Level4e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=4;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;
Level1[4,9]:=2;
Level1[5,9]:=3;

Level1[2,8]:=1;Level1[3,4]:=1;Level1[4,3]:=1;Level1[6,2]:=1;Level1[8,4]:=1;Level1[7,9]:=1;
Level1[5,10]:=1;
dessinelelevel;pointage;
end;

Procedure Level5e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=5;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[2,11]:=2;
Level1[3,11]:=3;

Level1[2,10]:=1;Level1[4,7]:=1;Level1[5,11]:=1;Level1[6,3]:=1;Level1[7,7]:=1;
Level1[9,6]:=1;Level1[8,11]:=1;Level1[10,5]:=1;Level1[11,8]:=1;Level1[11,2]:=1;Level1[11,8]:=1;
dessinelelevel;pointage;
end;

Procedure Level6e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=6;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[6,6]:=2;
Level1[9,10]:=3;

Level1[2,6]:=1;Level1[3,2]:=1;Level1[3,9]:=1;Level1[4,4]:=1;Level1[6,2]:=1;
Level1[7,6]:=1;Level1[8,2]:=1;Level1[8,10]:=1;Level1[9,7]:=1;Level1[9,11]:=1;
Level1[10,9]:=1;Level1[11,3]:=1;Level1[11,6]:=1; Level1[6,9]:=1;LEvel1[2,7]:=1;
Level1[11,9]:=1;
dessinelelevel;pointage;
end;

Procedure Level7e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=7;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[2,2]:=2;
Level1[9,10]:=3;
Level1[6,6]:=4;

Level1[2,5]:=1;Level1[6,9]:=1;Level1[7,2]:=1;Level1[7,4]:=1;Level1[7,11]:=1;
Level1[8,5]:=1;Level1[9,8]:=1;Level1[10,10]:=1;
dessinelelevel;pointage;
end;

Procedure Level8e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=8;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[6,6]:=2;
Level1[7,5]:=3;
Level1[6,7]:=4;
Level1[5,6]:=5;Level1[9,5]:=5;
Level1[6,5]:=6;Level1[11,6]:=6;
Level1[7,6]:=7;
Level1[2,2]:=1;Level1[3,2]:=1;Level1[4,2]:=1;Level1[5,2]:=1;Level1[6,2]:=1;
Level1[2,11]:=1;Level1[6,3]:=1;Level1[6,9]:=1;Level1[7,2]:=1;
Level1[8,2]:=1;Level1[9,6]:=1;Level1[10,8]:=1;Level1[11,4]:=1;
dessinelelevel;pointage;
end;

Procedure Level9e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=9;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;

Level1[7,6]:=2;
Level1[6,4]:=3;
for x:= 4 to 9 do
Level1[x,5]:=7;
Level1[4,6]:=5;Level1[5,6]:=5;Level1[6,6]:=5;
Level1[8,6]:=5;Level1[9,6]:=5;Level1[6,10]:=5;
Level1[8,9]:=4;
Level1[2,6]:=6;
Level1[2,8]:=1;Level1[2,10]:=1;Level1[3,6]:=1;Level1[5,4]:=1;
Level1[6,2]:=1;Level1[7,7]:=1;Level1[10,6]:=1;Level1[11,6]:=1;
dessinelelevel;pointage;
end;

Procedure Level10e;
{VOIR PROCEDURE LEVEL1E POUR PLUS DE DETAILS}
begin
Level:=10;
cleardevice;start;delay(1000);cleardevice;grille;
for x:=1 to 12 do
for y:= 1 to 12 do
Level1[x,y]:=0;
Level1[2,11]:=2; Level1[9,7]:=3;
for y:= 2 to 5 do Level1[2,y]:=7; for y:=2 to 6 do Level1[3,y]:=7;
for y:= 3 to 7 do Level1[5,y]:=1; Level1[5,8]:=7;
Level1[3,7]:=4;Level1[3,8]:=4;Level1[3,9]:=4;Level1[4,7]:=4;
Level1[3,11]:=4;Level1[5,2]:=4;Level1[5,9]:=4;Level1[5,10]:=4;Level1[5,10]:=4;
Level1[6,9]:=7;Level1[7,6]:=4;Level1[7,7]:=4;Level1[7,8]:=4;Level1[6,5]:=6;
Level1[6,3]:=7;Level1[5,11]:=5;
for y:=2 to 10 do Level1[8,y]:=1;Level1[8,11]:=7;
Level1[9,8]:=7;Level1[10,8]:=7;Level1[11,8]:=6;Level1[11,9]:=7;
Level1[10,9]:=7; Level1[11,11]:=6;

dessinelelevel;pointage;
end;


                                         Procedure ending;
{Procedure qui souhaite au revoir a l'Usager a la sortie du programme.}
begin
for x:= 0 to 12 do for y:=0 to 12 do
Level1[x,y]:=0;
cleardevice;
Level1[4,3]:=2;
Level1[8,3]:=1;                     {Dessin d'objet}
Level1[7,8]:=1;
dessinelelevel;                     {Dessine le level}
delay(500);
repeat delay(15);nopac; inc(xpac); Pac;   until
 (Level1[xpac+1,ypac]=1)or(Level1[xpac+1,ypac]=4)    {Bouge vers la droite}
or(Level1[xpac+1,ypac]=5)or(Level1[xpac+1,ypac]=6);
delay(200);
repeat delay(15);nopac; inc(ypac);Pac;   until      {Bouge vers le bas}
(Level1[xpac,ypac+1]=1)or(Level1[xpac,ypac+1]=5)
or(Level1[xpac,ypac+1]=6)or(Level1[xpac,ypac+1]=7);
delay(200);
repeat delay(15);nopac; dec(xpac); Pac; until (xpac=-10);
setcolor(white);
Outtextxy(240,220,'Au revoir '+n);
delay(3000);
end;



                                                Procedure JEUSELECT;

{Procedure qui permet au joueur de jouer a un seul niveau
Elle est accessible par le menu principale.
C'est le meme prncipe que la procedure JEU, mais qui va seulement
jouer a un seul niveau.
VOIR PROCEDURE LEVELSELECT POUR PLUS DE DETAILS}
begin
Babouin:=0;
case Level of
1: begin
     Level1e;  {VOIR PROCEDURE JEU POUR PLUS DE DETAILS}
     repeat  bouger; pointage; if upcase(fleche)='R' then Level1e;
                               if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
     gameover;
     end;

2: begin
     Level2e;
     repeat  bouger;pointage;if upcase(fleche)='R' then Level2e;
                             if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
     gameover;
     end;

3: begin
     Level3e;
     repeat  bouger;pointage; if upcase(fleche)='R' then Level3e;
                              if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
     gameover;
     end;

4: begin
     Level4e;
     repeat  bouger;pointage; if upcase(fleche)='R' then Level4e;
                         if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
     gameover;
     end;

5: begin
     Level5e;
     repeat  bouger;pointage; if upcase(fleche)='R' then Level5e;
                              if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
     gameover;
     end;

6: begin
     Level6e;
     repeat  bouger;pointage; if upcase(fleche)='R' then Level6e;
                              if upcase(fleche)='X' then babouin:=2;
     until(Level1[xpac,ypac]=3) or (Babouin=2) ; yay;Total:=total+point;
     gameover;
     end;

7: begin
     Level7e;
     repeat  bouger;pointage;  if upcase(fleche)='R' then Level7e;
                               if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); Yay;Total:=total+point;
     gameover;
     end;

8: begin
     Level8e;
     repeat  bouger; pointage; if upcase(fleche)='R' then Level8e;
                               if  upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
     gameover;
     end;

9:     if Babouin<> 2 then
     begin
     Level9e;
     repeat  bouger; pointage; if upcase(fleche)='R' then Level9e;
                               if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
     gameover;
     end;

10:begin
     Level10e;
     repeat  bouger; pointage; if upcase(fleche)='R' then Level10e;
                               if upcase(fleche)='X' then babouin:=2;
     until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
     gameover;
     end;
end;
end;

                                         Procedure Levelselect;

{Menu pour choisir le niveau que le joueur voudrait jouer.
En utilisant un readkey des chiffres 0 a 9, l'usager peut choisir de
jouer des niveau 1 a 10. Lorsqu'il choisi un niveau (en utilisant les chiffres
0 a 9 du clavier) le programme ira dans la procedure JEUSELECT qui
envoiera le joueur au bon niveau.}
begin
Total:=0;
Level:=0;                    {Remet la valeur de Level a 0}
cleardevice;                 {Efface l'ecran}
outtextxy(10,450,'Peser sur "X" pour quitter le jeu');
Outtextxy(10,465,'Peser sur n"importe quelle autre touche pour revenir au menu principale');
Outtextxy(275,100,'Selectionnez');   {Offre des choix au joueur}
setfillstyle(1,white);
Outtextxy(280,150,'1. Level 1');
Outtextxy(280,170,'2. Level 2');
Outtextxy(280,190,'3. Level 3');
Outtextxy(280,210,'4. Level 4');
Outtextxy(280,230,'5. Level 5');
Outtextxy(280,250,'6. Level 6');
Outtextxy(280,270,'7. Level 7');
Outtextxy(280,290,'8. Level 8');
Outtextxy(280,310,'9. Level 9');
Outtextxy(280,330,'0. Level 10');
fleche:=upcase(readkey); {Lit la touche pesee par l'usager}
case fleche of           {D'apres la touche pesee, on donne une valeur
                         a la variable Level.}
'1':Level:=1;
'2':Level:=2;
'3':Level:=3;
'4':Level:=4;
'5':Level:=5;
'6':Level:=6;
'7':Level:=7;
'8':Level:=8;
'9':Level:=9;
'0':Level:=10;
end;
JEUselect;         {D'apres la valeur de Level, JEUSELECT dirigera le joueur
                   au bon niveau.}
end;

                                        procedure Instruction1;

{Premiere des 3 pages des instructions.
Presente les regles du jeu.}

begin
Page:=1;   {Sera utilisee pour pourvoir changer de page dans la procedure menu}
cleardevice;
            text:=chr(27);               {chr(27) est le dessin d'une fleche}
        outtextxy(10,460,text+ ' PAGE PRECEDENTE');
        text:=chr(26);                   {chr(27) est le dessin d'une fleche}
        outtextxy(500,460,'PAGE SUIVANTE '+text );
        outtextxy(250,445, 'X = EXIT INSTRUCTIONS ');
        outtextxy(250,460, 'TU PEUX LE FAIRE '+n);
        Outtextxy(20,20,'1');
outtextxy(90,10,'Bienvenue aux instructions du jeu Slide Maze');
outtextxy(90,25,'Le but du jeu est simple, il suffit d"utiliser les 4 fleches');
outtextxy(90,40,'du clavier pour deplacer la boule dans la direction desiree');
outtextxy(90,55,'Pour passer un niveau, il faut que la boule blanche s"arrete');
outtextxy(90,70,'sur la cible. Si la boule blanche passe SUR la cible mais n"est');
outtextxy(90,85,'pas arretee, alors rien ne se passera.');
Outtextxy(90,150,'POINTAGE : Le pointage dans ce jeu fonctionne de la maniere');
Outtextxy(90,165,'suivante:au debut d"un niveau le joueur a 1000 points pour');
Outtextxy(90,180,'le niveau. Lorsqu"il appuie sur une des fleches du clavier');
Outtextxy(90,195,'et que le pion peut se deplacer dans le sens voulu, il');
Outtextxy(90,210,'perdera 25 points des mille points. Lorsque le niveau est');
Outtextxy(90,225,'reussi, le pointage du niveau complete s"ajoutera au total');
Outtextxy(90,240,'des points du jeu.Le jeu ayant 10 niveaux il sera donc');
Outtextxy(90,255,'impossible de faire plus que 10000 points au total.');
end;

                                        procedure Instruction2;

{Deuxieme des 3 pages des instructions.
Presente les objets du jeu.}

begin
Page:=2;  {Sera utilisee pour pourvoir changer de page dans la procedure menu}
cleardevice;
        text:=chr(27);
        outtextxy(10,460,text+ ' PAGE PRECEDENTE');
        text:=chr(26);
        outtextxy(500,460,'PAGE SUIVANTE '+text );
        outtextxy(250,445, 'X = EXIT INSTRUCTIONS ');
        outtextxy(250,460, 'TU PEUX LE FAIRE '+n);
outtextxy(100,100,'OBJETS DU JEU');
Outtextxy(20,20,'2');

{Cette prochaine section utilise le meme prncipe que dans la procedure
DESSINELELEVEL pour dessiner les objets du jeu. Voir procedure DESSINELELEVEL
pour voir en details le fontionnement.}
for x:= 1 to 12 do
for y:=1 to 12 do
Level1[x,y]:=0;
level1[3,5]:=2; level1[3,7]:=3; level1[3,9]:=1; for x:= 1 to 12 do
for y:= 1 to 12 do begin if Level1[x,y]=1 then cube
else if Level1[x,y]=2 then begin setfillstyle(1,white);fillellipse(180,180,19,19) end
else if Level1[x,y]=3 then win;end;

outtextxy(210,160,'VOUS : en utilisant les quatre fleches du');
outtextxy(210,170,' clavier il est possible de deplacer ce pion en');
outtextxy(210,180,'ligne droite a travers laire de jeu');

outtextxy(210,240,'Ceci est l"objectif a atteindre');
outtextxy(210,250,'Il faut que le pion blanc S"ARRETE sur celui-ci.');
outtextxy(210,260,'Si le pion blanc fait seulement passer dessus ');
outtextxy(210,270,'le niveau ne sera pas completee');

outtextxy(210,320,'Obstacle au pion blanc.');
outtextxy(210,330,'Le pion blanc s"arretera lorsqu"il frappera ce bloc');
outtextxy(210,340,'peu importe dans quel sens il se dirigeait.');

end;

                                        procedure Instruction3;

{Premiere des 3 pages des instructions.
Presente les obstacles du jeu.}
begin
page:=3;  {Sera utilisee pour pourvoir changer de page dans la procedure menu}
cleardevice;
        text:=chr(27);
        outtextxy(10,460,text+ ' PAGE PRECEDENTE');
        text:=chr(26);
        outtextxy(500,460,'PAGE SUIVANTE '+text );
        outtextxy(250,445, 'X = EXIT INSTRUCTIONS ');
        outtextxy(250,460, 'TU PEUX LE FAIRE '+n);
outtextxy(100,50,'OBSTACLES PARTICULIERS');
Outtextxy(20,20,'3');
{Cette prochaine section utilise le meme prncipe que dans la procedure
DESSINELELEVEL pour dessiner les objets du jeu. Voir procedure DESSINELELEVEL
pour voir en details le fontionnement.}
for x:= 1 to 12 do for y:= 1 to 12 do
Level1[x,y]:=0;
Level1[1,3]:=6;Level1[1,5]:=7;Level1[1,7]:=5;Level1[1,9]:=4;
for x:= 1 to 12 do for y:= 1 to 12 do
begin if Level1[x,y]=4 then godown else if Level1[x,y]=5 then goleft else
if Level1[x,y]=6 then goup else if Level1[x,y]=7 then goright; end;

Outtextxy(125,80,'Obstacle qui est seulement franchissable dans');
Outtextxy(125,90,'le sens des fleches.');
Outtextxy(125,100,'Si le pion blanc arrive dans n"importe quel autre sens, il ne');
Outtextxy(125,110,'pourra pas passer.');

Outtextxy(125,160,'Obstacle qui est seulement franchissable dans');
Outtextxy(125,170,'le sens des fleches.');
Outtextxy(125,180,'Si le pion blanc arrive dans n"importe quel autre sens, il ne');
Outtextxy(125,190,'pourra pas passer.');

Outtextxy(125,240,'Obstacle qui est seulement franchissable dans');
Outtextxy(125,250,'le sens des fleches.');
Outtextxy(125,260,'Si le pion blanc arrive dans n"importe quel autre sens, il ne');
Outtextxy(125,270,'pourra pas passer.');

Outtextxy(125,320,'Obstacle qui est seulement franchissable dans');
Outtextxy(125,330,'le sens des fleches.');
Outtextxy(125,340,'Si le pion blanc arrive dans n"importe quel autre sens, il ne');
Outtextxy(125,350,'pourra pas passer.');
end;


                                                Procedure Menu;

{MENU PRINCIPALE DU JEU. Redirige le joueur vers le jeu, les instructions
ou un niveau en particulier.}
                                        Procedure JEU;

{Procedure JEU. Contrairement a Jeuselect, cette procedure part du niveau 1
et va jusqu'au niveau 10. Apres avoir dessiner un niveau, L'utilisateur sera
libre de bouger dans la direction qu'il veux jusqu'a ce qu'il atteigne
la cible. Si l'utilisateur veux quitter le jeu pour revenir au menu il
peut peser sur X. S'il veux reinitialiser le niveau il n'a qu'a peser sur R.}

begin
Total:=0;
Babouin:=0;
if Babouin<> 2 then
begin
Level1e;
repeat  bouger; pointage; if upcase(fleche)='R' then Level1e;
                          if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2);
yay;                {Son de reussite}
Total:=Total+point; {Augmente le total de points}
end;

if Babouin<> 2 then
begin
Level2e;
repeat  bouger;pointage;if upcase(fleche)='R' then Level2e;
                        if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
end;

if Babouin<> 2 then
begin
Level3e;
repeat  bouger;pointage; if upcase(fleche)='R' then Level3e;
                         if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
end;

if Babouin<> 2 then
begin
Level4e;
repeat  bouger;pointage; if upcase(fleche)='R' then Level4e;
                         if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
end;

if Babouin<> 2 then
begin
Level5e;
repeat  bouger;pointage; if upcase(fleche)='R' then Level5e;
                         if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=total+point;
end;

if Babouin<> 2 then
begin
Level6e;
repeat  bouger;pointage; if upcase(fleche)='R' then Level6e;
                         if upcase(fleche)='X' then babouin:=2;
 until(Level1[xpac,ypac]=3) or (Babouin=2) ; yay;Total:=total+point;
 end;

 if Babouin<> 2 then
 begin
Level7e;
repeat  bouger;pointage;  if upcase(fleche)='R' then Level7e;
                          if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); Yay;Total:=total+point;
end;

if Babouin<> 2 then
begin
Level8e;
repeat  bouger; pointage; if upcase(fleche)='R' then Level8e;
                          if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
end;

if Babouin<> 2 then
begin
Level9e;
repeat  bouger; pointage; if upcase(fleche)='R' then Level9e;
                          if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
end;

if Babouin<> 2 then
begin
Level10e;
repeat  bouger; pointage; if upcase(fleche)='R' then Level10e;
                          if upcase(fleche)='X' then babouin:=2;
until (Level1[xpac,ypac]=3) or (Babouin=2); yay;Total:=Total+point;
end;
gameover;
end;



begin
repeat
cleardevice;
Outtextxy(250,200,'1. Lets play');          {Presente les options au joueur}
Outtextxy(250,215,'2. Comment jouer');
Outtextxy(250,230,'3. Choisir un niveau');
Outtextxy(250,245,'X. EXIT GAME');
setfillstyle(1,white);
fillellipse(200,120,20,20);
fillellipse(400,120,20,20);    {Dessin des 4 cercles}
fillellipse(200,320,20,20);
fillellipse(400,320,20,20);
choix:=upcase(readkey);
case choix of                         {D'apres son choix, redirige le
                                       programme dans la bonne procedure.}
'1':    Jeu;                          {VOIR PROCEDURE JEU}
'2':
        begin cleardevice;instruction1;
        repeat
        instruction:=upcase(readkey);                  {L'usager peut utiliser les fleches}
                                               {du clavier pour feuilleter les }
        case  instruction of                   {pages des instructions}
        {Chaque page possede une valeur (1 a 3) en pesant sur les fleches
        du clavier, on pourra faire changer la valeur de la variable page}
        #75:  begin if page=1 then page:=3{}
        else Page:=(page-1);end;
        #77: begin if page=3 then page:=1
        else Page:=(page+1);end;
        end;
        {Ensuite, on redessine la bonne page par rapport a la valeur que page
        va avoir apres que la fleche du clavier soit pesee}
        case page of
        1: instruction1;
        2:instruction2;
        3:instruction3;
        end;
        until instruction='X';
        end;

'3':    Levelselect;    {VOIR PROCEDURE LEVEL SELECT.}
end;
until choix='X'
end;



begin
{DEBUT DU PROGRAMME PRINCIPALE}
clrscr;
textcolor(white);
gotoxy(30,20);
writeln('Quel est ton nom?');      {Demande le nom a l'usager}
gotoxy(35,21);
readln(n);                         {Lit le nom de l'usager}
pilote:=detect;                    {Initie les fonctions graphiques}
initgraph(pilote,mode,'m:/bgi');
ouverture;
beginning;                         {Voir procedure BEGINNING}
Menu;
ending;
end.