Nyúl és a Vadász

Feladat:

A Vadász a mező szélén áll és onnan lő a Nyulra, aki a mezőn keresztül próbálja elérni az erdőt. A Vadász először megnézi, hogy hol van a Nyúl, majd megtölti a puskáját és odalő. Szimuláljuk a fenti folyamatot taszkok és védett objektumok segítségével. A szimuláció addig tartson, amíg a Nyúl el nem éri az erdőt, vagy a Vadász le nem lövi. A program készítsen eseménynaplót a képernyőre.

Megoldó program

A megoldás:

With ProtScreen; Use ProtScreen;
With Ada.Numerics.Discrete_Random;
Procedure Rabbit is
   Subtype Position is Integer range 1..80;
   Subtype JumpRange is Integer range 1..3;
   START_HERE: constant Position := 21;
   LOADING   : constant Duration := 0.1; -- Hunter loading time;
   REST_A_BIT: constant Duration := 0.1;

   Protected Field is
      Function WhereIsTheRabbit return Position;
      Function GameOver return Boolean;
      Procedure ShootIt(P: Position);
      Procedure Jump(P: JumpRange);
      Function IsRabbitAlive return Boolean;
   Private
      RABBIT_POS   : Position:= START_HERE;
      RABBIT_ALIVE : Boolean := True;
   End Field;

   Protected body Field is
      Function WhereIsTheRabbit return Position is
      Begin
         Return RABBIT_POS;
      End;

      Function GameOver return Boolean is
      Begin
         Return not RABBIT_ALIVE or else RABBIT_POS = Position'Last;
      End GameOver;

      Procedure ShootIt(P: Position) is
      Begin
         RABBIT_ALIVE := (RABBIT_POS = Position'Last) or else (RABBIT_POS /= P);
      End;

      Procedure Jump(P: JumpRange) is
      Begin
         If RABBIT_POS < (Position'Last - P) then
            RABBIT_POS := RABBIT_POS + P;
         Else
            RABBIT_POS := Position'Last;
         End if;
      End Jump;

      Function IsRabbitAlive return Boolean is
      Begin
         Return RABBIT_ALIVE;
      End IsRabbitAlive;
   End Field;

   Task Hunter;
   Task Rabbit;

   Task body Hunter is
      P : Position;
   Begin
      While not Field.GameOver loop
         P:=Field.WhereIsTheRabbit;
         Delay LOADING;
         Put_Line("Hunter: I shoot at "&Position'Image(P));
         Field.ShootIt(P);
      End loop;
      If Field.IsRabbitAlive then
         Put_Line("Hunter: That goddamm Rabbit has escaped again..!! %#$%#@%");
      Else
         Put_Line("Hunter: What a Rabbit! We'll party tonight!!!!");
      End if;
   End Hunter;

   Task body Rabbit is
      Package JGen is new Ada.Numerics.Discrete_Random(JumpRange); Use JGen;
   G: Generator;
   Begin
      ReSet(G);
      While not Field.GameOver loop
         Field.Jump(Random(G));
         Put_Line("Rabbit: I'm at "&Position'Image(Field.WhereIsTheRabbit));
         Delay REST_A_BIT;
      End loop;
      If Field.IsRabbitAlive then
         Put_Line("Rabbit: Looser Hunter!!!");
      Else
         Put_Line("Rabbit: oohh noooo!");
      End if;
   End Rabbit;

Begin
   Null;
End Rabbit;


Utoljára módosítva: 2002. december 10.
Készítette: Pécsy Gábor (Pici)