1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
-- Corps du paquetage JeuDeLaVie
With Files;
With Ada.Numerics.Discrete_Random;
With Text_IO;
Use Text_IO;
Package body JeuDeLaVie is
Package FilesTerritoire is new Files(Territoire, TNULL);
LimitesGrille:Exception;
Procedure InitialisationManuelle(LeTerritoire: OUT Territoire; LaGrille: IN Tgrille) is
begin
if (LaGrille'Length<2 and LaGrille'Length>Integer'Last) or
(LaGrille'Length(2)<2 and LaGrille'Length(2)>Integer'Last) then
raise LimitesGrille;
end if;
LeTerritoire.GrilleTerritoire:=LaGrille;
LeTerritoire.Generation:=LeTerritoire.Generation+1;
for indiceI in LeTerritoire.GrilleTerritoire'Range loop
for indiceJ in LeTerritoire.GrilleTerritoire'Range(2) loop
if LeTerritoire.GrilleTerritoire(indiceI, indiceJ)=true then
LeTerritoire.Population:=LeTerritoire.Population+1;
end if;
end loop;
end loop;
Exception
when LimitesGrille =>
put_line("Erreur limites grille (les lignes et les colonnes doivent avoir entre 2 et " &
Integer'Image(Integer'Last) & " éléments !!");
end InitialisationManuelle;
Procedure InitialisationAuto(LeTerritoire: OUT Territoire) is
Subtype GrilleRange is Integer range 2..Integer'Last;
Package Grille_Rand is new Ada.Numerics.Discrete_Random(GrilleRange);
Use Grille_Rand;
lignes, colonnes: Integer:=0;
GenerateurA, GenerateurB: Generator;
begin
Reset(GenerateurA);
Reset(GenerateurB);
lignes:=Random(GenerateurA);
colonnes:=Random(GenerateurB);
declare
GrilleTemp: Tgrille(1..lignes, 1..colonnes);
begin
InitialisationManuelle(LeTerritoire, GrilleTemp);
end;
end InitialisationAuto;
Procedure AffichageTerritoire(LeTerritoire: IN Territoire) is
begin
put_line("Generation " & Integer'Image(LeTerritoire.Generation));
for indiceI in LeTerritoire.GrilleTerritoire'Range(2) loop
for indiceJ in LeTerritoire.GrilleTerritoire'Range loop
put(" _");
end loop;
new_line;
for indiceK in LeTerritoire.GrilleTerritoire'Range loop
put("|");
if LeTerritoire.GrilleTerritoire(indiceK, indiceI)=true then
put("X");
else
put(" ");
end if;
end loop;
put("|");
new_line;
end loop;
for indiceL in LeTerritoire.GrilleTerritoire'Range loop
put(" -");
end loop;
new_line;
put_line("La population est de :" & Integer'Image(LeTerritoire.Population) & " habitants.");
put_line("Il y a eu " & Integer'Image(LeTerritoire.Naissances) & " naissances et " &
Integer'Image(LeTerritoire.Deces) & " deces.");
end AffichageTerritoire;
Procedure JeuNGeneration(LeTerritoire: IN OUT Territoire; n: IN Integer;
Laffichage: IN Taffichage:=SansAffichage;
LaTempo: IN Temporisation:=SansTemporisation) is
begin
for indiceGen in 1..n loop
for indiceI in LeTerritoire.GrilleTerritoire'Range loop
for indiceJ in LeTerritoire.GrilleTerritoire'Range(2) loop
LeTerritoire.GrilleTerritoire(indiceI, indiceJ):=F(LeTerritoire.GrilleTerritoire(indiceI, indiceJ));
end loop;
end loop;
InitialisationManuelle(LeTerritoire, LeTerritoire.GrilleTerritoire);
-- Ajouter LeTerritoire a la File
end loop;
if Laffichage=AvecAffichage then
AffichageTerritoire(LeTerritoire);
end if;
ActionTemporisation(LaTempo);
end JeuNGeneration;
Procedure Jeu1Generation(LeTerritoire: IN OUT Territoire) is
begin
JeuNGeneration(LeTerritoire, 1);
end Jeu1Generation;
Procedure Rejeu(LeTerritoire: IN OUT Territoire;
LaTempo: IN Temporisation:=AvecTemporisation) is
begin
ActionTemporisation(LaTempo);
end Rejeu;
Procedure ActionTemporisation(LaTempo: IN Temporisation) is
begin
case LaTempo is
when AvecTemporisation =>
delay 3.0;
when FrappeTouche =>
declare
CharTemp: character;
begin
get(CharTemp);
end;
when others =>
null;
end case;
end ActionTemporisation;
end JeuDeLaVie; |
Partager