Uses Graph,Crt; Const m = 18; n = 18; Left = #75; Right = #77; Space = #32; Mouses = 10; Type MouseData=Record x,y: Integer; Visible: Boolean; End; Data=Array[1..m,1..n] Of Integer; Var Mouse: ^Data; Mas: Array[1..Mouses] Of ^MouseData; p,k: Pointer; GD,GM,Size: Integer; x0,y0,x1,y1,r: Integer; t: Real; Procedure ReadMouseData(Path: String); Var FT: File Of Data; Begin Assign(FT,Path); ReSet(FT); New(Mouse); Read(FT,Mouse^); Close(FT); End; Procedure GetImageData; Var i,j: Integer; Begin For i:=1 To m Do For j:=1 To n Do PutPixel(j,i,Mouse^[i,j]); Size:=ImageSize(0,0,m,n); GetMem(p,Size); GetImage(0,0,m,n,p^); ClearDevice; For i:=1 To m Do For j:=1 To n Do If Mouse^[i,j]>0 Then PutPixel(j,i,Red); Size:=ImageSize(0,0,m,n); GetMem(k,Size); GetImage(0,0,m,n,k^); ClearDevice; End; Function RandCoord(Coord: Char): Integer; Var z,i: Integer; Flag: Boolean; Begin If Coord='x' Then {m} Begin Repeat Flag:=True; z:=Random(640); For i:=1 To Mouses Do If (ABS(z-Mas[i]^.x))<20 Then Begin Flag:=False; Break End; Until (z<622) AND Flag AND ((z<280) Or (z>360)); End; If Coord='y' Then {n} Begin Repeat Flag:=True; z:=Random(480); For i:=1 To Mouses Do If (ABS(z-Mas[i]^.y))<20 Then Begin Flag:=False; Break End; Until (z<462) AND Flag AND ((z<200) Or (z>280)); End; RandCoord:=z; End; Function Angle(x,y: Real): Real; Var Theta: Real; Begin If (x=0.0) AND (y=0.0) Then Angle:=-1.0 Else If x=0.0 Then Begin If y>0 Then Angle:=0.5*Pi Else Angle:=1.5*Pi; End Else Begin Theta:=ArcTan(y/x); If x>0.0 Then Begin If y>0.0 Then Angle:=Theta Else Angle:=2*Pi+Theta; End Else Angle:=Pi+Theta; End; End; Procedure InitHunter; Begin x0:=320; y0:=240; r:=20; x1:=r+x0; y1:=y0; t:=0; End; Procedure InitMouses; Var i: Integer; Begin For i:=1 To Mouses Do Begin New(Mas[i]); Mas[i]^.x:=RandCoord('x'); Mas[i]^.y:=RandCoord('y'); Mas[i]^.Visible:=False; End; End; Procedure MouseVis(Var MTV: MouseData;Kill: Boolean); Var i,j,x,y,xT,yT: Integer; Begin If Not Kill Then PutImage(MTV.x,MTV.y,p^,XORPut) Else Begin PutImage(MTV.x,MTV.y,k^,XORPut); Delay(5000); PutImage(MTV.x,MTV.y,k^,XORPut); End; MTV.Visible:=Not MTV.Visible; If Not MTV.Visible Then Begin MTV.x:=RandCoord('x'); MTV.y:=RandCoord('y'); End; End; Procedure DrawHunter(KC: Char); Begin Case KC Of Left: t:=t-0.1; Right: t:=t+0.1; End; If (t>=2*Pi) Or (t<=-2*Pi) Then t:=0; SetColor(Black); Line(x0, y0, x1, y1); x1:=Round(r*cos(t))+x0; y1:=Round(r*sin(t))+y0; SetColor(Red); Line(x0,y0,x1,y1); SetColor(Blue); SetFillStyle(1,Blue); PieSlice(320,240,0,360,10); SetColor(Red); SetFillStyle(1,Red); PieSlice(320,240,0,360,6); End; Function Shot(xH,yH: Real): Boolean; Var xM,yM,HunterAngle,MouseAngle: Real; i: Integer; Flag: Boolean; St: String; Begin HunterAngle:=Angle(xH-320,240-yH); SetColor(Black); OutTextXY(10,460,St); SetColor(Red); Str(HunterAngle,St); OutTextXY(10,460,St); For i:=1 To Mouses Do Begin MouseAngle:=Angle(Mas[i]^.x-320,240-Mas[i]^.y); If HunterAngle=MouseAngle Then Begin Flag:=True; Break; End; End; If Flag Then Begin MouseVis(Mas[i]^,True); Shot:=True; End Else Shot:=False; End; Procedure WriteCrt; Var i,j: Integer; Begin RestoreCrtMode; For i:=1 To m Do Begin For j:=1 To n Do Begin Write(Mouse^[i,j]); End; WriteLn; End; ReadLn End; Procedure Main; Var Tm: Real; i,Count: Integer; c: Char; Begin Tm:=0; Count:=0; Repeat Tm:=Tm+1; c:=#0; While KeyPressed Do c:=ReadKey; If (c=Left) Or (c=Right) Then DrawHunter(c); If c=Space Then If Shot(x1,y1) Then Count:=Count+1; If Tm=500000 Then Begin Repeat i:=Random(Mouses) Until i>0; MouseVis(Mas[i]^,False); Tm:=0; End; Until c=#27; RestoreCrtMode; WriteLn(Count); ReadLn; FreeMem(p,Size); End; Begin GD:=Detect; InitGraph(GD,GM,''); Randomize; ReadMouseData('Mouse.DAT'); GetImageData; InitHunter; DrawHunter(Left); InitMouses; Main; End.