uses crt,graph;
type Tzmey=array[0..5040] of integer;
const
        left=#75;
          up=#72;
         esc=#27;
        right=#77;
         down=#80;
         enter=#13;
         n=56;
         m=90;
var pole:array[0..n,0..m] of integer;
izk,jzk,iz,jz:Tzmey;
ch:char;
ochki,dx,dy,nx,ny,gd,gm:integer;


procedure SOZDzmey;
    var i:integer;

 begin
    for i:=0 to 15 do
      if i<=3 then
        begin
         iz[i]:=4;
         jz[i]:=8+i;
        end
      else
        begin
        iz[i]:=0;
        jz[i]:=0;
        end;
 end;
//end;

procedure SOZD_pole;
     var k,i,j:integer;

 begin
   for i:=0 to n do
   for j:=0 to m do
     if (j=0) or (i=n) or (j=m) or (i=0) then
     pole[i,j]:=-1
     else
       pole[i,j]:=0;
     k:=0;
     repeat
       i:=random (n-2)+1;
       j:=random (m-2)+1;
         if (pole [i,j]=0) and (i<>4) and (abs(pole[i-1,j])<>1)
         and (abs(pole[i+1,j])<>1) and (abs(pole[i,j-1])<>1) and
         (abs(pole[i,j+1])<>1)
          then
         begin pole[i,j]:=1;
         k:=k+1;
         end;
     until k=11;
  end;

procedure RISzmey;
    var i,x,y:integer;
   begin
      setfillstyle(1,12);
   for i:=0 to 15 do
       if (iz[i]>0) and (jz[i]>0) then
       begin
       x:=nx+jz[i]*dx;
       y:=ny+iz[i]*dy;
       bar(x,y,x+dx,y+dy);
       end;
   end;

procedure RISpole;
    var i,j:integer;
    x,y:integer;
  begin
  for i:=0 to n do
  for j:=0 to m do
  begin
  x:=j*dx+nx; y:=i*dy+ny;
      case pole[i,j] of
      0: begin
         setcolor(1);
         setfillstyle(1,0);
         bar (x,y,x+dx,y+dy);
         rectangle(x,y,x+dx,y+dy);
         end;
    -1: begin
        setfillstyle(1,white);
        bar(x,y,x+dx,y+dy);
        end;
     1: begin
        setfillstyle(1,14);
        bar(x,y,x+dx,y+dy);
        end;
        end; //
  end;
end;

Procedure zastavka;
    Var c,n:integer;
  begin
  cleardevice;
  setcolor(2);
  setfillstyle(1,2);
  bar(0,0,getmaxx,getmaxy);
     repeat
     c:=random(15)+1;
     n:=random(500)+500;
     sound(n);
     setcolor(c);
     settextstyle(0,0,3);
     outtextxy(250,10,'zmeyka');
   //outtextxy(250,40,'');
     settextstyle(0,0,2);
     outtextxy(100,100,'Autor Kirin Dmitry Sergeevich 903c3');
     outtextxy(100,150,'Teacher Ukhnova');
     outtextxy(250,300,'Goodlike!');
     outtextxy(250,350,'Prees any key');
     delay(500);
     nosound;
     until keypressed;
     while keypressed do ch:=readkey;
     cleardevice;
   end;

procedure help;
   var
   f:text;
   s:string;
   y:integer;
     begin
     assign(f,'help.pas');
     reset(f);
     setcolor(15);
     settextstyle(0,0,1);
     y:=20;
     cleardevice;
     while not(eof(f)) do
     begin
          readln(f,s);
          outtextxy(50,y,s);
          y:=y+20;
     end;
     close(f);
     readkey;
     cleardevice;
//end;

     end;
{ procedure menu;
 var np,pk:integer;
 begin
      cleardevice;
      setcolor(12);
      settextstyle(0,0,3);
      outtextxy(250,40,'MENU');
      outtextxy(50,200,'game');
      outtextxy(50,240,'help');
      outtextxy(50,280,'exit');
      setcolor(14);
      settextstyle(0,0,2);
      outtextxy(150,400,'viberite nuzniy punkt i nazmite enter');
      np:=1;
      putimage(400,200+(np-1)*40,pk^,1);
      repeat
            ch:=readkey;
            if ch=#0 then
                     begin
                     ch:=readkey;
                     putimage(400,200+(np-1)*40,pk^,1);
                     case ch of
                     up:if np>1 then np:=np-1;
                     down:if np<3 then np:=np+1;
                     end;
                     putimage(400,200+(np-1)*40,pk^,1);
                     end;
      until ch=enter;
      case np of
     // 1:game;
      2:help;
      3:halt;
      end;
       cleardevice;
 end;}

procedure schet;
    var xw,yw,n:integer;
    var s:string;
 begin
 setfillstyle(1,1);
 bar(xw,yw,xw+40,yw+20);
 setcolor(14);
 settextstyle(0,0,1);
 str(n,s);
 outtextxy(xw+5,yw+5,s);
 end;

procedure DVIGzmey;

   var i,kz,hi,hj,x,y:integer;
       stop:boolean;

procedure POVOROTzmey;
   begin
   ch:=readkey;
   if ch=#0 then ch:=readkey;
//begin

        case ch of
        left:if hj=0 then begin hi:=0; hj:=-1; end;
        right:if hj=0 then begin hi:=0; hj:=1; end;
        up:if hj=0 then begin hi:=-1; hj:=0; end;
        down: if hj=0 then begin hi:=1; hj:=0; end;
        end;
  // end;
    end;
        begin
        hi:=0; hj:=-1;
        kz:=3;
        stop:=false;
    repeat
        setfillstyle(1,0);
        x:=nx+jz[kz]*dx;
        y:=ny+iz[kz]*dy;
        bar(x,y,x+dx,y+dy);
        setcolor(1);
        rectangle(x,y,x+dx,y+dy);
        izk:=iz;
        jzk:=jz;
  for i:=1 to kz do
  begin
  iz[i]:=izk[i-1];
  jz[i]:=jzk[i-1];
  end;
        if keypressed then POVOROTzmey;
        iz[0]:=iz[0]+hi;
        jz[0]:=jz[0]+hj;
        setfillstyle(1,12);
        x:=nx+jz[0]*dx;
        y:=ny+jz[0]*dy;
        bar(x,y,x+dx,y+dy);
        if pole[iz[0],jz[0]]=1 then
        begin
        kz:=kz+1;
       {ochki:=ochki+10;
        schet(500,10,ochki);}
        end;
        for i:=1 to 14 do
        if(iz[i]=iz[0]) and (jz[i]=jz[0]) then stop:=true;
        delay(30000);
        until (pole[iz[0],jz[0]]=-1) or (ch=esc) or stop or (kz=14);
   end;
    begin
    gd:=detect;
    initgraph(gd,gm,'');
    randomize;
  //ochki:=0;
    dx:=15; dy:=15; nx:=20; ny:=0;

zastavka;
//menu;
SOZD_pole;
SOZDzmey;
RISpole;
RISzmey;
readkey;
DVIGzmey;
readln;
closegraph;
End.


body_zmey:array[1..2,1..5040]of integer;