Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / examples / jeu / jeu.log
1 PROGRAM ARAIGNEE;\r
2  \r
3 (************************************************************************)\r
4 (**                                                                    **)\r
5 (**                                                                    **)\r
6 (**         ORONOS  Marielle          &        PELAT  Joseph           **)\r
7 (**                                                                    **)\r
8 (**             Jeu de strategie : ARAIGNEE                            **)\r
9 (**                                                                    **)\r
10 (**  Licence Informatique                                              **)\r
11 (**  Groupe 3                                                          **)\r
12 (**                                                                    **)\r
13 (**  Universite de Pau et des Pays de l'Adour            2 Avril 1993  **)\r
14 (**                                                                    **)\r
15 (**                                                                    **)\r
16 (************************************************************************)\r
17  \r
18 Begin\r
19  \r
20 Pref iiuwgraph block; (** Utilisation du graphisme **)\r
21  \r
22  \r
23  \r
24 (************************************************************************)\r
25 (** Structure de donnees utilisee pour representer la table de jeu :   **)\r
26 (**                 un Cube                                            **)\r
27 (************************************************************************)\r
28  \r
29 UNIT cube : CLASS ;\r
30  \r
31 (****************************)\r
32 (** 0 : le point est libre **)\r
33 (** 1 : pion du joueur1    **)\r
34 (** 2 : pion du joueur2    **)\r
35 (****************************)\r
36  \r
37 VAR   cub : arrayof arrayof arrayof integer ,\r
38       i,j   : integer;\r
39 BEGIN\r
40   array cub dim (1:3);\r
41   for i:=1 to 3 do\r
42        array cub(i) dim (1:3) ;\r
43        for j:=1 to 3 do\r
44            array cub(i,j) dim (1:3) ;\r
45        od;\r
46   od;\r
47 END;\r
48  \r
49  \r
50 (************************************************************************)\r
51 (**  Structure de donnees utilisee pour representer un point du cube   **)\r
52 (************************************************************************)\r
53  \r
54 UNIT elt : CLASS ;\r
55 VAR  x,y,z : INTEGER ;\r
56 END elt;\r
57  \r
58  \r
59 (************************************************************************)\r
60 (**  Representation d'une ligne du cube                                **)\r
61 (**  Chaque ligne comporte 3 points                                    **)\r
62 (************************************************************************)\r
63  \r
64 UNIT ligne : CLASS ;\r
65 VAR  pt1,pt2,pt3 : elt ;\r
66 BEGIN\r
67   pt1 := new elt;\r
68   pt2 := new elt;\r
69   pt3 := new elt ;\r
70 END ligne;\r
71  \r
72  \r
73 (*************************************************************************)\r
74 (** Determine la ligne et la colonne d'affichage d'un point du cube a   **)\r
75 (**   l'ecran                                                           **)\r
76 (*************************************************************************)\r
77  \r
78 UNIT AffichPt : Procedure ( pt : elt);\r
79 VAR  lig,col : integer;\r
80  \r
81 BEGIN\r
82    If (pt.x <> 2) AND (pt.y = 2) Then\r
83       col := 230;\r
84    Fi;\r
85    If (pt.y = 1) AND ( pt.z = 1) Then\r
86       col := 142;\r
87    Fi;\r
88    If (pt.y = 1) AND ( pt.z = 2) Then\r
89       col := 100;\r
90    Fi;\r
91    If (pt.y = 1) AND ( pt.z = 3) Then\r
92       col := 60;\r
93    Fi;\r
94    If (pt.y = 3) AND ( pt.z = 1) Then\r
95       col := 315;\r
96    Fi;\r
97    If (pt.y = 3) AND ( pt.z = 2) Then\r
98       col := 359;\r
99    Fi;\r
100    If (pt.y = 3) AND ( pt.z = 3) Then\r
101       col := 400;\r
102    Fi;\r
103    If ( pt.x = 1) AND ( pt.z = 1) Then\r
104       lig := 120;\r
105    Fi;\r
106    If ( pt.x = 1) AND ( pt.z = 2) Then\r
107       lig := 90;\r
108    Fi;\r
109    If ( pt.x = 1) AND ( pt.z = 3) Then\r
110       lig := 60;\r
111    Fi;\r
112    If ( pt.x = 3) AND ( pt.z = 1) Then\r
113       lig := 240;\r
114    Fi;\r
115    If ( pt.x = 3) AND ( pt.z = 2) Then\r
116       lig := 270;\r
117    Fi;\r
118    If ( pt.x = 3) AND ( pt.z = 3) Then\r
119       lig := 300;\r
120    Fi;\r
121    If ( pt.x = 2) AND ( pt.y <> 2) Then\r
122       lig := 180;\r
123    Fi;\r
124    call move ( col , lig);\r
125  \r
126 END AffichPt;\r
127  \r
128 (*************************************************************************)\r
129 (** Affichage du mot INTERDIT s'il y a une mauvaise action              **)\r
130 (*************************************************************************)\r
131  \r
132 UNIT Erreur1 : PROCEDURE;\r
133  \r
134 VAR i : integer ;\r
135  \r
136      BEGIN\r
137         call color(15);\r
138         call move(2,2);\r
139         call HASCII(0);call Hascii (ord('I'));\r
140         call HASCII(0);call Hascii (ord('N'));\r
141         call HASCII(0);call Hascii (ord('T'));\r
142         call HASCII(0);call Hascii (ord('E'));\r
143         call HASCII(0);call Hascii (ord('R'));\r
144         call HASCII(0);call Hascii (ord('D'));\r
145         call HASCII(0);call Hascii (ord('I'));\r
146         call HASCII(0);call Hascii (ord('T'));\r
147         call HASCII(0);call Hascii (ord('!'));\r
148         call HASCII(0);call Hascii (ord('!'));\r
149         call HASCII(0);call Hascii (ord('!'));\r
150  \r
151         call move (2,2);\r
152         tab := GETMAP(300,20);\r
153  \r
154         call move (2,2);\r
155         For i := 1 To 10 Do\r
156             call PUTMAP (tab);\r
157             call move (2,2);\r
158             tab := GETMAP(300,20);\r
159         Od;\r
160         call move (2,2);\r
161         For i := 1 To 11 Do\r
162             call HASCII(0);call Hascii (ord(' '));\r
163         Od;\r
164  \r
165      END Erreur1;\r
166  \r
167 (*************************************************************************)\r
168 (** Procedure pour l'affichage de la table de jeu                       **)\r
169 (*************************************************************************)\r
170  \r
171 UNIT AfficheTable : Procedure ;\r
172      Begin\r
173          call cls;\r
174          call move (60,60); call draw(60,300 ); call draw(400,300);\r
175          call move (60,60); call draw(400,60); call draw(400,300);\r
176  \r
177          call move (100,90); call draw(100,270); call draw(359,270);\r
178          call move (100,90); call draw(359,90); call draw(359,270);\r
179  \r
180          call move (142,120); call draw(142,240); call draw(315,240);\r
181          call move (142,120); call draw(315,120); call draw(315,240);\r
182  \r
183          call move (230,60); call draw(230,120);\r
184          call move (60,180); call draw(142,180);\r
185          call move (315,180); call draw(400,180);\r
186          call move (230,240); call draw(230,300);\r
187  \r
188          call move(60,60)   ; call HASCII(0) ; call HASCII(ord('+'));\r
189          call move(230,60)  ; call HASCII(0) ; call HASCII(ord('+'));\r
190          call move(400,60)  ; call HASCII(0) ; call HASCII(ord('+'));\r
191          call move(400,180) ; call HASCII(0) ; call HASCII(ord('+'));\r
192          call move(400,300) ; call HASCII(0) ; call HASCII(ord('+'));\r
193          call move(230,300) ; call HASCII(0) ; call HASCII(ord('+'));\r
194          call move(60,300)  ; call HASCII(0) ; call HASCII(ord('+'));\r
195          call move(60,180)  ; call HASCII(0) ; call HASCII(ord('+'));\r
196          call move(100,90)  ; call HASCII(0) ; call HASCII(ord('+'));\r
197          call move(100,180) ; call HASCII(0) ; call HASCII(ord('+'));\r
198          call move(100,270) ; call HASCII(0) ; call HASCII(ord('+'));\r
199          call move(142,120) ; call HASCII(0) ; call HASCII(ord('+'));\r
200          call move(142,180) ; call HASCII(0) ; call HASCII(ord('+'));\r
201          call move(142,240) ; call HASCII(0) ; call HASCII(ord('+'));\r
202          call move(230,90)  ; call HASCII(0) ; call HASCII(ord('+'));\r
203          call move(230,120) ; call HASCII(0) ; call HASCII(ord('+'));\r
204          call move(230,240) ; call HASCII(0) ; call HASCII(ord('+'));\r
205          call move(230,270) ; call HASCII(0) ; call HASCII(ord('+'));\r
206          call move(315,120) ; call HASCII(0) ; call HASCII(ord('+'));\r
207          call move(315,180) ; call HASCII(0) ; call HASCII(ord('+'));\r
208          call move(315,240) ; call HASCII(0) ; call HASCII(ord('+'));\r
209          call move(359,270) ; call HASCII(0) ; call HASCII(ord('+'));\r
210          call move(359,180) ; call HASCII(0) ; call HASCII(ord('+'));\r
211          call move(359,90)  ; call HASCII(0) ; call HASCII(ord('+'));\r
212          call move(500,130) ; call HASCII(0) ; call HASCII(ord('A'));\r
213          call HASCII(0) ; call HASCII(ord(' '));\r
214          call HASCII(0) ; call HASCII(ord('R'));\r
215          call HASCII(0) ; call HASCII(ord(' '));\r
216          call HASCII(0) ; call HASCII(ord('A'));\r
217          call HASCII(0) ; call HASCII(ord(' '));\r
218          call HASCII(0) ; call HASCII(ord('I'));\r
219          call HASCII(0) ; call HASCII(ord(' '));\r
220          call HASCII(0) ; call HASCII(ord('G'));\r
221          call HASCII(0) ; call HASCII(ord(' '));\r
222          call HASCII(0) ; call HASCII(ord('N'));\r
223          call HASCII(0) ; call HASCII(ord(' '));\r
224          call HASCII(0) ; call HASCII(ord('E'));\r
225          call HASCII(0) ; call HASCII(ord(' '));\r
226          call HASCII(0) ; call HASCII(ord('E'));\r
227  \r
228 End afficheTable;\r
229  \r
230 (*************************************************************************)\r
231 (** Affichage du joueur courant                                         **)\r
232 (*************************************************************************)\r
233  \r
234 UNIT AfficheJoueur : Procedure (i : integer);\r
235      Begin\r
236          If i = 1 then call color(3) else call color(5) ; fi;\r
237          call move(530,170) ; call HASCII(0) ; call HASCII(ord('J'));\r
238          call HASCII(0) ; call HASCII(ord('o'));\r
239          call HASCII(0) ; call HASCII(ord('u'));\r
240          call HASCII(0) ; call HASCII(ord('e'));\r
241          call HASCII(0) ; call HASCII(ord('u'));\r
242          call HASCII(0) ; call HASCII(ord('r'));\r
243      End AfficheJoueur;\r
244  \r
245  \r
246 (*************************************************************************)\r
247 (** Affichage de la phase courante                                      **)\r
248 (**   - 0 : Placement                                                   **)\r
249 (**   - 1 : Deplacement                                                 **)\r
250 (**   - 2 : Deplacement de moins de 3 pions                             **)\r
251 (**   - 3 : Manger                                                      **)\r
252 (*************************************************************************)\r
253  \r
254 UNIT AffichePhase : Procedure (i : integer);\r
255      Begin\r
256          call color(15);\r
257          call move(160,330) ;\r
258          tab := GETMAP(600,340);\r
259          If i = 0 then\r
260                     call HASCII(0) ; call HASCII(ord('P'));\r
261                     call HASCII(0) ; call HASCII(ord(' '));\r
262                     call HASCII(0) ; call HASCII(ord('l'));\r
263                     call HASCII(0) ; call HASCII(ord(' '));\r
264                     call HASCII(0) ; call HASCII(ord('a'));\r
265                     call HASCII(0) ; call HASCII(ord(' '));\r
266                     call HASCII(0) ; call HASCII(ord('c'));\r
267                     call HASCII(0) ; call HASCII(ord(' '));\r
268                     call HASCII(0) ; call HASCII(ord('e'));\r
269                     call HASCII(0) ; call HASCII(ord(' '));\r
270                     call HASCII(0) ; call HASCII(ord('m'));\r
271                     call HASCII(0) ; call HASCII(ord(' '));\r
272                     call HASCII(0) ; call HASCII(ord('e'));\r
273                     call HASCII(0) ; call HASCII(ord(' '));\r
274                     call HASCII(0) ; call HASCII(ord('n'));\r
275                     call HASCII(0) ; call HASCII(ord(' '));\r
276                     call HASCII(0) ; call HASCII(ord('t'));\r
277          Fi;\r
278          if i = 1 then\r
279                     call HASCII(0) ; call HASCII(ord('D'));\r
280                     call HASCII(0) ; call HASCII(ord(' '));\r
281                     call HASCII(0) ; call HASCII(ord('e'));\r
282                     call HASCII(0) ; call HASCII(ord(' '));\r
283                     call HASCII(0) ; call HASCII(ord('p'));\r
284                     call HASCII(0) ; call HASCII(ord(' '));\r
285                     call HASCII(0) ; call HASCII(ord('l'));\r
286                     call HASCII(0) ; call HASCII(ord(' '));\r
287                     call HASCII(0) ; call HASCII(ord('a'));\r
288                     call HASCII(0) ; call HASCII(ord(' '));\r
289                     call HASCII(0) ; call HASCII(ord('c'));\r
290                     call HASCII(0) ; call HASCII(ord(' '));\r
291                     call HASCII(0) ; call HASCII(ord('e'));\r
292                     call HASCII(0) ; call HASCII(ord(' '));\r
293                     call HASCII(0) ; call HASCII(ord('m'));\r
294                     call HASCII(0) ; call HASCII(ord(' '));\r
295                     call HASCII(0) ; call HASCII(ord('e'));\r
296                     call HASCII(0) ; call HASCII(ord(' '));\r
297                     call HASCII(0) ; call HASCII(ord('n'));\r
298                     call HASCII(0) ; call HASCII(ord(' '));\r
299                     call HASCII(0) ; call HASCII(ord('t'));\r
300          Fi;\r
301          If i = 2 then\r
302                     call HASCII(0) ; call HASCII(ord('D'));\r
303                     call HASCII(0) ; call HASCII(ord('e'));\r
304                     call HASCII(0) ; call HASCII(ord('p'));\r
305                     call HASCII(0) ; call HASCII(ord('l'));\r
306                     call HASCII(0) ; call HASCII(ord('a'));\r
307                     call HASCII(0) ; call HASCII(ord('c'));\r
308                     call HASCII(0) ; call HASCII(ord('e'));\r
309                     call HASCII(0) ; call HASCII(ord('m'));\r
310                     call HASCII(0) ; call HASCII(ord('e'));\r
311                     call HASCII(0) ; call HASCII(ord('n'));\r
312                     call HASCII(0) ; call HASCII(ord('t'));\r
313                     call HASCII(0) ; call HASCII(ord(' '));\r
314                     call HASCII(0) ; call HASCII(ord('m'));\r
315                     call HASCII(0) ; call HASCII(ord('o'));\r
316                     call HASCII(0) ; call HASCII(ord('i'));\r
317                     call HASCII(0) ; call HASCII(ord('n'));\r
318                     call HASCII(0) ; call HASCII(ord('s'));\r
319                     call HASCII(0) ; call HASCII(ord(' '));\r
320                     call HASCII(0) ; call HASCII(ord('d'));\r
321                     call HASCII(0) ; call HASCII(ord('e'));\r
322                     call HASCII(0) ; call HASCII(ord(' '));\r
323                     call HASCII(0) ; call HASCII(ord('3'));\r
324                     call HASCII(0) ; call HASCII(ord(' '));\r
325                     call HASCII(0) ; call HASCII(ord('p'));\r
326                     call HASCII(0) ; call HASCII(ord('i'));\r
327                     call HASCII(0) ; call HASCII(ord('o'));\r
328                     call HASCII(0) ; call HASCII(ord('n'));\r
329                     call HASCII(0) ; call HASCII(ord('s'));\r
330          Fi;\r
331          If i = 3 then\r
332                     call HASCII(0) ; call HASCII(ord('M'));\r
333                     call HASCII(0) ; call HASCII(ord(' '));\r
334                     call HASCII(0) ; call HASCII(ord('a'));\r
335                     call HASCII(0) ; call HASCII(ord(' '));\r
336                     call HASCII(0) ; call HASCII(ord('n'));\r
337                     call HASCII(0) ; call HASCII(ord(' '));\r
338                     call HASCII(0) ; call HASCII(ord('g'));\r
339                     call HASCII(0) ; call HASCII(ord(' '));\r
340                     call HASCII(0) ; call HASCII(ord('e'));\r
341          Fi;\r
342          For i := 1 To 20 Do\r
343                    call HASCII(0) ; call HASCII(ord(' '));\r
344          Od;\r
345  \r
346 End AffichePhase;\r
347  \r
348  \r
349  \r
350 (*************************************************************************)\r
351 (** Dans une ligne comportant 3 points : pt1, pt2, pt3                  **)\r
352 (** recherche du ou des points se trouvant a proximite de pt1           **)\r
353 (*************************************************************************)\r
354  \r
355  \r
356 Unit RechPtProx : function (lig : ligne) : integer ;\r
357  \r
358 (**********************************)\r
359 (**   Result = 1   ==> point 2   **)\r
360 (**            2             3   **)\r
361 (**            3       point 3-2 **)\r
362 (**********************************)\r
363  \r
364 Begin\r
365   result := 0 ;\r
366   IF (lig.pt1.x = lig.pt2.x) AND             (*   Recherche des     *)\r
367      (lig.pt2.x = lig.pt3.x) AND             (*      lignes         *)\r
368      (lig.pt1.y = lig.pt2.y) AND             (*   en profondeur     *)\r
369      (lig.pt2.y = lig.pt3.y)\r
370   THEN\r
371  \r
372     IF (lig.pt1.z = (lig.pt2.z+1)) OR\r
373        (lig.pt1.z = (lig.pt2.z-1))\r
374     THEN\r
375       result := result + 1 ;\r
376     FI;\r
377  \r
378     IF (lig.pt1.z = (lig.pt3.z+1)) OR\r
379        (lig.pt1.z = (lig.pt3.z-1))\r
380     THEN\r
381       result := result + 2 ;\r
382     FI;\r
383  \r
384   ELSE     (** Recherche des lignes a l'interieur d'un cadre **)\r
385  \r
386     IF (lig.pt1.x = (lig.pt2.x+1)) OR\r
387        (lig.pt1.x = (lig.pt2.x-1)) OR\r
388        (lig.pt1.y = (lig.pt2.y+1)) OR\r
389        (lig.pt1.y = (lig.pt2.y-1))\r
390     THEN\r
391        result := result + 1 ;\r
392     FI;\r
393  \r
394     IF (lig.pt1.x = (lig.pt3.x+1)) OR\r
395        (lig.pt1.x = (lig.pt3.x-1)) OR\r
396        (lig.pt1.y = (lig.pt3.y+1)) OR\r
397        (lig.pt1.y = (lig.pt3.y-1))\r
398     THEN\r
399        result := result + 2 ;\r
400     FI;\r
401   FI;\r
402 End RechPtProx;\r
403  \r
404  \r
405 (*************************************************************************)\r
406 (** Procedure verifiant que la priorite 1 ou 2 (suivant l'appelant)     **)\r
407 (**     peut etre validee                                               **)\r
408 (*************************************************************************)\r
409  \r
410 Unit DeplPrior12 : procedure (ligne1,ligne2:ligne;output sortie : boolean);\r
411  \r
412 Var  prox : integer;\r
413  \r
414 Begin\r
415  \r
416 (** S'il existe un pion appartenant au joueur courant,a proximite de    **)\r
417 (** l'intersection des 2 lignes, sur la ligne 2, la priorite peut etre  **)\r
418 (** validee                                                             **)\r
419  \r
420   sortie := false ;\r
421   prox := RechPtProx (ligne2);\r
422   IF Not defense\r
423   THEN\r
424      IF ((prox = 1) OR (prox = 3)) AND\r
425         (table.cub(ligne2.pt2.x,ligne2.pt2.y,ligne2.pt2.z) = Numjoueur)\r
426      THEN\r
427         ptdep.x := ligne2.pt2.x;\r
428         ptdep.y := ligne2.pt2.y;\r
429         ptdep.z := ligne2.pt2.z;\r
430         ptarr.x := ligne1.pt1.x;\r
431         ptarr.y := ligne1.pt1.y;\r
432         ptarr.z := ligne1.pt1.z;\r
433         sortie := true ;\r
434      ELSE\r
435         IF ((prox = 2) OR (prox = 3)) AND\r
436            (table.cub(ligne2.pt3.x,ligne2.pt3.y,ligne2.pt3.z) = Numjoueur)\r
437         THEN\r
438            ptdep.x := ligne2.pt3.x;\r
439            ptdep.y := ligne2.pt3.y;\r
440            ptdep.z := ligne2.pt3.z;\r
441            ptarr.x := ligne1.pt1.x;\r
442            ptarr.y := ligne1.pt1.y;\r
443            ptarr.z := ligne1.pt1.z;\r
444            sortie := true ;\r
445         FI ;\r
446      FI;\r
447   ELSE\r
448      IF (prox = 3) AND\r
449        (((table.cub(ligne2.pt2.x,ligne2.pt2.y,ligne2.pt2.z) = Numjoueur) AND\r
450          (table.cub(ligne2.pt3.x,ligne2.pt3.y,ligne2.pt3.z) = (3 - Numjoueur)))\r
451         OR\r
452         ((table.cub(ligne2.pt3.x,ligne2.pt3.y,ligne2.pt3.z) = Numjoueur) AND\r
453         (table.cub(ligne2.pt2.x,ligne2.pt2.y,ligne2.pt2.z) = (3 - Numjoueur))))\r
454      THEN\r
455         IF (table.cub(ligne2.pt2.x,ligne2.pt2.y,ligne2.pt2.z) = Numjoueur)\r
456         THEN\r
457            ptdep.x := ligne2.pt2.x;\r
458            ptdep.y := ligne2.pt2.y;\r
459            ptdep.z := ligne2.pt2.z;\r
460         ELSE\r
461            ptdep.x := ligne2.pt3.x;\r
462            ptdep.y := ligne2.pt3.y;\r
463            ptdep.z := ligne2.pt3.z;\r
464         FI;\r
465         ptarr.x := ligne1.pt1.x;\r
466         ptarr.y := ligne1.pt1.y;\r
467         ptarr.z := ligne1.pt1.z;\r
468         sortie := true ;\r
469      FI ;\r
470   FI;\r
471  \r
472 End DeplPrior12 ;\r
473  \r
474  \r
475  \r
476 (*************************************************************************)\r
477 (** Procedure permettant de rechercher toutes les lignes valides dans   **)\r
478 (**           le cube                                                   **)\r
479 (*************************************************************************)\r
480  \r
481 Unit RechLigne : procedure (i,j,k : integer;\r
482                             inout lig1 : ligne;\r
483                             output sortie : boolean);\r
484 Begin\r
485   sortie := true ;\r
486   IF ((i = 2) OR (j = 2))\r
487   THEN\r
488   (** Creation des lignes en profondeur **)\r
489  \r
490     IF i <> j  (* la ligne du milieu du cube est inexistante *)\r
491     THEN\r
492       IF k = 1\r
493       THEN\r
494       (** On cree ces lignes seuleument une fois ==> quand k = 1 **)\r
495         lig1.pt1.x,lig1.pt2.x,lig1.pt3.x := i;\r
496         lig1.pt1.y,lig1.pt2.y,lig1.pt3.y := j;\r
497         lig1.pt1.z:=k;\r
498         lig1.pt2.z:=k+1;\r
499         lig1.pt3.z:=k+2;\r
500       ELSE\r
501         sortie := false;\r
502         return;\r
503       FI;\r
504     ELSE\r
505       sortie := false;\r
506       return;\r
507     FI;\r
508  \r
509   ELSE\r
510      (** Creation des lignes pour chaque cadre  **)\r
511  \r
512      lig1.pt1.z ,lig1.pt2.z, lig1.pt3.z := k;\r
513  \r
514      If (( i = 1 ) AND ( j = 1 )) OR\r
515         (( i = 3 ) AND ( j = 3 ))\r
516      Then\r
517  \r
518      (** Creation des lignes horizontales **)\r
519         lig1.pt1.x,lig1.pt2.x,lig1.pt3.x := i;\r
520         lig1.pt1.y := (j mod 3) + 1;\r
521         lig1.pt2.y := ((j + 1) mod 3) + 1;\r
522         lig1.pt3.y := ((j + 2) mod 3) + 1;\r
523      Fi;\r
524      If (( i = 1 ) AND ( j = 3 )) OR\r
525         (( i = 3 ) AND ( j = 1 ))\r
526      Then\r
527      (** Creation des lignes verticales **)\r
528         lig1.pt1.y,lig1.pt2.y,lig1.pt3.y := i;\r
529         lig1.pt1.x := (j mod 3) + 1;\r
530         lig1.pt2.x := ((j + 1) mod 3) + 1;\r
531         lig1.pt3.x := ((j + 2) mod 3) + 1;\r
532      Fi;\r
533  \r
534   Fi;\r
535  \r
536 End RechLigne;\r
537  \r
538  \r
539  \r
540 (*************************************************************************)\r
541 (** Procedure permettant de rechercher les 2 lignes valides qui         **)\r
542 (** s'intersectent dans le cube a partir d'un point donne               **)\r
543 (*************************************************************************)\r
544  \r
545 Unit RechLignesCrois : procedure (i,j,k           : integer;\r
546                                   inout lig1,lig2 : ligne;\r
547                                   output sortie   : boolean);\r
548  \r
549 (** Cette procedure renvoie 2 lignes qui se croisent au point (i,j,k) *)\r
550  \r
551 Begin\r
552  \r
553   sortie := true;\r
554  \r
555   lig1.pt1.x,lig2.pt1.x := i;    (*   Creation du point   *)\r
556   lig1.pt1.y,lig2.pt1.y := j;    (*     d'intersection    *)\r
557   lig1.pt1.z,lig2.pt1.z := k;    (*      ==> pt1          *)\r
558  \r
559   IF (i = 2) OR (j = 2)\r
560   THEN\r
561   (** Recherche des lignes qui s'intersectent avec celles en profondeur **)\r
562  \r
563     IF (i<>j)  (* la ligne du milieu est inexistante *)\r
564     THEN\r
565  \r
566       (* creation de la ligne appartenant au cadre *)\r
567       lig1.pt2.z,lig1.pt3.z := k;\r
568       IF (i = 2)\r
569       THEN\r
570         lig1.pt2.x := 1 ;         (*  Creation d'une     *)\r
571         lig1.pt3.x := 3 ;         (*   ligne             *)\r
572         lig1.pt2.y := j;          (*  horrizontale       *)\r
573         lig1.pt3.y := j;\r
574       FI;\r
575       IF (j = 2)\r
576       THEN\r
577         lig1.pt2.x := i;         (*  Creation d'une      *)\r
578         lig1.pt3.x := i;         (*    ligne             *)\r
579         lig1.pt2.y := 1 ;        (*  verticale           *)\r
580         lig1.pt3.y := 3 ;\r
581       FI;\r
582  \r
583       (* Creation de la ligne en profondeur *)\r
584       lig2.pt2.x,lig2.pt3.x := i;\r
585       lig2.pt2.y,lig2.pt3.y := j;\r
586       IF (k = 1)\r
587       THEN\r
588         lig2.pt2.z := 2;\r
589         lig2.pt3.z := 3;\r
590       ELSE\r
591         IF (k = 2)\r
592         THEN\r
593           lig2.pt2.z := 1;\r
594           lig2.pt3.z := 3;\r
595         ELSE\r
596           lig2.pt2.z := 1;\r
597           lig2.pt3.z := 2;\r
598         FI;\r
599       FI;\r
600     ELSE\r
601       sortie := false ;\r
602       return;\r
603     FI;\r
604  \r
605   ELSE\r
606   (** Recherche des lignes qui se croisent dans le meme cadre **)\r
607  \r
608      (* Tous les points ont le meme cadre *)\r
609      lig1.pt2.z, lig1.pt3.z, lig2.pt2.z, lig2.pt3.z := k;\r
610  \r
611      (* les points sur la ligne horizontale ont la meme abscisse *)\r
612      lig1.pt2.x,lig1.pt3.x := i;\r
613  \r
614      (* les points sur la ligne verticale ont la meme ordonnee *)\r
615      lig2.pt2.y, lig2.pt3.y := j;\r
616  \r
617      (* Calcul des abscisses de la ligne verticale *)\r
618      If ( i = 1) Then\r
619         lig2.pt2.x := 2;\r
620         lig2.pt3.x := 3 ;\r
621      Else\r
622         lig2.pt2.x := 1;\r
623         lig2.pt3.x := 2 ;\r
624      Fi;\r
625  \r
626      (* Calcul des ordonnees de la ligne horizontale *)\r
627      If ( j = 1) Then\r
628         lig1.pt2.y := 2;\r
629         lig1.pt3.y := 3 ;\r
630      Else\r
631         lig1.pt2.y := 1;\r
632         lig1.pt3.y := 2 ;\r
633      Fi;\r
634  \r
635   Fi;\r
636  \r
637 End RechLignesCrois;\r
638  \r
639  \r
640 (*************************************************************************)\r
641 (** Procedure permettant de determiner un point du cube ayant pour      **)\r
642 (** valeur le parametre n, de facon aleatoire                           **)\r
643 (*************************************************************************)\r
644  \r
645 Unit RandomPlac : Procedure ( n : integer );\r
646  \r
647 Var i, j, k : integer,\r
648     a, b, c : real;\r
649  \r
650 Begin\r
651    a := Random;\r
652    ptarr.x := ((Round( a * 10000) ) mod 3) + 1;        (*    Calcul de    *)\r
653    b := Random;\r
654    ptarr.y := ((Round( b * 10000) ) mod 3) + 1;        (*  3 coordonnees  *)\r
655    c := Random;\r
656    ptarr.z := ((Round( c * 10000) ) mod 3) + 1;        (*    aleatoires   *)\r
657  \r
658    (** A partir du point calcule on cherche on cherche un point tel que\r
659          sa valeur dans le cube soit n   **)\r
660  \r
661    If (table.cub( ptarr.x, ptarr.y, ptarr.z ) <> n) OR\r
662       ((ptarr.x = 2) AND (ptarr.y = 2))\r
663    Then\r
664       For k := ptarr.z To 3 Do\r
665           For j := ptarr.y To 3 Do\r
666               For i := ptarr.x To 3 Do\r
667                   If (i =  2) AND (j =  2) Then\r
668                      repeat;\r
669                   Fi;\r
670                   If table.cub(i,j,k) = n Then\r
671                      ptarr.x := i;\r
672                      ptarr.y := j;\r
673                      ptarr.z := k;\r
674                      exit;exit;exit;\r
675                   Fi;\r
676               Od;\r
677           Od;\r
678       Od;\r
679    Fi;\r
680  \r
681    If (table.cub( ptarr.x, ptarr.y, ptarr.z ) <> n) OR\r
682       ((ptarr.x = 2) AND (ptarr.y = 2))\r
683    Then\r
684       For k := ptarr.z Downto 1 Do\r
685           For j := ptarr.y Downto 1 Do\r
686               For i := ptarr.x Downto 1 Do\r
687                   If (i = 2) AND (j = 2) Then\r
688                      repeat;\r
689                   Fi;\r
690                   If table.cub(i,j,k) = n Then\r
691                      ptarr.x := i;\r
692                      ptarr.y := j;\r
693                      ptarr.z := k;\r
694                      exit;exit;exit;\r
695                   Fi;\r
696               Od;\r
697           Od;\r
698       Od;\r
699    Fi;\r
700  \r
701 End RandomPlac;\r
702  \r
703  \r
704  \r
705 (*************************************************************************)\r
706 (** Procedure permettant de determiner, de facon aleatoire, deux points **)\r
707 (** du cube : - l'un ayant pour valeur le parametre n                   **)\r
708 (**           - l'autre,se trouvant a la proximite du premier,ayant     **)\r
709 (**             la valeur 0                                             **)\r
710 (*************************************************************************)\r
711  \r
712 Unit RandomDepl : Procedure ( lig1, lig2: ligne, n : integer );\r
713  \r
714 Var trouve, sortie : boolean,\r
715     i, j, k, prox  : integer,\r
716     a, b, c        : real;\r
717  \r
718 Begin\r
719  \r
720 trouve := false;\r
721 WHILE not trouve Do\r
722       a := random;\r
723       ptdep.x := ((Round(a * 10000)) mod 3) + 1;       (*     Calcul      *)\r
724       b := Random;\r
725       ptdep.y := ((Round(b * 10000)) mod 3) + 1;       (*       du        *)\r
726       c := Random;\r
727       ptdep.z := ((Round(c * 10000)) mod 3) + 1;       (* point de depart *)\r
728  \r
729       (* A partir du point calcule on cherche un point tel que sa valeur\r
730             soit n dans la table  *)\r
731  \r
732        If (table.cub( ptdep.x, ptdep.y, ptdep.z ) <> n) OR\r
733           ((ptdep.x = 2) AND (ptdep.y = 2))\r
734        Then\r
735           For k := ptdep.z To 3 Do\r
736               For j := ptdep.y To 3 Do\r
737                   For i := ptdep.x To 3 Do\r
738                       If (i = 2) AND (j = 2) Then\r
739                          repeat;\r
740                       Fi;\r
741                       If table.cub(i,j,k) = n Then\r
742                          ptdep.x := i;\r
743                          ptdep.y := j;\r
744                          ptdep.z := k;\r
745                          exit;exit;exit;\r
746                       Fi;\r
747                   Od;\r
748               Od;\r
749           Od;\r
750        Fi;\r
751  \r
752        If (table.cub( ptdep.x, ptdep.y, ptdep.z ) <> n) OR\r
753           ((ptdep.x = 2) AND (ptdep.y = 2))\r
754        Then\r
755           For k := ptdep.z Downto 1 Do\r
756               For j := ptdep.y Downto 1 Do\r
757                   For i := ptdep.x Downto 1 Do\r
758                       If (i = 2) AND (j = 2) Then\r
759                          repeat;\r
760                       Fi;\r
761                       If table.cub(i,j,k) = n Then\r
762                          ptdep.x := i;\r
763                          ptdep.y := j;\r
764                          ptdep.z := k;\r
765                          exit;exit;exit;\r
766                       Fi;\r
767                   Od;\r
768               Od;\r
769           Od;\r
770        Fi;\r
771  \r
772        call RechLignesCrois (ptdep.x, ptdep.y, ptdep.z, lig1, lig2, sortie);\r
773        (** Recherche d'une case libre sur la ligne lig1 *)\r
774        prox := RechPtProx (lig1);\r
775  \r
776        If ((prox = 1) OR (prox = 3))\r
777           AND (table.cub(lig1.pt2.x, lig1.pt2.y, lig1.pt2.z) = 0 )\r
778        Then\r
779           trouve := true;\r
780           ptarr.x := lig1.pt2.x;\r
781           ptarr.y := lig1.pt2.y;\r
782           ptarr.z := lig1.pt2.z;\r
783           exit;\r
784        Else\r
785           If ((prox = 2) OR (prox = 3)) AND\r
786              (table.cub(lig1.pt3.x, lig1.pt3.y, lig1.pt3.z) = 0 )\r
787           Then\r
788              trouve := true;\r
789              ptarr.x := lig1.pt3.x;\r
790              ptarr.y := lig1.pt3.y;\r
791              ptarr.z := lig1.pt3.z;\r
792              exit;\r
793           Fi;\r
794        Fi;\r
795  \r
796        (* Recherche d'une case libre sur la ligne lig2 *)\r
797        prox := RechPtProx (lig2);\r
798  \r
799        If ((prox = 1) OR (prox = 3))\r
800           AND (table.cub(lig2.pt2.x, lig2.pt2.y, lig2.pt2.z) = 0 )\r
801        Then\r
802           trouve := true;\r
803           ptarr.x := lig2.pt2.x;\r
804           ptarr.y := lig2.pt2.y;\r
805           ptarr.z := lig2.pt2.z;\r
806           exit;\r
807        Else\r
808           If ((prox = 2) OR (prox = 3)) AND\r
809              (table.cub(lig2.pt3.x, lig2.pt3.y, lig2.pt3.z) = 0 )\r
810           Then\r
811              trouve := true;\r
812              ptarr.x := lig2.pt3.x;\r
813              ptarr.y := lig2.pt3.y;\r
814              ptarr.z := lig2.pt3.z;\r
815              exit;\r
816           Fi;\r
817        Fi;\r
818   OD;\r
819  \r
820 End RandomDepl;\r
821  \r
822  \r
823  \r
824 (*************************************************************************)\r
825 (** Phase de placement des pions                                        **)\r
826 (** Cette phase est commune au 2 joueurs                                **)\r
827 (** Mais suivant le joueur il observe une strategie offensive ou        **)\r
828 (** defensive                                                           **)\r
829 (*************************************************************************)\r
830  \r
831 UNIT Phase0 : PROCEDURE ( lig1 , lig2 : ligne);\r
832  \r
833 VAR priorite                           : integer ,\r
834     x1, x2, x3, y1, y2, y3, z1, z2, z3 : integer ,\r
835     xx2, xx3, yy2, yy3, zz2, zz3       : integer ,\r
836     i, j, k                            : integer,\r
837     sortie                             : boolean;\r
838  \r
839 BEGIN\r
840      priorite := 6; (* Par defaut priorite maximum *)\r
841  \r
842       FOR k := 1 TO 3 DO\r
843         FOR j := 1 TO 3 DO\r
844           FOR i := 1 TO 3 DO\r
845  \r
846           (* Recherche de placement pour chaque ligne *)\r
847  \r
848             CALL RechLigne (i,j,k,lig1,sortie);\r
849  \r
850             x1 := lig1.pt1.x;   y1 := lig1.pt1.y;   z1 := lig1.pt1.z;\r
851             x2 := lig1.pt2.x;   y2 := lig1.pt2.y;   z2 := lig1.pt2.z;\r
852             x3 := lig1.pt3.x;   y3 := lig1.pt3.y;   z3 := lig1.pt3.z;\r
853  \r
854             IF sortie THEN\r
855  \r
856               (** Priorite = 1 **)\r
857  \r
858               (** Si sur une meme ligne il y a 2 pions du joueur1 on place **)\r
859               (** le pion du joueur courant sur le troisieme point si la   **)\r
860               (** place n'est pas deja occupe                              **)\r
861               (** Si le joueur courant est le joueur1                      **)\r
862               (**     ==> alignement de pions                              **)\r
863               (** Sinon                                                    **)\r
864               (**     ==>empechement d'alignement                          **)\r
865  \r
866  \r
867               IF (table.cub(x1,y1,z1) = 1) AND\r
868                  (table.cub(x2,y2,z2) = 1) AND\r
869                  (table.cub(x3,y3,z3) = 0)\r
870               THEN\r
871                 priorite := 1 ;\r
872                 ptarr.x := x3;\r
873                 ptarr.y := y3;\r
874                 ptarr.z := z3;\r
875                 exit;exit;exit;\r
876               FI;\r
877  \r
878               IF (table.cub(x1,y1,z1) = 1) AND\r
879                  (table.cub(x2,y2,z2) = 0) AND\r
880                  (table.cub(x3,y3,z3) = 1)\r
881               THEN\r
882                 priorite := 1 ;\r
883                 ptarr.x := x2;\r
884                 ptarr.y := y2;\r
885                 ptarr.z := z2;\r
886                 exit;exit;exit;\r
887               FI;\r
888  \r
889               IF (table.cub(x1,y1,z1) = 0) AND\r
890                  (table.cub(x2,y2,z2) = 1) AND\r
891                  (table.cub(x3,y3,z3) = 1)\r
892               THEN\r
893                 priorite := 1 ;\r
894                 ptarr.x := x1;\r
895                 ptarr.y := y1;\r
896                 ptarr.z := z1;\r
897                 exit;exit;exit;\r
898               FI;\r
899  \r
900  \r
901               (** Priorite = 2 **)\r
902  \r
903               (** Si sur une meme ligne il y a 2 pions du joueur2 on place **)\r
904               (** le pion du joueur courant sur le troisieme point si la   **)\r
905               (** place n'est pas deja occupe                              **)\r
906               (** Si le joueur courant est le joueur2                      **)\r
907               (**     ==> alignement de pions                              **)\r
908               (** Sinon                                                    **)\r
909               (**     ==>empechement d'alignement                          **)\r
910  \r
911               IF (table.cub(x1,y1,z1) = 2) AND\r
912                  (table.cub(x2,y2,z2) = 2) AND\r
913                  (table.cub(x3,y3,z3) = 0) AND\r
914                  (priorite > 2)\r
915               THEN\r
916                priorite := 2 ;\r
917                ptarr.x := x3;\r
918                ptarr.y := y3;\r
919                ptarr.z := z3;\r
920               FI;\r
921  \r
922               IF (table.cub(x1,y1,z1) = 2) AND\r
923                  (table.cub(x2,y2,z2) = 0) AND\r
924                  (table.cub(x3,y3,z3) = 2) AND\r
925                  (priorite > 2)\r
926               THEN\r
927                 priorite := 2 ;\r
928                 ptarr.x := x2;\r
929                 ptarr.y := y2;\r
930                 ptarr.z := z2;\r
931               FI;\r
932  \r
933               IF (table.cub(x1,y1,z1) = 0) AND\r
934                  (table.cub(x2,y2,z2) = 2) AND\r
935                  (table.cub(x3,y3,z3) = 2) AND\r
936                  (priorite > 2)\r
937               THEN\r
938                 priorite := 2 ;\r
939                 ptarr.x := x1;\r
940                 ptarr.y := y1;\r
941                 ptarr.z := z1;\r
942               FI;\r
943  \r
944  \r
945               (** Priorite = 5 **)\r
946  \r
947               (** Si le point de coordonnees (1,2,2) est libre on choisit **)\r
948               (** ce point                                                **)\r
949  \r
950               IF (table.cub(1,2,2) = 0) AND (priorite = 6)\r
951               THEN\r
952                 ptarr.x := 1;\r
953                 ptarr.y := 2;\r
954                 ptarr.z := 2;\r
955                 priorite := 5 ;\r
956               FI;\r
957  \r
958             FI;\r
959  \r
960           OD;\r
961         OD;\r
962       OD;\r
963  \r
964       IF priorite > 2\r
965       THEN\r
966  \r
967         (** On traite toutes les lignes qui s'intersectent **)\r
968  \r
969         FOR k := 1 TO 3 DO\r
970           FOR j := 1 TO 3 DO\r
971             FOR i := 1 TO 3 DO\r
972  \r
973             (* Recherche pour chaque paire ligne qui s'intersectent *)\r
974  \r
975               CALL RechLignesCrois (i,j,k,lig1,lig2,sortie);\r
976  \r
977               x1 := lig1.pt1.x;   y1 := lig1.pt1.y;   z1 := lig1.pt1.z;\r
978               x2 := lig1.pt2.x;   y2 := lig1.pt2.y;   z2 := lig1.pt2.z;\r
979               x3 := lig1.pt3.x;   y3 := lig1.pt3.y;   z3 := lig1.pt3.z;\r
980  \r
981               xx2 := lig2.pt2.x;   yy2 := lig2.pt2.y;   zz2 := lig2.pt2.z;\r
982               xx3 := lig2.pt3.x;   yy3 := lig2.pt3.y;   zz3 := lig2.pt3.z;\r
983               IF sortie\r
984               THEN\r
985  \r
986                 (** Priorite = 3 **)\r
987  \r
988                 (** Pour chaque paire de lignes qui s'intersectent a une **)\r
989                 (** case (x, y, z) de valeur 0                           **)\r
990                 (** Si les valeurs  des pions sur les 2 lignes sont      **)\r
991                 (** 1, 0, 0 dans n'importe quel ordre alors on choisit   **)\r
992                 (** la case (x, y, z)                                    **)\r
993  \r
994                 IF (table.cub(x1,y1,z1) = 0)   AND\r
995  \r
996                    (((table.cub(x2,y2,z2) = 1)  AND\r
997                      (table.cub(x3,y3,z3) = 0)) OR\r
998  \r
999                     ((table.cub(x2,y2,z2) = 0)  AND\r
1000                      (table.cub(x3,y3,z3) = 1))) AND\r
1001  \r
1002                    (((table.cub(xx2,yy2,zz2) = 1)  AND\r
1003                      (table.cub(xx3,yy3,zz3) = 0)) OR\r
1004  \r
1005                     ((table.cub(xx2,yy2,zz2) = 0)  AND\r
1006                      (table.cub(xx3,yy3,zz3) = 1)))\r
1007  \r
1008                 THEN\r
1009                   priorite := 3;\r
1010                   ptarr.x := x1;\r
1011                   ptarr.y := y1;\r
1012                   ptarr.z := z1;\r
1013                   exit;exit;exit;\r
1014                 FI;\r
1015  \r
1016  \r
1017                 (** Priorite = 4 **)\r
1018  \r
1019                 (** Pour chaque paire de lignes qui s'intersectent a une **)\r
1020                 (** case (x, y, z) de valeur 0                           **)\r
1021                 (** Si les valeurs  des pions sur les 2 lignes sont      **)\r
1022                 (** 2, 0, 0 dans n'importe quel ordre alors on choisit   **)\r
1023                 (** la case (x, y, z)                                    **)\r
1024  \r
1025                 IF (table.cub(x1,y1,z1) = 0)   AND\r
1026  \r
1027                    (((table.cub(x2,y2,z2) = 2)  AND\r
1028                      (table.cub(x3,y3,z3) = 0)) OR\r
1029  \r
1030                     ((table.cub(x2,y2,z2) = 0)  AND\r
1031                      (table.cub(x3,y3,z3) = 2)))   AND\r
1032  \r
1033                    (((table.cub(xx2,yy2,zz2) = 2)  AND\r
1034                      (table.cub(xx3,yy3,zz3) = 0)) OR\r
1035  \r
1036                     ((table.cub(xx2,yy2,zz2) = 0)  AND\r
1037                      (table.cub(xx3,yy3,zz3) = 2))) AND\r
1038  \r
1039                      (priorite > 4)\r
1040  \r
1041                 THEN\r
1042                   priorite := 4;\r
1043                   ptarr.x := x1;\r
1044                   ptarr.y := y1;\r
1045                   ptarr.z := z1;\r
1046                 FI;\r
1047  \r
1048               FI;\r
1049  \r
1050             OD;\r
1051           OD;\r
1052         OD;\r
1053       FI;\r
1054  \r
1055       (** Prioite = 6 **)\r
1056  \r
1057       (** Recherche aleatoire du pion a placer **)\r
1058  \r
1059       IF (priorite = 6)\r
1060       THEN\r
1061         CALL RandomPlac (0);\r
1062       FI;\r
1063  \r
1064  \r
1065       For i := 1 To temps Do\r
1066           call color(10);\r
1067           call AffichPt(ptarr);\r
1068           call HASCII(0);\r
1069           call HASCII(ord('#'));\r
1070       Od;\r
1071  \r
1072 END Phase0;\r
1073  \r
1074 (*************************************************************************)\r
1075 (** Phase de deplacement des pions                                      **)\r
1076 (** Cette phase est commune au 2 joueurs                                **)\r
1077 (** Dans certains cas, le joueur 1 observe une strategie offensive      **)\r
1078 (** et le joueur 2 une strategie defensive                              **)\r
1079 (*************************************************************************)\r
1080  \r
1081 UNIT Phase1 : PROCEDURE (lig1 , lig2 : ligne);\r
1082  \r
1083 VAR priorite, prox                     : integer,\r
1084     x1, x2, x3, y1, y2, y3, z1, z2, z3 : integer ,\r
1085     xx2, xx3, yy2, yy3, zz2, zz3       : integer ,\r
1086     i, j, k                            : integer ,\r
1087     sortie, ok                         : boolean;\r
1088  \r
1089 BEGIN\r
1090  \r
1091        priorite := 6; (* Priorite initialise au maximum par defaut *)\r
1092  \r
1093        FOR k := 1 TO 3 DO\r
1094            FOR j := 1 TO 3 DO\r
1095                FOR i := 1 TO 3 DO\r
1096  \r
1097                    (* On recherche les deplacements possibles sur des lignes\r
1098                       qui s'intersectent car :\r
1099                          - Il faut trouver le pion a deplacer\r
1100                          - on doit regarder si le deplacement est possible\r
1101                            dans les lignes qui passent par ce point          *)\r
1102  \r
1103                    call RechLignesCrois(i,j,k,lig1,lig2,sortie);\r
1104  \r
1105                    x1 := lig1.pt1.x;   y1 := lig1.pt1.y;   z1 := lig1.pt1.z;\r
1106                    x2 := lig1.pt2.x;   y2 := lig1.pt2.y;   z2 := lig1.pt2.z;\r
1107                    x3 := lig1.pt3.x;   y3 := lig1.pt3.y;   z3 := lig1.pt3.z;\r
1108  \r
1109                    xx2 := lig2.pt2.x;   yy2 := lig2.pt2.y;   zz2 := lig2.pt2.z;\r
1110                    xx3 := lig2.pt3.x;   yy3 := lig2.pt3.y;   zz3 := lig2.pt3.z;\r
1111  \r
1112                    IF sortie THEN\r
1113  \r
1114                    (** Priorite = 1 **)\r
1115                    (** Si sur une ligne il y a 2 pions du joueur1, et sur\r
1116                        l'autre ligne il y a a proximite un autre pion du\r
1117                        - joueur1 on place le pion du joueur1 \85 l'intersection\r
1118                             ==> alignement\r
1119                        - joueur2 on place le pion du joueur2 \85 l'intersection\r
1120                             ==> empechement d'alignement         **)\r
1121  \r
1122                       If (table.cub(x1,y1,z1) = 0) AND\r
1123                          (table.cub(x2,y2,z2) = 1) AND\r
1124                          (table.cub(x3,y3,z3) = 1)\r
1125                       Then\r
1126                          If numjoueur = 1 Then\r
1127                             defense := false;\r
1128                          Else\r
1129                             defense := true;\r
1130                          Fi;\r
1131                          call DeplPrior12 (lig1,lig2,ok);\r
1132                          If ok Then\r
1133                             priorite := 1;\r
1134                             exit;exit;exit;\r
1135                          Fi;\r
1136                       Fi;\r
1137  \r
1138                       If (table.cub(x1,y1,z1) = 0) AND\r
1139                          (table.cub(xx2,yy2,zz2) = 1) AND\r
1140                          (table.cub(xx3,yy3,zz3) = 1)\r
1141                       Then\r
1142                          If numjoueur = 1 Then\r
1143                             defense := false;\r
1144                          Else\r
1145                             defense := true;\r
1146                          Fi;\r
1147                          call DeplPrior12 (lig2,lig1,ok);\r
1148                          If ok Then\r
1149                             priorite := 1;\r
1150                             exit;exit;exit;\r
1151                          Fi;\r
1152                       Fi;\r
1153  \r
1154                       (** Priorite = 2 **)\r
1155  \r
1156                       (** Si sur une ligne il y a 2 pions du joueur2, et sur\r
1157                           l'autre ligne il y a a proximite un autre pion du\r
1158                           - joueur2 on place le pion du joueur2 \85 l'intersection\r
1159                                ==> alignement\r
1160                           - joueur1 on place le pion du joueur1 \85 l'intersection\r
1161                                ==> empechement d'alignement         **)\r
1162  \r
1163                       If (table.cub(x1,y1,z1) = 0) AND\r
1164                          (table.cub(x2,y2,z2) = 2) AND\r
1165                          (table.cub(x3,y3,z3) = 2) AND\r
1166                          (priorite > 2)\r
1167                       Then\r
1168                          If numjoueur = 2 Then\r
1169                             defense := false;\r
1170                          Else\r
1171                             defense := true;\r
1172                          Fi;\r
1173                          call DeplPrior12 (lig1,lig2,ok);\r
1174                          If ok Then\r
1175                             priorite := 2;\r
1176                          Fi;\r
1177                       Fi;\r
1178  \r
1179                       If (table.cub(x1,y1,z1) = 0) AND\r
1180                          (table.cub(xx2,yy2,zz2) = 2) AND\r
1181                          (table.cub(xx3,yy3,zz3) = 2) AND\r
1182                          (priorite > 2)\r
1183                       Then\r
1184                          If numjoueur = 2 Then\r
1185                             defense := false;\r
1186                          Else\r
1187                             defense := true;\r
1188                          Fi;\r
1189                          call DeplPrior12 (lig2,lig1,ok);\r
1190                          If ok Then\r
1191                             priorite := 2;\r
1192                          Fi;\r
1193                       Fi;\r
1194  \r
1195                       (** Priorite = 3 **)\r
1196  \r
1197                       (** Si sur une meme ligne il y a trois pions du meme\r
1198                           joueur et a proximite une case libre, on deplace\r
1199                           le pion sur la case libre ==> possibilite d'aligne\r
1200                           ment pour le prochain coup  **)\r
1201  \r
1202                       If (table.cub(x1,y1,z1) = Numjoueur ) AND\r
1203                          (table.cub(x2,y2,z2) = Numjoueur ) AND\r
1204                          (table.cub(x3,y3,z3) = Numjoueur ) AND\r
1205                          (priorite > 3)\r
1206                       Then\r
1207                          prox := RechPtProx(lig2);\r
1208                          If ((prox = 1) Or (prox = 3)) And\r
1209                             (table.cub(xx2,yy2,zz2) = 0)\r
1210                          Then\r
1211                             priorite := 3;\r
1212                             ptdep.x := x1;\r
1213                             ptdep.y := y1;\r
1214                             ptdep.z := z1;\r
1215  \r
1216                             ptarr.x := xx2;\r
1217                             ptarr.y := yy2;\r
1218                             ptarr.z := zz2;\r
1219                          Else\r
1220                             If ((prox = 2) Or (prox = 3)) And\r
1221                                (table.cub(xx3,yy3,zz3) = 0)\r
1222                             Then\r
1223                                priorite := 3;\r
1224                                ptdep.x := x1;\r
1225                                ptdep.y := y1;\r
1226                                ptdep.z := z1;\r
1227  \r
1228                                ptarr.x := xx3;\r
1229                                ptarr.y := yy3;\r
1230                                ptarr.z := zz3;\r
1231                             Fi;\r
1232                          Fi;\r
1233                       Fi;\r
1234  \r
1235                       If (table.cub(x1,y1,z1) = Numjoueur ) AND\r
1236                          (table.cub(xx2,yy2,zz2) = Numjoueur ) AND\r
1237                          (table.cub(xx3,yy3,zz3) = Numjoueur ) AND\r
1238                          (priorite > 3)\r
1239                       Then\r
1240                          prox := RechPtProx(lig1);\r
1241                          If ((prox = 1) Or (prox = 3)) And\r
1242                             (table.cub(x2,y2,z2) = 0)\r
1243                          Then\r
1244                             priorite := 3;\r
1245                             ptdep.x := x1;\r
1246                             ptdep.y := y1;\r
1247                             ptdep.z := z1;\r
1248  \r
1249                             ptarr.x := x2;\r
1250                             ptarr.y := y2;\r
1251                             ptarr.z := z2;\r
1252                          Else\r
1253                             If ((prox = 2) Or (prox = 3)) And\r
1254                                (table.cub(x3,y3,z3) = 0)\r
1255                             Then\r
1256                                priorite := 3;\r
1257                                ptdep.x := x1;\r
1258                                ptdep.y := y1;\r
1259                                ptdep.z := z1;\r
1260  \r
1261                                ptarr.x := x3;\r
1262                                ptarr.y := y3;\r
1263                                ptarr.z := z3;\r
1264                             Fi;\r
1265                          Fi;\r
1266                       Fi;\r
1267  \r
1268                       (** Priorite = 4 **)\r
1269  \r
1270                       (** Si sur une meme ligne on a 2 pions d'un meme joueur\r
1271                           et qu'il y ait possibilite de rapprocher un eventuel\r
1272                           troisieme pion du meme joueur, on effectue le\r
1273                           deplacement ==> possibilite d'alignement au prochain\r
1274                           coup  **)\r
1275  \r
1276                       If (table.cub(x1,y1,z1) = 0) AND\r
1277                          (table.cub(x2,y2,z2) = Numjoueur) AND\r
1278                          (table.cub(x3,y3,z3) = Numjoueur) AND\r
1279  \r
1280                          (((table.cub(xx2,yy2,zz2) = Numjoueur)AND\r
1281                            (table.cub(xx3,yy3,zz3) = 0))OR\r
1282  \r
1283                           ((table.cub(xx3,yy3,zz3) = Numjoueur)AND\r
1284                            (table.cub(xx2,yy2,zz2) = 0)))\r
1285                           AND\r
1286                           (priorite > 4)\r
1287                       Then\r
1288                          priorite := 4;\r
1289                          If table.cub(xx2,yy2,zz2) = Numjoueur\r
1290                          Then\r
1291                             ptdep.x := xx2;\r
1292                             ptdep.y := yy2;\r
1293                             ptdep.z := zz2;\r
1294                             ptarr.x := xx3;\r
1295                             ptarr.y := yy3;\r
1296                             ptarr.z := zz3;\r
1297                          Else\r
1298                             ptdep.x := xx3;\r
1299                             ptdep.y := yy3;\r
1300                             ptdep.z := zz3;\r
1301                             ptarr.x := xx2;\r
1302                             ptarr.y := yy2;\r
1303                             ptarr.z := zz2;\r
1304                          Fi;\r
1305  \r
1306                       Fi;\r
1307  \r
1308                       If (table.cub(x1,y1,z1) = 0) AND\r
1309                          (table.cub(xx2,yy2,zz2) = Numjoueur) AND\r
1310                          (table.cub(xx3,yy3,zz3) = Numjoueur) AND\r
1311  \r
1312                          (((table.cub(x2,y2,z2) = Numjoueur)AND\r
1313                            (table.cub(x3,y3,z3) = 0))OR\r
1314  \r
1315                           ((table.cub(x3,y3,z3) = Numjoueur)AND\r
1316                            (table.cub(x2,y2,z2) = 0)))\r
1317                           AND\r
1318                           (priorite > 4)\r
1319                       Then\r
1320                          priorite := 4;\r
1321                          If table.cub(x2,y2,z2) = Numjoueur\r
1322                          Then\r
1323                             ptdep.x := x2;\r
1324                             ptdep.y := y2;\r
1325                             ptdep.z := z2;\r
1326                             ptarr.x := x3;\r
1327                             ptarr.y := y3;\r
1328                             ptarr.z := z3;\r
1329                          Else\r
1330                             ptdep.x := x3;\r
1331                             ptdep.y := y3;\r
1332                             ptdep.z := z3;\r
1333                             ptarr.x := x2;\r
1334                             ptarr.y := y2;\r
1335                             ptarr.z := z2;\r
1336                          Fi;\r
1337                       Fi;\r
1338  \r
1339                       (** priorite = 5 **)\r
1340  \r
1341                       (** Pour chaque paire de lignes qui s'intersectent a une\r
1342                           case (x, y, z) de valeur 0\r
1343                           Si les valeurs  des pions sur les 2 lignes sont\r
1344                           1, 0, 0 dans n'importe quel ordre alors on aligne\r
1345                           deux pions ou on rapproche un pion ==> possibilite\r
1346                           d'alignement de deux pions au prochain coup  **)\r
1347  \r
1348                     If (table.cub(x1,y1,z1) = 0) AND\r
1349  \r
1350                          (((table.cub(x2,y2,z2) = Numjoueur) AND\r
1351                            (table.cub(x3,y3,z3) = 0)) OR\r
1352  \r
1353                           ((table.cub(x2,y2,z2) = 0) AND\r
1354                            (table.cub(x3,y3,z3) = Numjoueur)))\r
1355  \r
1356                          AND\r
1357  \r
1358                          (((table.cub(xx2,yy2,zz2) = Numjoueur) AND\r
1359                            (table.cub(xx3,yy3,zz3) = 0)) OR\r
1360  \r
1361                           ((table.cub(xx2,yy2,zz2) = 0) AND\r
1362                            (table.cub(xx3,yy3,zz3) = Numjoueur)))\r
1363  \r
1364                          AND\r
1365                          (priorite > 5)\r
1366  \r
1367                       Then\r
1368                          priorite := 5;\r
1369                          prox := RechPtProx(lig1);\r
1370  \r
1371                          (* si on peut aligne 2 pions on le fait sinon on\r
1372                              avance un pion pour que le coup d'apres on puisse\r
1373                              aligner les 2 pions                             *)\r
1374  \r
1375                          If ((prox = 1) OR (prox = 3)) AND\r
1376                             (table.cub(x2,y2,z2) = Numjoueur )\r
1377                          Then\r
1378                             ptdep.x := x2;\r
1379                             ptdep.y := y2;\r
1380                             ptdep.z := z2;\r
1381  \r
1382                             ptarr.x := x1;\r
1383                             ptarr.y := y1;\r
1384                             ptarr.z := z1;\r
1385                          Else\r
1386                             If ((prox = 2) OR (prox = 3)) AND\r
1387                                (table.cub(x3,y3,z3) = Numjoueur)\r
1388                             Then\r
1389                                ptdep.x := x3;\r
1390                                ptdep.y := y3;\r
1391                                ptdep.z := z3;\r
1392  \r
1393                                ptarr.x := x1;\r
1394                                ptarr.y := y1;\r
1395                                ptarr.z := z1;\r
1396                             Else\r
1397                                prox := RechPtProx(lig2);\r
1398                                If ((prox = 1) OR (prox = 3)) AND\r
1399                                 (table.cub(xx2,yy2,zz2)=Numjoueur)\r
1400                                Then\r
1401                                  ptdep.x := xx2;\r
1402                                  ptdep.y := yy2;\r
1403                                  ptdep.z := zz2;\r
1404  \r
1405                                  ptarr.x := x1;\r
1406                                  ptarr.y := y1;\r
1407                                  ptarr.z := z1;\r
1408                                Else\r
1409                                 If ((prox=2) OR (prox =3)) AND\r
1410                                 (table.cub(xx3,yy3,zz3)=Numjoueur)\r
1411                                 Then\r
1412                                   ptdep.x := xx3;\r
1413                                   ptdep.y := yy3;\r
1414                                   ptdep.z := zz3;\r
1415  \r
1416                                   ptarr.x := x1;\r
1417                                   ptarr.y := y1;\r
1418                                   ptarr.z := z1;\r
1419                                 Else\r
1420                                   If (prox = 1) Then\r
1421                                      ptdep.x := xx3;\r
1422                                      ptdep.y := yy3;\r
1423                                      ptdep.z := zz3;\r
1424  \r
1425                                      ptarr.x := xx2;\r
1426                                      ptarr.y := yy2;\r
1427                                      ptarr.z := zz2;\r
1428                                   Else\r
1429                                      ptdep.x := xx2;\r
1430                                      ptdep.y := yy2;\r
1431                                      ptdep.z := zz2;\r
1432  \r
1433                                      ptarr.x := xx3;\r
1434                                      ptarr.y := yy3;\r
1435                                      ptarr.z := zz3;\r
1436                                   Fi;\r
1437                                 Fi;\r
1438                                Fi;\r
1439                             Fi;\r
1440                          Fi;\r
1441                       Fi;\r
1442                    Fi;\r
1443  \r
1444                OD;\r
1445            OD;\r
1446        OD;\r
1447  \r
1448        (** Priorite = 6 **)\r
1449  \r
1450        (** Deplacement aleatoire **)\r
1451  \r
1452        IF priorite = 6 Then\r
1453           Call RandomDepl(lig1,lig2,Numjoueur);\r
1454        Fi;\r
1455  \r
1456        For i := 1 To temps Do\r
1457            call color(10);\r
1458            call AffichPt (ptdep);\r
1459            call HASCII(0);\r
1460            call HASCII(219);\r
1461            call Affichpt(ptarr);\r
1462            call HASCII(0);\r
1463            call HASCII(ord('#'));\r
1464        Od;\r
1465  \r
1466 END Phase1;\r
1467  \r
1468 (*************************************************************************)\r
1469 (** Phase de deplacement des pions lorsqu'il y a 3 pions ou moins       **)\r
1470 (** Cette phase est commune au 2 joueurs                                **)\r
1471 (** Dans certains cas, le joueur 1 observe une strategie offensive      **)\r
1472 (** et le joueur 2 une strategie defensive                              **)\r
1473 (*************************************************************************)\r
1474  \r
1475 UNIT Phase2 : PROCEDURE (lig1 , lig2 : ligne );\r
1476  \r
1477 VAR priorite, prox, cpt                : integer,\r
1478     x1, x2, x3, y1, y2, y3, z1, z2, z3 : integer ,\r
1479     xx2, xx3, yy2, yy3, zz2, zz3       : integer ,\r
1480     i, j, k                            : integer ,\r
1481     sortie                             : boolean ,\r
1482     pion1, pion2, pion3                : elt ,\r
1483     pion11, pion12                     : elt;\r
1484  \r
1485 BEGIN\r
1486  \r
1487        pion1 := NEW elt;\r
1488        pion2 := NEW elt;\r
1489        pion3 := NEW elt;\r
1490        pion11 := NEW elt;\r
1491        pion12 := NEW elt;\r
1492  \r
1493        priorite := 4;\r
1494        cpt := 1;\r
1495        For k := 1 To 3 Do\r
1496            For j := 1 To 3 Do\r
1497                For i := 1 To 3 Do\r
1498  \r
1499                    call RechLignesCrois(i,j,k,lig1,lig2,sortie);\r
1500  \r
1501                    x1 := lig1.pt1.x;   y1 := lig1.pt1.y;   z1 := lig1.pt1.z;\r
1502                    x2 := lig1.pt2.x;   y2 := lig1.pt2.y;   z2 := lig1.pt2.z;\r
1503                    x3 := lig1.pt3.x;   y3 := lig1.pt3.y;   z3 := lig1.pt3.z;\r
1504  \r
1505                    xx2 := lig2.pt2.x;   yy2 := lig2.pt2.y;   zz2 := lig2.pt2.z;\r
1506                    xx3 := lig2.pt3.x;   yy3 := lig2.pt3.y;   zz3 := lig2.pt3.z;\r
1507  \r
1508                    If sortie Then\r
1509  \r
1510                    (** On recherche l'action a faire et on localise les pions\r
1511                           du joueur 1  **)\r
1512  \r
1513                       (** Priorite = 1 **)\r
1514  \r
1515                       (** On cherche \85 aligner 3 pions du joueur1 ou\r
1516                           a contrer l'alignement                 **)\r
1517  \r
1518                       If (((nbpion1 = 3) AND (Numjoueur = 1)) Or\r
1519                           (Numjoueur = 2))         AND\r
1520                          (table.cub(x1,y1,z1) = 0) AND\r
1521                          (table.cub(x2,y2,z2) = 1) AND\r
1522                          (table.cub(x3,y3,z3) = 1) AND\r
1523                          (priorite > 1)\r
1524                       Then\r
1525                          priorite := 1;\r
1526                          ptarr.x := x1;\r
1527                          ptarr.y := y1;\r
1528                          ptarr.z := z1;\r
1529  \r
1530                          If Numjoueur = 1 Then\r
1531                             pion11.x := x2;\r
1532                             pion11.y := y2;\r
1533                             pion11.z := z2;\r
1534  \r
1535                             pion12.x := x3;\r
1536                             pion12.y := y3;\r
1537                             pion12.z := z3;\r
1538                          Fi;\r
1539                       Fi;\r
1540  \r
1541                       If (((nbpion1 = 3) AND (Numjoueur = 1)) Or\r
1542                           (Numjoueur = 2))         AND\r
1543                          (table.cub(x1,y1,z1) = 0) AND\r
1544                          (table.cub(xx2,yy2,zz2) = 1) AND\r
1545                          (table.cub(xx3,yy3,zz3) = 1) AND\r
1546                          (priorite > 1)\r
1547                       Then\r
1548                          priorite := 1;\r
1549                          ptarr.x := x1;\r
1550                          ptarr.y := y1;\r
1551                          ptarr.z := z1;\r
1552  \r
1553                          If Numjoueur = 1 Then\r
1554                             pion11.x := xx2;\r
1555                             pion11.y := yy2;\r
1556                             pion11.z := zz2;\r
1557  \r
1558                             pion12.x := xx3;\r
1559                             pion12.y := yy3;\r
1560                             pion12.z := zz3;\r
1561                          Fi;\r
1562                       Fi;\r
1563  \r
1564                       (** Priorite = 2 **)\r
1565  \r
1566                       (** On cherche a aligner 3 pions du joueur2 ou a\r
1567                           contrer l'alignement            **)\r
1568  \r
1569                       If (((nbpion2 = 3) And (Numjoueur = 2)) OR\r
1570                           (numjoueur = 1))         AND\r
1571                          (table.cub(x1,y1,z1) = 0) AND\r
1572                          (table.cub(x2,y2,z2) = 2) AND\r
1573                          (table.cub(x3,y3,z3) = 2) AND\r
1574                          (priorite > 2)\r
1575                       Then\r
1576                             priorite := 2;\r
1577                             ptarr.x := x1;\r
1578                             ptarr.y := y1;\r
1579                             ptarr.z := z1;\r
1580  \r
1581                             If Numjoueur = 2 Then\r
1582                                pion11.x := x2;\r
1583                                pion11.y := y2;\r
1584                                pion11.z := z2;\r
1585  \r
1586                                pion12.x := x3;\r
1587                                pion12.y := y3;\r
1588                                pion12.z := z3;\r
1589                             Fi;\r
1590                       Fi;\r
1591  \r
1592                       If (((nbpion2 = 3) And (Numjoueur = 2)) OR\r
1593                           (numjoueur = 1))         AND\r
1594                          (table.cub(x1,y1,z1) = 0) AND\r
1595                          (table.cub(xx2,yy2,zz2) = 2) AND\r
1596                          (table.cub(xx3,yy3,zz3) = 2) AND\r
1597                          (priorite > 2)\r
1598                       Then\r
1599                             priorite := 2;\r
1600                             ptarr.x := x1;\r
1601                             ptarr.y := y1;\r
1602                             ptarr.z := z1;\r
1603  \r
1604                             If Numjoueur = 2 Then\r
1605                                pion11.x := xx2;\r
1606                                pion11.y := yy2;\r
1607                                pion11.z := zz2;\r
1608  \r
1609                                pion12.x := xx3;\r
1610                                pion12.y := yy3;\r
1611                                pion12.z := zz3;\r
1612                             Fi;\r
1613                       Fi;\r
1614  \r
1615                       (** Priorite = 3 **)\r
1616  \r
1617                       (** On essaie d'aligner 2 pions si le joueur possede\r
1618                           exactement 3 pions    **)\r
1619  \r
1620                       If (table.cub(x1,y1,z1) = 0 ) AND\r
1621                          ((table.cub(x2,y2,z2) = Numjoueur ) OR\r
1622                           (table.cub(x3,y3,z3) = Numjoueur ))\r
1623                          AND (priorite >3)\r
1624                          AND (nbpion1 = 3)\r
1625                       Then\r
1626                          priorite := 3;\r
1627                          ptarr.x := x1;\r
1628                          ptarr.y := y1;\r
1629                          ptarr.z := z1;\r
1630                          If table.cub(x2,y2,z2) = Numjoueur\r
1631                          Then\r
1632                             pion11.x := x2;\r
1633                             pion11.y := y2;\r
1634                             pion11.z := z2;\r
1635                          Else\r
1636                             pion11.x := x3;\r
1637                             pion11.y := y3;\r
1638                             pion11.z := z3;\r
1639                          Fi;\r
1640                       Fi;\r
1641  \r
1642                       If (table.cub(x1,y1,z1) = 0 ) AND\r
1643                          ((table.cub(xx2,yy2,zz2) = Numjoueur ) OR\r
1644                           (table.cub(xx3,yy3,zz3) = Numjoueur ))\r
1645                          AND (priorite >3)\r
1646                          AND (nbpion1 = 3)\r
1647                       Then\r
1648                          priorite := 3;\r
1649                          ptarr.x := x1;\r
1650                          ptarr.y := y1;\r
1651                          ptarr.z := z1;\r
1652                          If table.cub(xx2,yy2,zz2) = Numjoueur\r
1653                          Then\r
1654                             pion11.x := xx2;\r
1655                             pion11.y := yy2;\r
1656                             pion11.z := zz2;\r
1657                          Else\r
1658                             pion11.x := xx3;\r
1659                             pion11.y := yy3;\r
1660                             pion11.z := zz3;\r
1661                          Fi;\r
1662                       Fi;\r
1663                       (** On situe les 3 pions du joueur 1 **)\r
1664                       If table.cub(x1,y1,z1) = Numjoueur\r
1665                       Then\r
1666                          If cpt = 1 Then\r
1667                             pion1.x := x1;\r
1668                             pion1.y := y1;\r
1669                             pion1.z := z1;\r
1670                          Fi;\r
1671                          If cpt = 2 Then\r
1672                             pion2.x := x1;\r
1673                             pion2.y := y1;\r
1674                             pion2.z := z1;\r
1675                          Fi;\r
1676                          If cpt = 3 Then\r
1677                             pion3.x := x1;\r
1678                             pion3.y := y1;\r
1679                             pion3.z := z1;\r
1680                          Fi;\r
1681                          cpt := cpt + 1;\r
1682                       Fi;\r
1683  \r
1684                    Fi;\r
1685                Od;\r
1686            Od;\r
1687        Od;\r
1688  \r
1689        (** Priorite = 4 **)\r
1690  \r
1691        (** Placement aleatoire **)\r
1692  \r
1693        If priorite = 4 Then\r
1694           call RandomPlac(0);\r
1695        Fi;\r
1696  \r
1697        (** Determination du point de depart **)\r
1698  \r
1699        If ((priorite = 1) And (Numjoueur = 1)) OR\r
1700           ((priorite = 2) And (Numjoueur = 2))\r
1701        Then\r
1702           If ((pion3.x<>pion11.x) Or (pion3.y<>pion11.y) Or (pion3.z<>pion11.z))\r
1703              AND\r
1704              ((pion3.x<>pion12.x) Or (pion3.y<>pion12.y) Or (pion3.z<>pion12.z))\r
1705           Then\r
1706              ptdep.x := pion3.x;\r
1707              ptdep.y := pion3.y;\r
1708              ptdep.z := pion3.z;\r
1709           Fi;\r
1710           If ((pion2.x<>pion11.x) Or (pion2.y<>pion11.y) Or (pion2.z<>pion11.z))\r
1711             AND\r
1712             ((pion2.x<>pion12.x) Or (pion2.y<>pion12.y) Or (pion2.z<>pion12.z))\r
1713           Then\r
1714              ptdep.x := pion2.x;\r
1715              ptdep.y := pion2.y;\r
1716              ptdep.z := pion2.z;\r
1717           Fi;\r
1718           If ((pion1.x<>pion11.x) Or (pion1.y<>pion11.y) Or (pion1.z<>pion11.z))\r
1719             AND\r
1720             ((pion1.x<>pion12.x) Or (pion1.y<>pion12.y) Or (pion1.z<>pion12.z))\r
1721           Then\r
1722              ptdep.x := pion1.x;\r
1723              ptdep.y := pion1.y;\r
1724              ptdep.z := pion1.z;\r
1725           Fi;\r
1726        Fi;\r
1727  \r
1728        If priorite = 3 Then\r
1729           If (pion1.x<>pion11.x) Or (pion1.y<>pion11.y) Or (pion1.z<>pion11.z)\r
1730           Then\r
1731              ptdep.x := pion1.x;\r
1732              ptdep.y := pion1.y;\r
1733              ptdep.z := pion1.z;\r
1734           Else\r
1735              ptdep.x := pion2.x;\r
1736              ptdep.y := pion2.y;\r
1737              ptdep.z := pion2.z;\r
1738           Fi;\r
1739        Fi;\r
1740  \r
1741        If ((priorite = 2) And (Numjoueur = 1)) Or\r
1742           ((priorite = 1) And (Numjoueur = 2)) Or\r
1743           (priorite = 4)\r
1744        Then\r
1745           ptdep.x := pion1.x;\r
1746           ptdep.y := pion1.y;\r
1747           ptdep.z := pion1.z;\r
1748        Fi;\r
1749  \r
1750        kill (pion1);\r
1751        kill (pion2);\r
1752        kill (pion3);\r
1753        kill (pion11);\r
1754        kill (pion12);\r
1755  \r
1756        For i := 1 To temps Do\r
1757            call color(10);\r
1758            call AffichPt(ptdep);\r
1759            call HASCII(0);\r
1760            call HASCII(219);\r
1761            call AffichPt(ptarr);\r
1762            call HASCII(0);\r
1763            call HASCII(ord('#'));\r
1764        Od;\r
1765  \r
1766 END Phase2;\r
1767  \r
1768 (*************************************************************************)\r
1769 (**  Phase "Manger"  a la suite d'un alignement                         **)\r
1770 (**  Cette phase est commune au deux joueurs                            **)\r
1771 (*************************************************************************)\r
1772  \r
1773  \r
1774 UNIT Phase3 : PROCEDURE ( lig1 , lig2 : ligne );\r
1775  \r
1776 VAR priorite, prox                     : integer,\r
1777     x1, x2, x3, y1, y2, y3, z1, z2, z3 : integer ,\r
1778     xx2, xx3, yy2, yy3, zz2, zz3       : integer ,\r
1779     i, j, k                            : integer ,\r
1780     sortie                             : boolean;\r
1781  \r
1782 BEGIN\r
1783  \r
1784        priorite := 4 ; (* priorite initialise au maximum *)\r
1785  \r
1786        For k := 1 To 3 Do\r
1787            For j := 1 To 3 Do\r
1788                For i := 1 To 3 Do\r
1789                    call RechLignesCrois(i,j,k,lig1,lig2,sortie);\r
1790  \r
1791                    x1 := lig1.pt1.x;   y1 := lig1.pt1.y;   z1 := lig1.pt1.z;\r
1792                    x2 := lig1.pt2.x;   y2 := lig1.pt2.y;   z2 := lig1.pt2.z;\r
1793                    x3 := lig1.pt3.x;   y3 := lig1.pt3.y;   z3 := lig1.pt3.z;\r
1794  \r
1795                    xx2 := lig2.pt2.x;   yy2 := lig2.pt2.y;   zz2 := lig2.pt2.z;\r
1796                    xx3 := lig2.pt3.x;   yy3 := lig2.pt3.y;   zz3 := lig2.pt3.z;\r
1797  \r
1798                    If Sortie Then\r
1799  \r
1800                       (** Priorite = 1 **)\r
1801  \r
1802                       (** Si l'adversaire a une possibilite d'aligner 3\r
1803                           pions au prochain coup on lui en mange un  **)\r
1804  \r
1805                       If (table.cub(x1, y1, z1) = 0) AND\r
1806                          (table.cub(x2, y2, z2) = (3 - Numjoueur)) AND\r
1807                          (table.cub(x3, y3, z3) = (3 - Numjoueur))\r
1808                       Then\r
1809                          prox := RechPtProx(lig2);\r
1810                          If ((( prox = 1) OR (prox = 3)) AND\r
1811                               (table.cub(xx2,yy2,zz2)= (3 - Numjoueur)))OR\r
1812                             (((prox = 2) OR (prox = 3)) AND\r
1813                              (table.cub(xx3,yy3,zz3)= (3 - Numjoueur)))\r
1814                          Then\r
1815                             priorite := 1 ;\r
1816                             prox := RechPtProx(lig1);\r
1817                             If prox = 1 Then\r
1818                                ptmange.x := x2;\r
1819                                ptmange.y := y2;\r
1820                                ptmange.z := z2;\r
1821                             Else\r
1822                                ptmange.x := x3;\r
1823                                ptmange.y := y3;\r
1824                                ptmange.z := z3;\r
1825                             Fi;\r
1826                             exit;exit;exit;\r
1827                          Fi;\r
1828                       Fi;\r
1829  \r
1830                       If (table.cub(x1, y1, z1) = 0) AND\r
1831                          (table.cub(xx2, yy2, zz2) = (3 - Numjoueur)) AND\r
1832                          (table.cub(xx3, yy3, zz3) = (3 - Numjoueur))\r
1833                       Then\r
1834                          prox := RechPtProx(lig1);\r
1835                          If (((prox = 1) OR (prox = 3)) AND\r
1836                              (table.cub(x2,y2,z2)= (3 - Numjoueur)))OR\r
1837                             (((prox = 2) OR (prox = 3)) AND\r
1838                              (table.cub(x3,y3,z3)= (3 - Numjoueur)))\r
1839                          Then\r
1840                             priorite := 1 ;\r
1841                             prox := RechPtProx(lig2);\r
1842                             If prox = 1 Then\r
1843                                ptmange.x := xx2;\r
1844                                ptmange.y := yy2;\r
1845                                ptmange.z := zz2;\r
1846                             Else\r
1847                                ptmange.x := xx3;\r
1848                                ptmange.y := yy3;\r
1849                                ptmange.z := zz3;\r
1850                             Fi;\r
1851                             exit;exit;exit;\r
1852                          Fi;\r
1853                       Fi;\r
1854  \r
1855                       (** Priorite = 2 **)\r
1856  \r
1857                       (** Si l'adversaire a trois pions alignes on lui en\r
1858                           mange un         **)\r
1859  \r
1860                       If (table.cub (x1, y1, z1) = (3 - Numjoueur))\r
1861                          AND\r
1862                          (table.cub (x2, y2, z2) = (3 - Numjoueur))\r
1863                          AND\r
1864                          (table.cub (x3, y3, z3) = (3 - Numjoueur))\r
1865                          AND\r
1866                          (priorite > 2)\r
1867                       Then\r
1868                          priorite := 2;\r
1869                          ptmange.x := x1;\r
1870                          ptmange.y := y1;\r
1871                          ptmange.z := z1;\r
1872                       Fi;\r
1873  \r
1874                       If (table.cub (x1, y1, z1) = (3 - Numjoueur))\r
1875                          AND\r
1876                          (table.cub (xx2, yy2, zz2) = (3 - Numjoueur))\r
1877                          AND\r
1878                          (table.cub (xx3, yy3, zz3) = (3 - Numjoueur))\r
1879                          AND\r
1880                          (priorite > 2)\r
1881                       Then\r
1882                          priorite := 2;\r
1883                          ptmange.x := x1;\r
1884                          ptmange.y := y1;\r
1885                          ptmange.z := z1;\r
1886                       Fi;\r
1887  \r
1888                       (** Priorite = 3 **)\r
1889  \r
1890                       (** Si on a possibilite d'aligner 3 pions au prochain\r
1891                           coup et que l'adversaire nous bloque on lui mange\r
1892                           le pion                **)\r
1893  \r
1894                       If (priorite > 3) AND\r
1895                          (table.cub (x1, y1, z1) = (3 - Numjoueur))\r
1896                          AND\r
1897                          (table.cub (x2, y2, z2) = Numjoueur)\r
1898                          AND\r
1899                          (table.cub (x3, y3, z3) = Numjoueur)\r
1900                       Then\r
1901                          prox := RechPtProx(lig2);\r
1902                          If (((prox = 1) OR (prox = 3)) AND\r
1903                              (table.cub(xx2,yy2,zz2) = Numjoueur))\r
1904                             OR\r
1905                             (((prox = 2) OR (prox = 3)) AND\r
1906                              (table.cub(xx3,yy3,zz3) = Numjoueur))\r
1907                          Then\r
1908                             priorite := 3;\r
1909                             ptmange.x := x1;\r
1910                             ptmange.y := y1;\r
1911                             ptmange.z := z1;\r
1912                          Fi;\r
1913                       Fi;\r
1914  \r
1915                       If (priorite > 3) AND\r
1916                          (table.cub (x1, y1, z1) = (3 - Numjoueur))\r
1917                          AND\r
1918                          (table.cub (xx2, yy2, zz2) = Numjoueur)\r
1919                          AND\r
1920                          (table.cub (xx3, yy3, zz3) = Numjoueur)\r
1921                       Then\r
1922                          prox := RechPtProx(lig1);\r
1923                          If (((prox = 1) OR (prox = 3)) AND\r
1924                              (table.cub(x2,y2,z2) = Numjoueur))\r
1925                             OR\r
1926                             (((prox = 2) OR (prox = 3)) AND\r
1927                              (table.cub(x3,y3,z3) = Numjoueur))\r
1928                          Then\r
1929                             priorite := 3;\r
1930                             ptmange.x := x1;\r
1931                             ptmange.y := y1;\r
1932                             ptmange.z := z1;\r
1933                          Fi;\r
1934                       Fi;\r
1935                    Fi;\r
1936                Od;\r
1937            Od;\r
1938        Od;\r
1939  \r
1940        (** Priorite = 4 **)\r
1941  \r
1942        (** Placement aleatoire sur un pion du joueur adverse **)\r
1943  \r
1944        If priorite = 4 Then\r
1945           i := 3 - Numjoueur;\r
1946           call RandomPlac(i);\r
1947           ptmange.x := ptarr.x;\r
1948           ptmange.y := ptarr.y;\r
1949           ptmange.z := ptarr.z;\r
1950        Fi;\r
1951  \r
1952        For i := 1 To temps Do\r
1953            call color(10);\r
1954            call AffichPt(ptmange);\r
1955            call HASCII(0);\r
1956            call HASCII(219);\r
1957        Od;\r
1958  \r
1959 END Phase3;\r
1960  \r
1961  \r
1962 (***************************************************************************)\r
1963 (**                                                                       **)\r
1964 (**                      Coroutine  :   JOUEUR1                           **)\r
1965 (**                                                                       **)\r
1966 (**                      Strategie      offensive                         **)\r
1967 (**                                                                       **)\r
1968 (***************************************************************************)\r
1969  \r
1970  \r
1971 UNIT joueur1 : COROUTINE;\r
1972  \r
1973 BEGIN\r
1974  \r
1975   return;\r
1976  \r
1977  \r
1978   DO\r
1979  \r
1980     IF phase = 0\r
1981     THEN\r
1982      (* Placement des pions *)\r
1983  \r
1984       Call phase0 ( lig1, lig2 );\r
1985  \r
1986       detach; (** Retour a la coroutine Arbitre **)\r
1987  \r
1988     FI; (** Fin de la phase 0 ; Placement de pion **)\r
1989  \r
1990  \r
1991     IF phase = 1 THEN\r
1992     (** deplacement d'un pion si le joueur 1 a plus de 3 pions **)\r
1993  \r
1994        call Phase1 (lig1 , lig2);\r
1995  \r
1996        detach; (** Retour a la coroutine Arbitre **)\r
1997  \r
1998     Fi; (** Fin phase = 1 ; Deplacement de pions . Nbpion1 >3 **)\r
1999  \r
2000  \r
2001  \r
2002  \r
2003     IF phase = 2 THEN\r
2004     (* Deplacement de pions si le nombre de pions du joueur 1 est <= a 3 *)\r
2005  \r
2006        Call Phase2 (lig1 , lig2);\r
2007  \r
2008        detach; (** Retour a la coroutine Arbitre **)\r
2009  \r
2010     FI; (** Fin phase = 2; Deplacement de pions. Nbpion1 <= 3 **)\r
2011  \r
2012  \r
2013  \r
2014  \r
2015     IF phase = 3 THEN\r
2016     (* Le joueur 1 mange un des pions du joueur 2 *)\r
2017  \r
2018        Call Phase3 (lig1 , lig2);\r
2019  \r
2020     detach; (** Retour a la coroutine Arbitre **)\r
2021  \r
2022     FI; (** Fin phase = 3; Manger Pion **)\r
2023  \r
2024 OD;\r
2025  \r
2026 END joueur1;\r
2027  \r
2028  \r
2029  \r
2030 (***************************************************************************)\r
2031 (**                                                                       **)\r
2032 (**                      Coroutine  :   JOUEUR2                           **)\r
2033 (**                                                                       **)\r
2034 (**                      Strategie      defensive                         **)\r
2035 (**                                                                       **)\r
2036 (***************************************************************************)\r
2037  \r
2038  \r
2039  \r
2040 UNIT joueur2 : COROUTINE;\r
2041  \r
2042  \r
2043 BEGIN\r
2044  \r
2045   return;\r
2046  \r
2047  \r
2048   DO\r
2049  \r
2050     IF phase = 0\r
2051     THEN\r
2052      (* Placement des pions *)\r
2053  \r
2054       Call phase0 ( lig1, lig2 );\r
2055  \r
2056       detach; (** Retour a la coroutine Arbitre **)\r
2057  \r
2058     FI; (** Fin de la phase 0 ; Placement de pion **)\r
2059  \r
2060  \r
2061     IF phase = 1 THEN\r
2062     (** deplacement d'un pion si le joueur 1 a plus de 3 pions **)\r
2063  \r
2064        call Phase1 (lig1 , lig2);\r
2065  \r
2066        detach; (** Retour a la coroutine Arbitre **)\r
2067  \r
2068     Fi; (** Fin phase = 1 ; Deplacement de pions . Nbpion1 >3 **)\r
2069  \r
2070  \r
2071  \r
2072  \r
2073     IF phase = 2 THEN\r
2074     (* Deplacement de pions si le nombre de pions du joueur 1 est <= a 3 *)\r
2075  \r
2076        Call Phase2 (lig1 , lig2);\r
2077  \r
2078        detach; (** Retour a la coroutine Arbitre **)\r
2079  \r
2080     FI; (** Fin phase = 2; Deplacement de pions. Nbpion1 <= 3 **)\r
2081  \r
2082  \r
2083  \r
2084  \r
2085     IF phase = 3 THEN\r
2086     (* Le joueur 1 mange un des pions du joueur 2 *)\r
2087  \r
2088        Call Phase3 (lig1 , lig2);\r
2089  \r
2090     detach; (** Retour a la coroutine Arbitre **)\r
2091  \r
2092     FI; (** Fin phase = 3; Manger Pion **)\r
2093  \r
2094 OD;\r
2095  \r
2096 END joueur2;\r
2097  \r
2098  \r
2099 (***************************************************************************)\r
2100 (**                                                                       **)\r
2101 (**                      Coroutine  :   ARBITRE                           **)\r
2102 (**                                                                       **)\r
2103 (***************************************************************************)\r
2104  \r
2105  \r
2106  \r
2107 UNIT arbitre : COROUTINE ;\r
2108  \r
2109  \r
2110      Unit VerifPt : Class;\r
2111  \r
2112      (** Verifie :\r
2113             - si un joueur a place ou deplace un pion sur une case deja occupee\r
2114             - si 3 pions ont ete alignes lors du dernier coup joue\r
2115          Valide ou annule le coup        **)\r
2116  \r
2117      Var sortie    : boolean;\r
2118  \r
2119      Begin\r
2120  \r
2121        (**  Verification de la validit\82 du point d'arrivee **)\r
2122        okpt := (table.cub(ptarr.x,ptarr.y,ptarr.z)=0);\r
2123  \r
2124        If okpt Then\r
2125  \r
2126           If (phase = 1) Or (phase = 2) Then\r
2127              table.cub(ptdep.x,ptdep.y,ptdep.z) := 0;\r
2128              call color(15);\r
2129              call AffichPt(ptdep);\r
2130              call HASCII(0);\r
2131              call HASCII(ord('+'));\r
2132           Fi;\r
2133  \r
2134           (** Mise a jour de la table de jeu : le cube **)\r
2135  \r
2136           table.cub(ptarr.x,ptarr.y,ptarr.z) := numjoueur ;\r
2137           If numjoueur = 1 Then\r
2138              call color(3);\r
2139           Else\r
2140              call color(5);\r
2141           Fi;\r
2142           call AffichPt(ptarr);\r
2143           call HASCII(0);\r
2144           call HASCII(219);\r
2145  \r
2146           inner;\r
2147  \r
2148           (* verification aligne ==> manger *)\r
2149  \r
2150           Call RechLignesCrois (ptarr.x,ptarr.y,ptarr.z,lig1,lig2,sortie);\r
2151  \r
2152           aligne := ((table.cub(lig1.pt1.x,lig1.pt1.y,lig1.pt1.z)=Numjoueur) And\r
2153                      (table.cub(lig1.pt2.x,lig1.pt2.y,lig1.pt2.z)=Numjoueur) And\r
2154                      (table.cub(lig1.pt3.x,lig1.pt3.y,lig1.pt3.z)=Numjoueur));\r
2155  \r
2156           If not aligne Then\r
2157  \r
2158           aligne := ((table.cub(lig2.pt1.x,lig2.pt1.y,lig2.pt1.z)=Numjoueur) And\r
2159                      (table.cub(lig2.pt2.x,lig2.pt2.y,lig2.pt2.z)=Numjoueur) And\r
2160                      (table.cub(lig2.pt3.x,lig2.pt3.y,lig2.pt3.z)=Numjoueur));\r
2161  \r
2162           Fi;\r
2163  \r
2164        Else (* mauvais placement *)\r
2165           If table.cub(ptarr.x,ptarr.y,ptarr.z) = 1 Then\r
2166              call color(3);\r
2167           Else\r
2168              call color(5);\r
2169           Fi;\r
2170  \r
2171           call AffichPt(ptarr);\r
2172           call HASCII(0);\r
2173           call HASCII(219);\r
2174        Fi;\r
2175  \r
2176      End VerifPt;\r
2177  \r
2178  \r
2179  \r
2180  \r
2181      Unit VerifLigne : verifpt Class;\r
2182  \r
2183      (** Verifie lors de la phase du deplacement de plus de 3 pions le\r
2184          bon deplacement du pion :\r
2185          - sur la meme ligne\r
2186          - dans un point proche         **)\r
2187  \r
2188      Var Absx,Absy,Absz : integer ;\r
2189      Begin\r
2190         (* Si le deplacement n'est pas sur une ligne existante ou        *)\r
2191         (*    si le pion deplace a saute une ou plusieurs case           *)\r
2192         (*    alors le mouvement est mauvais                             *)\r
2193  \r
2194         Absx := Abs(ptdep.x - ptarr.x);\r
2195         Absy := Abs(ptdep.y - ptarr.y);\r
2196         Absz := Abs(ptdep.z - ptarr.z);\r
2197  \r
2198         If ((ptdep.x <> 2) And (ptdep.y <> 2) And (ptdep.z <> ptarr.z)) Or\r
2199            (Absx > 1) Or (Absy > 1) Or (Absz > 1) Or\r
2200            (Absx + Absy + Absz = 3) Or\r
2201            (Absx + Absy = 2) Or (Absx + Absz = 2) Or (Absz + Absy = 2)\r
2202         Then\r
2203            okligne := false;\r
2204  \r
2205            (* on remet le pion dans sa position initiale *)\r
2206            table.cub(ptdep.x,ptdep.y,ptdep.z):= numjoueur ;\r
2207            If numjoueur = 1 Then\r
2208               call color(3);\r
2209            Else\r
2210               call color(5);\r
2211            Fi;\r
2212  \r
2213            call AffichPt(ptdep);\r
2214            call HASCII(0);\r
2215            call HASCII(219);\r
2216  \r
2217            table.cub(ptarr.x,ptarr.y,ptarr.z):= 0 ;\r
2218            call color(15);\r
2219            call AffichPt(ptarr);\r
2220            call HASCII(0);\r
2221            call HASCII(ord('+'));\r
2222  \r
2223         Else\r
2224            okligne := true;\r
2225         Fi;\r
2226  \r
2227      End VerifLigne;\r
2228  \r
2229  \r
2230      Unit Gagne : Function : boolean;\r
2231  \r
2232      (** D\82termine si le joueur courant a gagne ou pas  **)\r
2233  \r
2234      Begin\r
2235        If (nbpion1 < 3) Or (nbpion2 < 3)\r
2236        Then\r
2237            result := true;\r
2238        Else result := false;\r
2239        Fi;\r
2240      End gagne;\r
2241  \r
2242  \r
2243      Unit PionAligne : Procedure;\r
2244  \r
2245          Unit VerifMange : Function : boolean;\r
2246  \r
2247          (** Verifie si le pion mange appartient bien au joueur adverse **)\r
2248  \r
2249          begin\r
2250  \r
2251             result:=(table.cub(ptmange.x,ptmange.y,ptmange.z) = (3-Numjoueur));\r
2252             If result\r
2253             Then\r
2254                table.cub(ptmange.x,ptmange.y,ptmange.z) := 0;\r
2255             else\r
2256                call Erreur1;\r
2257             Fi;\r
2258             If table.cub(ptmange.x,ptmange.y,ptmange.z) = 0\r
2259             Then\r
2260                call color(15);\r
2261                call AffichPt(ptmange);\r
2262                call HASCII (0);\r
2263                call HASCII(ord('+'));\r
2264             Fi;\r
2265             If table.cub(ptmange.x,ptmange.y,ptmange.z) = 1\r
2266             Then\r
2267                call color(3);\r
2268                call AffichPt(ptmange);\r
2269                call HASCII (0);\r
2270                call HASCII(219);\r
2271             Fi;\r
2272             If table.cub(ptmange.x,ptmange.y,ptmange.z) = 2\r
2273             Then\r
2274                call color(5);\r
2275                call AffichPt(ptmange);\r
2276                call HASCII (0);\r
2277                call HASCII(219);\r
2278             Fi;\r
2279  \r
2280          End VerifMange;\r
2281  \r
2282      (** Pionaligne : appel de la phase 3 et mise a jour du nombre de pions **)\r
2283  \r
2284      Var mange : boolean;\r
2285  \r
2286      Begin\r
2287  \r
2288        mange := false;\r
2289        While not mange Do\r
2290            phase := 3;\r
2291            call affichephase(phase);\r
2292            if numjoueur = 1 then\r
2293               attach(J1);\r
2294            else\r
2295               attach(J2);\r
2296            fi;\r
2297            mange := Verifmange;\r
2298        Od;\r
2299        If numjoueur = 1 Then\r
2300           nbpion2 := nbpion2 - 1;\r
2301        Else\r
2302           nbpion1 := nbpion1 - 1;\r
2303        Fi;\r
2304  \r
2305      End PionAligne;\r
2306  \r
2307  \r
2308  \r
2309 VAR\r
2310      nbpionpla  : integer,\r
2311      i          : integer,\r
2312  \r
2313      okpt       : boolean,\r
2314      aligne     : boolean,\r
2315      okligne    : boolean,\r
2316  \r
2317      verifpoint : verifpt,\r
2318      veriflig   : verifligne,\r
2319  \r
2320      erreur     : boolean,\r
2321      fini       : boolean;\r
2322  \r
2323 BEGIN\r
2324   numjoueur := 1;\r
2325   nbpionpla := 0;\r
2326   Call affichejoueur(numjoueur);\r
2327   return;\r
2328  \r
2329  \r
2330   (* PLACEMENT DES PIONS *)\r
2331  \r
2332   While nbpionpla < 18 Do\r
2333  \r
2334    phase := 0;\r
2335    Call affichephase(phase);\r
2336    If numjoueur = 1 Then\r
2337       attach(J1);\r
2338    Else\r
2339       attach(J2);\r
2340    Fi;\r
2341  \r
2342    VerifPoint := NEW VerifPt;\r
2343  \r
2344    If Not okpt Then\r
2345       call erreur1;\r
2346    Else\r
2347         nbpionpla := nbpionpla + 1;\r
2348         If aligne Then call PionAligne; Fi;\r
2349         numjoueur := 3 - numjoueur;\r
2350         Call affichejoueur(numjoueur);\r
2351    Fi;\r
2352    kill (VerifPoint);\r
2353   Od;\r
2354  \r
2355   (* DEPLACEMENT DES PIONS *)\r
2356  \r
2357   Do\r
2358  \r
2359    erreur := false;\r
2360    call affichejoueur(numjoueur);\r
2361  \r
2362    If numjoueur = 1 Then\r
2363       if nbpion1 <= 3 then\r
2364          phase := 2;\r
2365          call affichephase(phase);\r
2366          attach(J1);\r
2367       else\r
2368          phase := 1;\r
2369          call affichephase(phase);\r
2370          attach(J1);\r
2371       fi;\r
2372    Else\r
2373       if nbpion2 <= 3 then\r
2374          phase := 2;\r
2375          call affichephase(phase);\r
2376          attach(J2);\r
2377       else\r
2378          phase := 1;\r
2379          call affichephase(phase);\r
2380          attach(J2);\r
2381       fi;\r
2382    Fi;\r
2383  \r
2384    If ((numjoueur = 1) And (nbpion1 <= 3)) Or\r
2385       ((numjoueur = 2) And (nbpion2 <= 3))\r
2386    Then\r
2387       (** Moins de trois pions ==> Pas de verification sur le deplacement\r
2388           par rapport aux lignes      **)\r
2389       Verifpoint := NEW verifpt;\r
2390    Else\r
2391       Veriflig := NEW verifligne;\r
2392    Fi;\r
2393  \r
2394    If Not okpt Then\r
2395       call erreur1;\r
2396       erreur := true;\r
2397    Else If ((numjoueur = 1) And (nbpion1 > 3)) Or\r
2398            ((numjoueur = 2) And (nbpion2 > 3))\r
2399         Then\r
2400            if not okligne then\r
2401               call erreur1;\r
2402               erreur := true;\r
2403            else\r
2404               if aligne Then call PionAligne;fi;\r
2405            fi;\r
2406         Else if aligne Then call Pionaligne;fi;\r
2407         Fi;\r
2408  \r
2409         fini := gagne;\r
2410         If fini  Then\r
2411            call affichejoueur(numjoueur);\r
2412            call move (520,210);\r
2413            call HASCII(0) ; call HASCII(ord('G'));\r
2414            call HASCII(0) ; call HASCII(ord(' '));\r
2415            call HASCII(0) ; call HASCII(ord('A'));\r
2416            call HASCII(0) ; call HASCII(ord(' '));\r
2417            call HASCII(0) ; call HASCII(ord('G'));\r
2418            call HASCII(0) ; call HASCII(ord(' '));\r
2419            call HASCII(0) ; call HASCII(ord('N'));\r
2420            call HASCII(0) ; call HASCII(ord(' '));\r
2421            call HASCII(0) ; call HASCII(ord('E'));\r
2422            call HASCII(0) ; call HASCII(ord(' '));\r
2423            call HASCII(0) ; call HASCII(ord('!'));\r
2424            exit;\r
2425         Fi;\r
2426    Fi;\r
2427  \r
2428    If not erreur Then\r
2429       numjoueur := 3 - numjoueur;\r
2430       call affichejoueur(numjoueur);\r
2431    Fi;\r
2432  \r
2433    If ((numjoueur = 1) And (nbpion1 <= 3)) Or\r
2434       ((numjoueur = 2) And (nbpion2 <= 3))\r
2435    Then\r
2436       kill (verifpoint);\r
2437    Else\r
2438       kill (veriflig);\r
2439    Fi;\r
2440  \r
2441  \r
2442   Od;\r
2443  \r
2444 END arbitre;\r
2445  \r
2446 (** Programme principal **)\r
2447  \r
2448 CONST temps = 1000;\r
2449       (* Constante permettant de ralentir l'affichage *)\r
2450       (* Si l'execution est trop rapide il suffit d'augmenter cette constante*)\r
2451  \r
2452 VAR   table               : cube,\r
2453       tab                 : arrayof integer,\r
2454       Numjoueur           : integer,\r
2455       ptdep,ptarr,ptmange : elt,\r
2456       nbpion1, nbpion2    : integer,\r
2457       phase               : integer,\r
2458       lig1,lig2           : ligne,\r
2459       defense             : boolean,\r
2460       J1                  : joueur1,\r
2461       J2                  : joueur2,\r
2462       A                   : arbitre;\r
2463  \r
2464 BEGIN\r
2465    call GRON(0);\r
2466  \r
2467    table := NEW cube ;\r
2468    ptdep := NEW elt;\r
2469    ptarr := NEW elt;\r
2470    lig1  := NEW ligne;\r
2471    lig2  := NEW ligne;\r
2472    ptmange := NEW elt ;\r
2473    array tab dim (1:800);\r
2474    nbpion1, nbpion2 := 9;\r
2475  \r
2476    call AfficheTable;\r
2477  \r
2478    J1 := NEW joueur1;\r
2479    J2 := NEW joueur2;\r
2480    A := NEW arbitre;\r
2481    attach(A);\r
2482  \r
2483 END;\r
2484 END;\r
2485  \r