program snake;{énième clone du célèbre jeux}

uses crt;{bibliothèque graphique}

var
   key		 : char;{touche utilisateur}
   move		 : char;{déplacement du serpent}
   snake_hauteur : array[1..500] of integer;{position du serpent et son corps en hauteur}
   snake_largeur : array[1..500] of integer;{position du serpent et son corps en largeur}
   taille	 : integer;{taille du serpent}
   position	 : array[1..20] of string;
   hauteur	 : integer;{hauteur ou se situe le serpent}
   largeur	 : integer;{largeur ou se situe le serpent}
   i		 : integer;{pour certaines boucles}
   i_taille	 : integer;{pour la boucle sur sauve_taille}
   loose	 : boolean;{quitte la partie lors d'un échec}
   cpt		 : integer;{compteur pour une meilleur ergonomie}
   beginning : integer;{indique lorsque l'utilisateur à effectué un certain nombre de cycle pour éviter les collisions entre la tête et le corps}
   pomme_l	 : integer;{largeur de la position des pomme}
   pomme_h	 : integer;{hauteur de la position des pomme}
   
	      
procedure affichage;{lancé au début, permet de définir le terrain de jeux}
begin
   clrscr;
   TextBackground(red);
   GotoXY(1,2);write('+--------------------------------------------------------------------+');
   GotoXY(1,3);write('|                                                                    |');
   GotoXY(1,4);writeln('|                                                                    |');
   GotoXY(1,5);writeln('|                                                                    |');
   GotoXY(1,6);writeln('|                                                                    |');
   GotoXY(1,7);writeln('|                                                                    |');
   GotoXY(1,8);writeln('|                                                                    |');
   GotoXY(1,9);writeln('|                                                                    |');
   GotoXY(1,10);writeln('|                                                                    |');
   GotoXY(1,11);writeln('|                                                                    |');
   GotoXY(1,12);writeln('|                                                                    |');
   GotoXY(1,13);writeln('|                                                                    |');
   GotoXY(1,14);writeln('|                                                                    |');
   GotoXY(1,15);writeln('|                                                                    |');
   GotoXY(1,16);writeln('|                                                                    |');
   GotoXY(1,17);writeln('|                                                                    |');
   GotoXY(1,18);writeln('|                                                                    |');
   GotoXY(1,19);writeln('|                                                                    |');
   GotoXY(1,20);writeln('|                                                                    |');
   GotoXY(1,21);writeln('|                                                                    |');
   GotoXY(1,22);writeln('|                                                                    |');
   GotoXY(1,23);writeln('|                                                                    |');
   GotoXY(1,24);writeln('+--------------------------------------------------------------------+');
   TextBackground(black);
   GotoXY(72,2);writeln('Taille :');
   GotoXY(72,3);writeln('4');
   pomme_l:=12;
   pomme_h:=12;
end; { affichage }

procedure pomme;
begin
   pomme_l:=random(30)+1;
   pomme_h:=random(21)+3;
   pomme_l:=pomme_l*2;
   GotoXY(pomme_l,pomme_h);
   TextColor(green);
   write('x');
   TextColor(black);GotoXY(1,24);
end; { pomme }


begin
   HighVideo;
   hauteur:=5;
   largeur:=6;
   taille:=4;
   key:='d';
   move:='d';
   for i:=1 to 500 do
   begin
      snake_hauteur[i]:=5;
      snake_largeur[i]:=5;
   end;
   affichage;
   TextBackground(red);
   pomme;
   GotoXY(1,24);
   TextColor(black);
   cpt:=0;beginning:=0;
   repeat
      repeat
	 if (key='H') or (key='P') or (key='K') or (key='M') or (key='z') or (key='s') or (key='q') or (key='d') then
	 begin
	    move:=key;
	 end;
	 if cpt=5 then
	 begin
	    case move of
	      'H' : hauteur:=hauteur-1;
	      'P' : hauteur:=hauteur+1;
	      'K' : largeur:=largeur-2;
	      'M' : largeur:=largeur+2;
	      'z' : hauteur:=hauteur-1;
	      's' : hauteur:=hauteur+1;
	      'q' : largeur:=largeur-2;
	      'd' : largeur:=largeur+2;
	    end; { case }
	    
	    {Serpent dépassant le bord du terrain de jeux}
	    if (largeur=1) or (hauteur=2) or (hauteur=24) or (largeur=70)  then
	    begin
	       loose:=true;
	    end;

	    
	    if (largeur=pomme_l) and (hauteur=pomme_h) then
	    begin
	       taille:=taille+1;TextColor(white);TextBackground(black);GotoXY(72,3);writeln(taille);TextColor(black);TextBackground(red);
	       pomme;
	    end;
	    GotoXY(1,20);
	    GotoXY(largeur,hauteur);
	    write('O');
	    if (largeur<>snake_largeur[taille]) or (hauteur<>snake_hauteur[taille]) then
	    begin
	       GotoXY(snake_largeur[taille],snake_hauteur[taille]);
	       write(' ');
	    end;
	    for i:=2 to taille do
	    begin
	       i_taille:=taille-i+2;
	       snake_hauteur[i_taille]:=snake_hauteur[i_taille-1];
	       snake_largeur[i_taille]:=snake_largeur[i_taille-1];
	    end;
	    snake_hauteur[1]:=hauteur;
	    snake_largeur[1]:=largeur;

	    cpt:=0;
	    beginning:=beginning+1;
        key:=' ';
	 end;
	 
	 cpt:=cpt+1;

	 {Serpent se mordant la queue}
	 for i:=3 to taille do
	 begin
	    if  ((hauteur=snake_hauteur[i]) and (largeur=snake_largeur[i]) and (beginning>=3)) then
	    begin
	       loose:=true;
	   end;
	 end;
	 TextBackground(black);
	 GotoXY(1,24);
	 TextBackground(red);
	 delay(20);
      until (keypressed) or (loose);
      key:=readkey;
   until (key='a') or (loose);
   TextBackground(black);clrscr;TextColor(white);NormVideo;
   writeln('                 Game Over.');
   writeln;
   writeln('          Votre score est de : ',taille);
   readln;

end.

