{Labirint} {http://forum.pascal.net.ru/index.php?showtopic=12923&hl=} program labirint; uses crt; var LabX,LabY,CurX,CurY,OldX,OldY,VeryOldX,VeryOldY,lx,ly,flg:integer; Lab:array[1..10,1..10] of char; vopr:string; procedure loadlab; var labstr:array[1..10] of string;tmp:string; x,y:integer; begin LabStr[1]:= '┌────────┐'; LabStr[2]:= '│ * │'; LabStr[3]:= '│ ───┐ │'; LabStr[4]:= '│ │ │'; LabStr[5]:= '├── ─│ │'; LabStr[6]:= '│ │ │'; LabStr[7]:= '├─┐ └───│'; LabStr[8]:= '│ │ │'; LabStr[9]:= ' │ │'; LabStr[10]:='└─────┴──┘'; for y:=1 to 10 do begin tmp:=LabStr[y]; for x:=1 to 10 do begin if tmp[x]='*' then begin lx:=x; ly:=y; Lab[x,y]:=' '; end; if tmp[x]<>'*' then Lab[x,y]:=tmp[x]; end; end; end; procedure move(dx,dy:integer); begin if Lab[CurX+dx,CurY+dy]=' ' then begin GoToXY(1,1); WriteLn(CurX,' ',CurY); { Подтираем хвост :) } gotoxy(VeryOldX+LabX,VeryOldY+LabY); writeln(' '); Lab[VeryOldX,VeryOldY]:=' '; VeryOldX:=OldX; VeryOldY:=OldY; OldX:=CurX; OldY:=CurY; CurX:=CurX+dx; CurY:=CurY+dy; { Убрана проверка Old-координат } gotoxy(OldX+LabX,OldY+LabY); textcolor(4); writeln('*'); Lab[OldX,OldY]:='*'; { обзначаем тело змеи в лабиринте } gotoxy(LabX+CurX,LabY+CurY); textcolor(12); writeln('*'); end end; procedure DrawLab; var x,y:integer; begin LoadLab; { вставлено для подчистки тела змеи } clrscr; textcolor(14); { Убрана инициализация старых координат OldX:=0;OldY:=0; } for x:=1 to 10 do for y:=1 to 10 do begin gotoxy(x+LabX,y+LabY); write(Lab[x,y]); end; move(0,0); end; function CheckMove:integer; var key:char; exitcode,nx,ny:integer; begin exitcode:=0; while exitcode=0 do begin if keypressed then begin; key:=readkey; if key='*' then exitcode:=1; if key='4' then LabX:=LabX-1; if key='6' then LabX:=LabX+1; if key='2' then LabY:=LabY+1; if key='8' then LabY:=LabY-1; if (key='2') or (key='4') or (key='6') or (key='8') then DrawLab; if key=#0 then begin key:=readkey; { Ниже блок опраторов IF заменен на CASE } { проверка на препятствие перенесена в Move } case key of 'H': move(0,-1); 'K': move(-1,0); 'M': move(1,0); 'P': move(0,1); end end; end; if (CurX=1) or (CurX=10) or (CurY=1) or (CurY=10) then exitcode:=2; { проверка на запирание } if (Lab[CurX-1,CurY]<>' ')and(Lab[CurX+1,CurY]<>' ')and(Lab[CurX,CurY-1]<>' ')and(Lab[CurX,CurY+1]<>' ') then ExitCode:=3 end; CheckMove:=ExitCode end; begin LabX:=10;LabY:=10; repeat DrawLab; CurX:=lx;CurY:=ly; OldX:=lx;OldY:=ly; { initialize Old } VeryOldX:=lx;VeryOldY:=ly; { initialize VeryOld } DrawLab; flg:=0; while flg=0 do flg:=CheckMove; textcolor(10); gotoxy(20,1); if flg=1 then write('Game interrupted. '); if flg=2 then write('You win!!! '); if flg=3 then write('You are lost. '); write ('Start again? '); readln(vopr); until (vopr<>'y') and (vopr<>'Y'); end.