{************************************************
                 Hugo Eti‚vant
     http://www.multimania.com/cyberzoide/
      e-mail : cyberzoide@multimania.com
      (pour une aide en Turbo Pascal 7.0)
*************************************************}


{PROGRAMME DE LABYRINTHE (JEU) }

Uses Graph,Crt; {unit‚s utilis‚es}

Var Pilote,Mode,x,y,a,b,z,i,az:Integer; {d‚claration des variables}
    key:char;
    pix,pix2,pix3,pix4,size:word;
    P:pointer;

Procedure GraphInit;  {proc‚dure d'initialisation du mode graphique}
begin
Clrscr;               {efface l'‚cran}
Delay(50);
{provoque un delay de 50 ms afin de laisser … la carte graphique le temps de
r‚agir ; utile pour les PC ant‚rieurs au 486}
Pilote:=VGA; {d‚finition du pilote graphique}
Mode:=VGAHi; {d‚finition du mode graphique}
InitGraph(Pilote,Mode,'C:\BP\BGI'); {initialisation de la carte graphique}
end;

procedure laby;   {trac‚ du labyrinthe}
{cette proc‚dure aurait pu ˆtre avantageusement mise dans une unit‚}
begin
setfillstyle(1,0);
{choix du style de remplissage et de couleur pour l'instruction BAR}
bar(0,0,640,480); {dessine un rectangle plein, en noir}
setcolor(14); {choix de la couleur}
rectangle(0+x,y,1200+x,1600+y); {contour du labyrinthe}
line(0+x,100+y,200+x,100+y);line(100+x,200+y,400+x,200+y);
line(300+x,100+y,300+x,200+y);line(400+x,100+y,700+x,100+y);
line(400+x,100+y,400+x,400+y);line(500+x,100+y,500+x,200+y);
line(700+x,100+y,700+x,500+y);line(800+x,y,800+x,300+y);
line(800+x,300+y,1000+x,300+y);line(1000+x,y,1000+x,100+y);
line(1100+x,100+y,1100+x,500+y);line(900+x,100+y,900+x,200+y);
line(900+x,200+y,1200+x,200+y);line(600+x,200+y,700+x,200+y);
line(600+x,400+y,1000+x,400+y);line(200+x,200+y,200+x,400+y);
line(100+x,300+y,100+x,500+y);line(300+x,300+y,300+x,500+y);
line(500+x,300+y,500+x,500+y);line(500+x,300+y,600+x,300+y);
line(0+x,500+y,600+x,500+y);line(600+x,500+y,600+x,500+y);
line(700+x,500+y,800+x,500+y);line(1000+x,500+y,1100+x,500+y);
line(900+x,400+y,900+x,700+y);line(700+x,600+y,1200+x,600+y);
line(200+x,600+y,500+x,600+y);line(x,700+y,300+x,700+y);
line(100+x,600+y,100+x,800+y);line(300+x,700+y,300+x,800+y);
line(500+x,600+y,500+x,900+y);line(400+x,700+y,500+x,700+y);
line(600+x,700+y,700+x,700+y);line(700+x,600+y,700+x,700+y);
line(1100+x,600+y,1100+x,700+y);line(500+x,800+y,1100+x,800+y);
line(100+x,900+y,600+x,900+y);line(200+x,800+y,200+x,1000+y);
line(400+x,800+y,400+x,1000+y);line(800+x,700+y,800+x,900+y);
line(700+x,900+y,800+x,900+y);line(1000+x,700+y,1000+x,800+y);
line(1100+x,800+y,1100+x,900+y);line(1000+x,900+y,1100+x,900+y);
line(x,1100+y,300+x,1100+y);line(600+x,900+y,600+x,1100+y);
line(900+x,1000+y,1100+x,1000+y);line(900+x,900+y,900+x,1100+y);
line(100+x,1000+y,100+x,1200+y);line(300+x,1000+y,300+x,1200+y);
line(700+x,1000+y,800+x,1000+y);line(700+x,1000+y,700+x,1400+y);
line(800+x,1100+y,900+x,1100+y);line(1000+x,1100+y,1200+x,1100+y);
line(1100+x,1000+y,1100+x,1100+y);line(600+x,1200+y,1100+x,1200+y);
line(500+x,1000+y,500+x,1200+y);line(400+x,1100+y,400+x,1300+y);
line(400+x,1200+y,500+x,1200+y);line(500+x,1100+y,600+x,1100+y);
line(100+x,1200+y,200+x,1200+y);line(200+x,1200+y,200+x,1300+y);
line(100+x,1300+y,200+x,1300+y);line(300+x,1300+y,600+x,1300+y);
line(800+x,1300+y,1200+x,1300+y);line(x,1400+y,200+x,1400+y);
line(100+x,1500+y,400+x,1500+y);line(300+x,1300+y,300+x,1500+y);
line(400+x,1400+y,500+x,1400+y);line(500+x,1400+y,500+x,1600+y);
line(600+x,1400+y,800+x,1400+y);line(600+x,1400+y,600+x,1500+y);
line(800+x,1400+y,800+x,1500+y);line(1000+x,1400+y,1000+x,1500+y);
line(900+x,1300+y,900+x,1400+y);line(900+x,1400+y,1100+x,1400+y);
line(700+x,1500+y,700+x,1600+y);line(900+x,1500+y,900+x,1600+y);
line(1000+x,1500+y,1100+x,1500+y);line(600+x,500+y,600+x,600+y);
line(600+x,700+y,600+x,800+y); {trac‚ du labyrinthe}
setcolor(15); {choix de la couleur blanche pour les instructions suivantes}
outtextxy(750+x,1450+y,'D‚part');
outtextxy(1150+x,150+y,'ARRIVEE');
{affichage du texte aux coordonn‚es sp‚cifi‚es}
end;

procedure initpion;  {cr‚ation du curseur}
begin
Size := ImageSize(0, 50,50 , 0); {d‚termination de la taille de l'image}
GetMem(P, Size);  {cr‚ation du pointeur}
settextstyle(gothicfont,horizdir,7);
{s‚lection d'un type de fonte, de l'orientation des caractŠres et de la taille}
setcolor(1); {s‚lection d'une couleur d'affichage}
outtextxy(0,-20,'E'); {affichage de la lettre "E" aux coordonn‚es: (0,-20)}
setcolor(4);
outtextxy(1,-18,'E');
GetImage(1, 1, 50, 50, P^); {l'image est li‚e au pointeur}
cleardevice; {efface l'‚cran graphique}
end;

procedure aide; {proc‚dure d'aide}
begin
setfillstyle(1,0);
{choix d'un type de remplissage et d'une couleur de remplissage}
bar(0,0,640,480);
{dessine un rectangle avec les attributs de remplissage et de couleur
d‚finis plus haut}
setcolor(4); {choix de la couleur rouge}
rectangle(10,10,630,470); {trace un rectangle}
settextjustify(centertext,centertext);
{s‚lectionne un alignement centr‚e pour le texte}
setcolor(14);
settextstyle(defaultfont,horizdir,1); {choix de la fonte}
outtextxy(succ(getmaxx) div 2,50,'Aide de "LABYRINTHE",');
{affiche du texte au milieu de l'axe des X et … 50 pixels sur les Y}
outtextxy(succ(getmaxx) div 2,70,'un jeu cr‚e par Hugo ETIEVANT sur TurboPascal 7.0');
setcolor(9);
outtextxy(succ(getmaxx) div 2,140,'Ce jeu est constitu‚ d''un plan en 2D repr‚sentant un');
outtextxy(succ(getmaxx) div 2,160,'labyrinthe ainsi que de la lettre "E" gothique en guise de h‚ros.');
outtextxy(succ(getmaxx) div 2,200,'Le but du jeu est de partir de "D‚part" pour terminer … "ARRIVEE"');
outtextxy(succ(getmaxx) div 2,240,'Pour cela, vous devez vous d‚placer en utilisant les');
outtextxy(succ(getmaxx) div 2,260,'les flˆches haut/bas/gauche/droite de votre clavier.');
setcolor(13);
outtextxy(succ(getmaxx) div 2,360,'BONNE CHANCE');
settextstyle(smallfont,horizdir,4);
setcolor(8);
outtextxy(succ(getmaxx) div 2,430,'Appuyez sur [ESC] pour quitter,');
outtextxy(succ(getmaxx) div 2,440,'appuyez sur une autre touche pour continuer,');
outtextxy(succ(getmaxx) div 2,450,'appuyez sur ''a'' pour revenir … l''aide . . .');
repeat  {boucle jusqu'… qu'une touche soit press‚e, ‚quivalent de "READLN;"}
until keypressed;
end;

procedure debut; {proc‚dure qui affiche le titre}
begin
settextstyle(gothicfont,horizdir,15);
settextjustify(centertext,centertext);
setcolor(4);
outtextxy(320,200,'Labyrinthe');
setcolor(14);
outtextxy(325,195,'Labyrinthe');
delay(2000); {pause de 2 secondes}
end;

procedure gagne; {proc‚dure GAGNE}
procedure azerty; {sous-proc‚dure AZERTY ‚l‚ment de GAGNE}
begin
setfillstyle(4,1); bar(0,0,640,480);
setfillstyle(5,4); bar(50,50,590,430);
setfillstyle(1,0); bar(60,60,580,420);
setcolor(14);
rectangle(0,0,639,479);
rectangle(50,50,590,430);
rectangle(60,60,580,420);
settextstyle(triplexfont,horizdir,4);
outtextxy(succ(getmaxx) div 2,100,'Bravo !');
outtextxy(succ(getmaxx) div 2,200,'Je suis fier de vous . . .');
outtextxy(succ(getmaxx) div 2,300,'Au revoir .');
delay(3000);
az:=1;
end;
begin
z:=0;
if a=1150+x then z:=z+1;
if b=150+y then z:=z+1;
if z=2 then azerty;
end;

procedure pixel;  {proc‚dure de v‚rification des coodonn‚es du curseur}
begin
pix:=getpixel(a-50,b);
{la fonction "GETPIXEL(X,Y)" renvoie la couleur du pixel de coodonn‚es (X,Y)}
pix2:=getpixel(a,b-50);
pix3:=getpixel(a+50,b);
pix4:=getpixel(a,b+50);
if (key=chr(72)) and (pix2=14) then key:=chr(200);
if (key=chr(80)) and (pix4=14) then key:=chr(200);
if (key=chr(75)) and (pix=14) then key:=chr(200);
if (key=chr(77)) and (pix3=14) then key:=chr(200);
end;

procedure mur; {proc‚dure lorsqu'un mur est percut‚}
begin
for i:=1 to 10 do {boucle finie}
    begin
    sound(200); {fait du son … la fr‚quence 200 Hz}
    delay(50); {pause de 50 ms}
    nosound;  {stoppe le son}
    end;
end;

BEGIN {programme principale}
graphinit; {appel de la proc‚dure d'initialisation du mode graphique}
initpion;  {appel de la proc‚dure de cr‚ation du curseur}
debut;  {appel du titre}
aide;  {affiche l'aide}
{-----------------
Initialisation de quelques variables : }
y:=-1150;
x:=-425;
a:=325;
b:=300;
{-----------------}
repeat {boucle conditionnelle}
laby; {trace le labyrinthe}
PutImage(a-16, b-16, P^, NormalPut); {affiche le curseur grƒce au pointeur}
gagne; {appel de la proc‚dure de v‚rification d'arriv‚e}
key:=readkey; {lit une ouche au clavier}
pixel; {appel de la proc‚dure qui v‚rifie qu'un mur ne sera pas travers‚}
case key of {bloc conditionnel qui teste la variable "KEY"}
 chr(72):y:=y+100;
 chr(80):y:=y-100;
 chr(75):x:=x+100;
 chr(77):x:=x-100;
 'a':aide;
 chr(200):mur;
end;
if az=1 then key:=chr(27); {si arriv‚e alors stop}
until key=chr(27); {si touche ESC press‚e, alors stop}
closegraph;  {efface le contenu de l'‚cran graphique}
END. {fin du programme principale}
