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
- rabbit.adb
- a főprogram
- protscreen.ads
- biztonságos (kölcsönös kizárást biztosító) képernyőkezelés megvalósító
csomag specifikációja
- protscreen.adb
- biztonságos (kölcsönös kizárást biztosító) képernyőkezelés megvalósító
csomag megvalósítása
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)