HOME ПРИМЕРЫ THANKS НОВИЧКАМ ДОКИ LINKS JavaScript Mail | |||
| |||
|
Turbo Pascal Examples |
Графика: |
uses Crt; const pause:word=18550; { задержка: меняйте это значение для } { ускорения/замедления игры } MaxBomb=100; { количество бомб } BombCh='ж'; { символ бомбы } AnAt=#78; { цвет анацефала } MaxPoint=12; { Счет: по достижении значения игра заканчивается } PoleW_min=2; PoleW_max=79; { границы поля } PoleH_min=2; PoleH_max=23; Frame:array[1..6] of string[11]= { массив рамок } ('-T¬+++L+-¦-', 'гT¬¦+¦L¦-¦=', 'гT¬¦+¦L¦-¦-', '-T¬¦+¦L¦-¦=', '+++++++++!-', ' '); CurFrame=1; { текущая рамка для оформления поля } type ScrPtr=array[1..25,1..80] of { Экранная память } record ch,at:char; end; var scr:^ScrPtr; WinSt:string[30]; { победная строка } type MoveItem=object { движущийся объект - и игрок, и анацефал } i,j,Point,PosOut:byte; {координаты, схвачено бомб, позиция вывода счета } di,dj:shortint; { направление движения } ch,at:char; { символ и атрибут движущегося объекта } sc_ch,sc_at:char;{ символ и атрибут экрана для восстановления из-под символа } Procedure Show; { показать объект } Procedure Hide; { спрятать объект } Procedure TurnLeft; { повернуть налево } Procedure TurnRight; { повернуть направо } Procedure DoStep; { сделать шаг в заданном направлении } end; Procedure MoveItem.Show; begin self.sc_ch:=scr^[j,i].ch; self.sc_at:=scr^[j,i].at; scr^[j,i].ch:=self.ch; scr^[j,i].at:=self.at; end; Procedure MoveItem.Hide; begin scr^[j,i].ch:=self.sc_ch; scr^[j,i].at:=self.sc_at; end; Procedure MoveItem.TurnLeft; var t:shortint; begin t:=di; di:=dj; dj:=-t; { turn left } end; Procedure MoveItem.TurnRight; var t:shortint; begin t:=di; di:=-dj; dj:=t; { turn right } end; Procedure MoveItem.DoStep; begin inc(i,di); { проверка вылета за границы поля } if (i>PoleW_max) then i:=PoleW_min; if (i<PoleW_min) then i:=PoleW_max; inc(j,dj); if (j>PoleH_max) then j:=PoleH_min; if (j<PoleH_min) then j:=PoleH_max; if (scr^[j,i].ch='\') then { проверка на поворот } if di=0 then TurnLeft else TurnRight; if (scr^[j,i].ch='/') then if dj=0 then TurnLeft else TurnRight; { не нарвались ли на бомбу? } if (scr^[j,i].ch=BombCh) then begin { нарвались... } inc(Point); GoToXY(PosOut,25);write(Point:3); scr^[j,i].ch:=' '; if (Point+1>MaxPoint) then if (at=AnAt) { смотрим кто нарвался } then WinSt:='CONGRATULSTIONS! YOU WIN!' else WinSt:=' SORRY, BUT YOU LOST!'; if at=AnAt then { если анацефал, то поворот на 180 } begin di:=-di; dj:=-dj; end; end; end; var p:^byte; ch:char; i,j:byte; di,dj,t:shortint; An,Pl:MoveItem; Procedure ShowCh(i,j:byte;ch:char); begin scr^[j,i].ch:=ch; {scr^[j,i].at:=#7;} end; Procedure InitField; var i,j,k:byte; begin Randomize; TextAttr:=16*6; clrscr; { цвет поля } { Распределение бомб по полю } for k:=1 to MaxBomb do begin repeat i:=PoleW_min+Random(PoleW_max-PoleW_min+1); j:=PoleH_min+Random(PoleH_max-PoleH_min+1); until (scr^[j,i].ch<>BombCh) and (i<>An.i); scr^[j,i].ch:=BombCh; end; { Построение рамки вокруг поля } for i:=PoleW_min to PoleW_max do begin scr^[PoleH_max+1,i].ch:=Frame[CurFrame,11]; scr^[PoleH_min-1,i].ch:=Frame[CurFrame,11]; end; for j:=PoleH_min to PoleH_max do begin scr^[j,PoleW_max+1].ch:=Frame[CurFrame,10]; scr^[j,PoleW_min-1].ch:=Frame[CurFrame,10]; end; scr^[PoleH_max+1,PoleW_max+1].ch:=Frame[CurFrame,9]; scr^[PoleH_min-1,PoleW_max+1].ch:=Frame[CurFrame,3]; scr^[PoleH_max+1,PoleW_min-1].ch:=Frame[CurFrame,7]; scr^[PoleH_min-1,PoleW_min-1].ch:=Frame[CurFrame,1]; j:=16*7+1; { Формирование статусной строки-подсказки } for i:=1 to 80 do scr^[25,i].at:=chr(j); TextAttr:=j; gotoXY(Pl.PosOut-5,25); write('You: 0'); scr^[25,Pl.PosOut-7].at:=Pl.at; gotoXY(An.PosOut-5,25); write('An: 0'); scr^[25,An.PosOut-7].at:=An.at; end; begin p:=Ptr($40, $49); { Адрес байта, хранящего текущую моду (режим экрана) } if p^=7 then Scr:=Ptr($b000,0) else Scr:=Ptr($b800,0); ch:=' '; WinSt:=''; with an do { Инициализация анацефала } begin i:=39; di:=0; Point:=0; PosOut:=65; j:=1; dj:=1; ch:=' '; at:=AnAt; end; with Pl do { Инициализация игрока } begin i:=1; di:=1; Point:=0; PosOut:=15; j:=10; dj:=0; ch:=' '; at:=#16; end; InitField; GotoXY(28,25); Write('Use ''z'' and ''x'' keys'); repeat if KeyPressed then begin ch:=Readkey; if ch=#0 then begin ch:=Readkey; end; case ch of 'z': with Pl do begin if di=0 then TurnLeft else TurnRight; ShowCh(i,j,'\'); { ниже код для более простого варианта игры, когда поворот не зависит от направления движения: z - налево, х - направо } { TurnLeft; if di=0 then ShowCh(i,j,'/') else ShowCh(i,j,'\');} end; 'x': with Pl do begin if dj=0 then TurnLeft else TurnRight; ShowCh(i,j,'/'); { ниже код для более простого варианта игры, когда поворот не зависит от направления движения: z - налево, х - направо } { TurnRight; if dj=0 then ShowCh(i,j,'/') else ShowCh(i,j,'\');} end; end end; Pl.DoStep; Pl.Show; an.DoStep; an.Show; Delay(pause); an.hide; Pl.hide; until (ch=#27) or (WinSt<>''); Pl.Show; an.Show; GotoXY(28,25); Write(WinSt); end.             |
HOME |