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.