Bonjour à tous,
Je réalise un jeu de la vie de wolfram en pascal (http://fr.wikipedia.org/wiki/Automate_cellulaire
et donc j'ai une erreure que je n'arrive pas à corriger aux alentours de la ligne 129 dans la fonction "calculedesgenerations"...
Si qq1 peut m'aider merci d'avance !

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
 
 
program test; 
uses crt; 
 
 
Const 
    NLIGNES      = 1; //nombre de lignes du jeu 
    NCOLONNES    = 120; //nombre de colonnes du jeu 
    CHAR_VIVANTE = '#'; //caractere a afficher pour une cellule vivante 
    CHAR_MORTE = '_'; //caractere a afficher pour une cellule morte 
    valeurExterieurGauche=FALSE; 
    valeurExterieurDroite=FALSE; 
 
 
Type 
 
        tTerrain = array [1..NCOLONNES] of boolean; 
    //le terrain du jeu de la vie, un tableau a une dimensions 
 
    tRegle = array [0..7] of boolean; 
    //une regle (de naissance ou de survie) du jeu 
 
 
Var 
    i,j:integer; 
    un, un_1: tTerrain; 
    choixUtilisateur : integer ; //le choix de l'utilisateur dans le menu 
 
//pour rentrer la regle 
 
function rentrerregle  : tRegle; 
var t : tRegle; 
var rep: integer ; 
 
begin 
 
  writeln('taper votre chiffre (1..256)'); 
  readln(rep); 
 
          for i:=0 to 7 do 
        if (((rep-1) SHR i) mod 2)=1 then 
                t[i]:=true 
        else     
            t[i]:=false; 
 
            rentrerregle:=t; 
end; 
 
        //affiche une case du jeu de la vie 
procedure afficherCase(const b  :boolean); 
begin 
    if b then 
        write(CHAR_VIVANTE) 
    else 
        write(CHAR_MORTE); 
end;      
 
//retourne un booleen au hasard 
function booleenHasard : boolean; 
begin 
    if (random(2)=0) then 
        booleenHasard:=false 
    else 
        booleenHasard:=true; 
end; 
 
 
//rempli un terrain au hasard 
function terrainHasard : tTerrain; 
var rVal: tTerrain; 
begin 
    randomize; 
    for i:=1 to NLIGNES do 
        for j:=1 to NCOLONNES do 
            rVal[j]:= booleenHasard; 
 
    terrainHasard:=rVal; 
end;      
 
procedure afficherTerrain(const  t : tTerrain); 
var j : integer; 
begin 
 
        for j:=1 to NCOLONNES do 
            afficherCase(t[j]); 
        writeln; 
 
end; 
 
//fonction etat suivant 
function etatSuivant(precedente,courant,suivante:boolean) :    boolean; 
 
var cas:integer; 
var regle:tRegle;         
begin 
for j := 1 to NCOLONNES do 
        regle[j]:=False; 
    cas:=0; 
 
    if(precedente) then 
              cas := cas+4; 
    if(courant) then 
              cas := cas+2; 
    if(suivante) then 
              cas := cas+1; 
 
    etatSuivant :=regle[cas]; 
 
 
end; 
 
 
//fonction qui compte les voisins 
function quelvoisin (const generationCourante : tTerrain):tTerrain ; 
 
var generationSuivante:tTerrain; 
var m : integer; 
 
begin 
          generationSuivante[1]:=etatSuivant(valeurExterieurGauche,generationCourante[1],generationCourante[2]); 
 
          for m:=2 to Ncolonnes-1 do 
          generationSuivante[m]:=etatSuivant(generationCourante[m-1],generationCourante[m],generationCourante[m+1]); 
 
          generationSuivante[Ncolonnes]:=etatSuivant(generationCourante[Ncolonnes-1],generationCourante[Ncolonnes],valeurExterieurDroite); 
  quelvoisin:=generationSuivante; 
 
end; 
 
 procedure calculdesgenerations;
var i,j:integer;
var regle:tRegle;
 
begin
     for j := 1 to NLIGNES do
     begin
          afficherTerrain(un);
          for i := 1 to NColonnes do
              un_1[i]:=regle[quelvoisin[i]];
 
          un:=un_1;
     end;
     readln;
end;
 
// rentrer un motif manuellement 
procedure Terrainmanuel(var t : tTerrain); 
var c : char; 
var pos : byte; 
begin 
    pos := 0; 
    repeat 
        ClrScr; 
        afficherTerrain(t); 
        Writeln('Appuyer sur ''q'' pour terminer.'); 
        gotoXY(pos,1);         
        c := readkey; 
         case c of 
            'K' : if (pos>1) then 
                    pos := pos-1; 
            'M' : if (pos<120) then 
                    pos := pos+1; 
            ' ' : t[pos] := not(t[pos]);             
        end; 
        gotoXY(pos,1);     
    until ((c='Q') OR  (c='q'))     
end; 
 
 
//Menu 
 
 
function afficherMenu : integer; 
var rVal : integer; 
begin 
    ClrScr; 
    writeln('0 : Saisir un motif de depart'); 
    writeln('1 : Generer un motif de depart aleatoire'); 
    writeln('2 : choix de la regle'); 
    writeln('3 : Lancer le jeu de la vie'); 
    //writeln('4 : choix du nombre de generations'); 
    writeln('5 : Quitte le jeu'); 
    readln(rVal); 
 
    afficherMenu:=rVal; 
end; 
 
procedure effectuerMenu(const i : integer); 
begin 
     case i of 
        0 :     Terrainmanuel(un); 
        1 :      Un := terrainHasard; 
        2 :    rentrerregle; 
        3 :    calculdesgenerations; 
        {4 :    begin 
                ClrScr; 
                writeln('Nombre maximum de generations : '); 
                readln(generationMaxi); 
            end; 
} 
    end; 
 
end; 
 
//Programme principal 
 
begin 
    //initialisation des variables 
        //generationMaxi := 40; 
        //rep:=30; 
    //repete le menu jusqu'a ce que l utilisateur quitte le jeu 
    repeat 
        choixUtilisateur := afficherMenu; 
        effectuerMenu (choixUtilisateur); 
    until (choixUtilisateur=5) 
 
end.
Si qq1 peut m'aider merci d'avance !

tom
+