3 (************************************************************************)
\r
6 (** ORONOS Marielle & PELAT Joseph **)
\r
8 (** Jeu de strategie : ARAIGNEE **)
\r
10 (** Licence Informatique **)
\r
13 (** Universite de Pau et des Pays de l'Adour 2 Avril 1993 **)
\r
16 (************************************************************************)
\r
20 Pref iiuwgraph block; (** Utilisation du graphisme **)
\r
24 (************************************************************************)
\r
25 (** Structure de donnees utilisee pour representer la table de jeu : **)
\r
27 (************************************************************************)
\r
31 (****************************)
\r
32 (** 0 : le point est libre **)
\r
33 (** 1 : pion du joueur1 **)
\r
34 (** 2 : pion du joueur2 **)
\r
35 (****************************)
\r
37 VAR cub : arrayof arrayof arrayof integer ,
\r
40 array cub dim (1:3);
\r
42 array cub(i) dim (1:3) ;
\r
44 array cub(i,j) dim (1:3) ;
\r
50 (************************************************************************)
\r
51 (** Structure de donnees utilisee pour representer un point du cube **)
\r
52 (************************************************************************)
\r
55 VAR x,y,z : INTEGER ;
\r
59 (************************************************************************)
\r
60 (** Representation d'une ligne du cube **)
\r
61 (** Chaque ligne comporte 3 points **)
\r
62 (************************************************************************)
\r
64 UNIT ligne : CLASS ;
\r
65 VAR pt1,pt2,pt3 : elt ;
\r
73 (*************************************************************************)
\r
74 (** Determine la ligne et la colonne d'affichage d'un point du cube a **)
\r
76 (*************************************************************************)
\r
78 UNIT AffichPt : Procedure ( pt : elt);
\r
79 VAR lig,col : integer;
\r
82 If (pt.x <> 2) AND (pt.y = 2) Then
\r
85 If (pt.y = 1) AND ( pt.z = 1) Then
\r
88 If (pt.y = 1) AND ( pt.z = 2) Then
\r
91 If (pt.y = 1) AND ( pt.z = 3) Then
\r
94 If (pt.y = 3) AND ( pt.z = 1) Then
\r
97 If (pt.y = 3) AND ( pt.z = 2) Then
\r
100 If (pt.y = 3) AND ( pt.z = 3) Then
\r
103 If ( pt.x = 1) AND ( pt.z = 1) Then
\r
106 If ( pt.x = 1) AND ( pt.z = 2) Then
\r
109 If ( pt.x = 1) AND ( pt.z = 3) Then
\r
112 If ( pt.x = 3) AND ( pt.z = 1) Then
\r
115 If ( pt.x = 3) AND ( pt.z = 2) Then
\r
118 If ( pt.x = 3) AND ( pt.z = 3) Then
\r
121 If ( pt.x = 2) AND ( pt.y <> 2) Then
\r
124 call move ( col , lig);
\r
128 (*************************************************************************)
\r
129 (** Affichage du mot INTERDIT s'il y a une mauvaise action **)
\r
130 (*************************************************************************)
\r
132 UNIT Erreur1 : PROCEDURE;
\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
152 tab := GETMAP(300,20);
\r
155 For i := 1 To 10 Do
\r
158 tab := GETMAP(300,20);
\r
161 For i := 1 To 11 Do
\r
162 call HASCII(0);call Hascii (ord(' '));
\r
167 (*************************************************************************)
\r
168 (** Procedure pour l'affichage de la table de jeu **)
\r
169 (*************************************************************************)
\r
171 UNIT AfficheTable : Procedure ;
\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
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
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
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
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
230 (*************************************************************************)
\r
231 (** Affichage du joueur courant **)
\r
232 (*************************************************************************)
\r
234 UNIT AfficheJoueur : Procedure (i : integer);
\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
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
254 UNIT AffichePhase : Procedure (i : integer);
\r
257 call move(160,330) ;
\r
258 tab := GETMAP(600,340);
\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
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
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
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
342 For i := 1 To 20 Do
\r
343 call HASCII(0) ; call HASCII(ord(' '));
\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
356 Unit RechPtProx : function (lig : ligne) : integer ;
\r
358 (**********************************)
\r
359 (** Result = 1 ==> point 2 **)
\r
361 (** 3 point 3-2 **)
\r
362 (**********************************)
\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
372 IF (lig.pt1.z = (lig.pt2.z+1)) OR
\r
373 (lig.pt1.z = (lig.pt2.z-1))
\r
375 result := result + 1 ;
\r
378 IF (lig.pt1.z = (lig.pt3.z+1)) OR
\r
379 (lig.pt1.z = (lig.pt3.z-1))
\r
381 result := result + 2 ;
\r
384 ELSE (** Recherche des lignes a l'interieur d'un cadre **)
\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
391 result := result + 1 ;
\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
399 result := result + 2 ;
\r
405 (*************************************************************************)
\r
406 (** Procedure verifiant que la priorite 1 ou 2 (suivant l'appelant) **)
\r
407 (** peut etre validee **)
\r
408 (*************************************************************************)
\r
410 Unit DeplPrior12 : procedure (ligne1,ligne2:ligne;output sortie : boolean);
\r
412 Var prox : integer;
\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
421 prox := RechPtProx (ligne2);
\r
424 IF ((prox = 1) OR (prox = 3)) AND
\r
425 (table.cub(ligne2.pt2.x,ligne2.pt2.y,ligne2.pt2.z) = Numjoueur)
\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
435 IF ((prox = 2) OR (prox = 3)) AND
\r
436 (table.cub(ligne2.pt3.x,ligne2.pt3.y,ligne2.pt3.z) = Numjoueur)
\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
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
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
455 IF (table.cub(ligne2.pt2.x,ligne2.pt2.y,ligne2.pt2.z) = Numjoueur)
\r
457 ptdep.x := ligne2.pt2.x;
\r
458 ptdep.y := ligne2.pt2.y;
\r
459 ptdep.z := ligne2.pt2.z;
\r
461 ptdep.x := ligne2.pt3.x;
\r
462 ptdep.y := ligne2.pt3.y;
\r
463 ptdep.z := ligne2.pt3.z;
\r
465 ptarr.x := ligne1.pt1.x;
\r
466 ptarr.y := ligne1.pt1.y;
\r
467 ptarr.z := ligne1.pt1.z;
\r
476 (*************************************************************************)
\r
477 (** Procedure permettant de rechercher toutes les lignes valides dans **)
\r
479 (*************************************************************************)
\r
481 Unit RechLigne : procedure (i,j,k : integer;
\r
482 inout lig1 : ligne;
\r
483 output sortie : boolean);
\r
486 IF ((i = 2) OR (j = 2))
\r
488 (** Creation des lignes en profondeur **)
\r
490 IF i <> j (* la ligne du milieu du cube est inexistante *)
\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
510 (** Creation des lignes pour chaque cadre **)
\r
512 lig1.pt1.z ,lig1.pt2.z, lig1.pt3.z := k;
\r
514 If (( i = 1 ) AND ( j = 1 )) OR
\r
515 (( i = 3 ) AND ( j = 3 ))
\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
524 If (( i = 1 ) AND ( j = 3 )) OR
\r
525 (( i = 3 ) AND ( j = 1 ))
\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
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
545 Unit RechLignesCrois : procedure (i,j,k : integer;
\r
546 inout lig1,lig2 : ligne;
\r
547 output sortie : boolean);
\r
549 (** Cette procedure renvoie 2 lignes qui se croisent au point (i,j,k) *)
\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
559 IF (i = 2) OR (j = 2)
\r
561 (** Recherche des lignes qui s'intersectent avec celles en profondeur **)
\r
563 IF (i<>j) (* la ligne du milieu est inexistante *)
\r
566 (* creation de la ligne appartenant au cadre *)
\r
567 lig1.pt2.z,lig1.pt3.z := k;
\r
570 lig1.pt2.x := 1 ; (* Creation d'une *)
\r
571 lig1.pt3.x := 3 ; (* ligne *)
\r
572 lig1.pt2.y := j; (* horrizontale *)
\r
577 lig1.pt2.x := i; (* Creation d'une *)
\r
578 lig1.pt3.x := i; (* ligne *)
\r
579 lig1.pt2.y := 1 ; (* verticale *)
\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
606 (** Recherche des lignes qui se croisent dans le meme cadre **)
\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
611 (* les points sur la ligne horizontale ont la meme abscisse *)
\r
612 lig1.pt2.x,lig1.pt3.x := i;
\r
614 (* les points sur la ligne verticale ont la meme ordonnee *)
\r
615 lig2.pt2.y, lig2.pt3.y := j;
\r
617 (* Calcul des abscisses de la ligne verticale *)
\r
626 (* Calcul des ordonnees de la ligne horizontale *)
\r
637 End RechLignesCrois;
\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
645 Unit RandomPlac : Procedure ( n : integer );
\r
647 Var i, j, k : integer,
\r
652 ptarr.x := ((Round( a * 10000) ) mod 3) + 1; (* Calcul de *)
\r
654 ptarr.y := ((Round( b * 10000) ) mod 3) + 1; (* 3 coordonnees *)
\r
656 ptarr.z := ((Round( c * 10000) ) mod 3) + 1; (* aleatoires *)
\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
661 If (table.cub( ptarr.x, ptarr.y, ptarr.z ) <> n) OR
\r
662 ((ptarr.x = 2) AND (ptarr.y = 2))
\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
670 If table.cub(i,j,k) = n Then
\r
681 If (table.cub( ptarr.x, ptarr.y, ptarr.z ) <> n) OR
\r
682 ((ptarr.x = 2) AND (ptarr.y = 2))
\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
690 If table.cub(i,j,k) = n Then
\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
712 Unit RandomDepl : Procedure ( lig1, lig2: ligne, n : integer );
\r
714 Var trouve, sortie : boolean,
\r
715 i, j, k, prox : integer,
\r
721 WHILE not trouve Do
\r
723 ptdep.x := ((Round(a * 10000)) mod 3) + 1; (* Calcul *)
\r
725 ptdep.y := ((Round(b * 10000)) mod 3) + 1; (* du *)
\r
727 ptdep.z := ((Round(c * 10000)) mod 3) + 1; (* point de depart *)
\r
729 (* A partir du point calcule on cherche un point tel que sa valeur
\r
730 soit n dans la table *)
\r
732 If (table.cub( ptdep.x, ptdep.y, ptdep.z ) <> n) OR
\r
733 ((ptdep.x = 2) AND (ptdep.y = 2))
\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
741 If table.cub(i,j,k) = n Then
\r
752 If (table.cub( ptdep.x, ptdep.y, ptdep.z ) <> n) OR
\r
753 ((ptdep.x = 2) AND (ptdep.y = 2))
\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
761 If table.cub(i,j,k) = n Then
\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
776 If ((prox = 1) OR (prox = 3))
\r
777 AND (table.cub(lig1.pt2.x, lig1.pt2.y, lig1.pt2.z) = 0 )
\r
780 ptarr.x := lig1.pt2.x;
\r
781 ptarr.y := lig1.pt2.y;
\r
782 ptarr.z := lig1.pt2.z;
\r
785 If ((prox = 2) OR (prox = 3)) AND
\r
786 (table.cub(lig1.pt3.x, lig1.pt3.y, lig1.pt3.z) = 0 )
\r
789 ptarr.x := lig1.pt3.x;
\r
790 ptarr.y := lig1.pt3.y;
\r
791 ptarr.z := lig1.pt3.z;
\r
796 (* Recherche d'une case libre sur la ligne lig2 *)
\r
797 prox := RechPtProx (lig2);
\r
799 If ((prox = 1) OR (prox = 3))
\r
800 AND (table.cub(lig2.pt2.x, lig2.pt2.y, lig2.pt2.z) = 0 )
\r
803 ptarr.x := lig2.pt2.x;
\r
804 ptarr.y := lig2.pt2.y;
\r
805 ptarr.z := lig2.pt2.z;
\r
808 If ((prox = 2) OR (prox = 3)) AND
\r
809 (table.cub(lig2.pt3.x, lig2.pt3.y, lig2.pt3.z) = 0 )
\r
812 ptarr.x := lig2.pt3.x;
\r
813 ptarr.y := lig2.pt3.y;
\r
814 ptarr.z := lig2.pt3.z;
\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
829 (*************************************************************************)
\r
831 UNIT Phase0 : PROCEDURE ( lig1 , lig2 : ligne);
\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
840 priorite := 6; (* Par defaut priorite maximum *)
\r
846 (* Recherche de placement pour chaque ligne *)
\r
848 CALL RechLigne (i,j,k,lig1,sortie);
\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
856 (** Priorite = 1 **)
\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
864 (** ==>empechement d'alignement **)
\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
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
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
901 (** Priorite = 2 **)
\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
909 (** ==>empechement d'alignement **)
\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
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
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
945 (** Priorite = 5 **)
\r
947 (** Si le point de coordonnees (1,2,2) est libre on choisit **)
\r
950 IF (table.cub(1,2,2) = 0) AND (priorite = 6)
\r
967 (** On traite toutes les lignes qui s'intersectent **)
\r
973 (* Recherche pour chaque paire ligne qui s'intersectent *)
\r
975 CALL RechLignesCrois (i,j,k,lig1,lig2,sortie);
\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
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
986 (** Priorite = 3 **)
\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
994 IF (table.cub(x1,y1,z1) = 0) AND
\r
996 (((table.cub(x2,y2,z2) = 1) AND
\r
997 (table.cub(x3,y3,z3) = 0)) OR
\r
999 ((table.cub(x2,y2,z2) = 0) AND
\r
1000 (table.cub(x3,y3,z3) = 1))) AND
\r
1002 (((table.cub(xx2,yy2,zz2) = 1) AND
\r
1003 (table.cub(xx3,yy3,zz3) = 0)) OR
\r
1005 ((table.cub(xx2,yy2,zz2) = 0) AND
\r
1006 (table.cub(xx3,yy3,zz3) = 1)))
\r
1017 (** Priorite = 4 **)
\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
1025 IF (table.cub(x1,y1,z1) = 0) AND
\r
1027 (((table.cub(x2,y2,z2) = 2) AND
\r
1028 (table.cub(x3,y3,z3) = 0)) OR
\r
1030 ((table.cub(x2,y2,z2) = 0) AND
\r
1031 (table.cub(x3,y3,z3) = 2))) AND
\r
1033 (((table.cub(xx2,yy2,zz2) = 2) AND
\r
1034 (table.cub(xx3,yy3,zz3) = 0)) OR
\r
1036 ((table.cub(xx2,yy2,zz2) = 0) AND
\r
1037 (table.cub(xx3,yy3,zz3) = 2))) AND
\r
1055 (** Prioite = 6 **)
\r
1057 (** Recherche aleatoire du pion a placer **)
\r
1061 CALL RandomPlac (0);
\r
1065 For i := 1 To temps Do
\r
1067 call AffichPt(ptarr);
\r
1069 call HASCII(ord('#'));
\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
1081 UNIT Phase1 : PROCEDURE (lig1 , lig2 : ligne);
\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
1091 priorite := 6; (* Priorite initialise au maximum par defaut *)
\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
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
1103 call RechLignesCrois(i,j,k,lig1,lig2,sortie);
\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
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
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
1119 - joueur2 on place le pion du joueur2
\85 l'intersection
\r
1120 ==> empechement d'alignement **)
\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
1126 If numjoueur = 1 Then
\r
1131 call DeplPrior12 (lig1,lig2,ok);
\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
1142 If numjoueur = 1 Then
\r
1147 call DeplPrior12 (lig2,lig1,ok);
\r
1154 (** Priorite = 2 **)
\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
1160 - joueur1 on place le pion du joueur1
\85 l'intersection
\r
1161 ==> empechement d'alignement **)
\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
1168 If numjoueur = 2 Then
\r
1173 call DeplPrior12 (lig1,lig2,ok);
\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
1184 If numjoueur = 2 Then
\r
1189 call DeplPrior12 (lig2,lig1,ok);
\r
1195 (** Priorite = 3 **)
\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
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
1207 prox := RechPtProx(lig2);
\r
1208 If ((prox = 1) Or (prox = 3)) And
\r
1209 (table.cub(xx2,yy2,zz2) = 0)
\r
1220 If ((prox = 2) Or (prox = 3)) And
\r
1221 (table.cub(xx3,yy3,zz3) = 0)
\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
1240 prox := RechPtProx(lig1);
\r
1241 If ((prox = 1) Or (prox = 3)) And
\r
1242 (table.cub(x2,y2,z2) = 0)
\r
1253 If ((prox = 2) Or (prox = 3)) And
\r
1254 (table.cub(x3,y3,z3) = 0)
\r
1268 (** Priorite = 4 **)
\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
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
1280 (((table.cub(xx2,yy2,zz2) = Numjoueur)AND
\r
1281 (table.cub(xx3,yy3,zz3) = 0))OR
\r
1283 ((table.cub(xx3,yy3,zz3) = Numjoueur)AND
\r
1284 (table.cub(xx2,yy2,zz2) = 0)))
\r
1289 If table.cub(xx2,yy2,zz2) = Numjoueur
\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
1312 (((table.cub(x2,y2,z2) = Numjoueur)AND
\r
1313 (table.cub(x3,y3,z3) = 0))OR
\r
1315 ((table.cub(x3,y3,z3) = Numjoueur)AND
\r
1316 (table.cub(x2,y2,z2) = 0)))
\r
1321 If table.cub(x2,y2,z2) = Numjoueur
\r
1339 (** priorite = 5 **)
\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
1348 If (table.cub(x1,y1,z1) = 0) AND
\r
1350 (((table.cub(x2,y2,z2) = Numjoueur) AND
\r
1351 (table.cub(x3,y3,z3) = 0)) OR
\r
1353 ((table.cub(x2,y2,z2) = 0) AND
\r
1354 (table.cub(x3,y3,z3) = Numjoueur)))
\r
1358 (((table.cub(xx2,yy2,zz2) = Numjoueur) AND
\r
1359 (table.cub(xx3,yy3,zz3) = 0)) OR
\r
1361 ((table.cub(xx2,yy2,zz2) = 0) AND
\r
1362 (table.cub(xx3,yy3,zz3) = Numjoueur)))
\r
1369 prox := RechPtProx(lig1);
\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
1375 If ((prox = 1) OR (prox = 3)) AND
\r
1376 (table.cub(x2,y2,z2) = Numjoueur )
\r
1386 If ((prox = 2) OR (prox = 3)) AND
\r
1387 (table.cub(x3,y3,z3) = Numjoueur)
\r
1397 prox := RechPtProx(lig2);
\r
1398 If ((prox = 1) OR (prox = 3)) AND
\r
1399 (table.cub(xx2,yy2,zz2)=Numjoueur)
\r
1409 If ((prox=2) OR (prox =3)) AND
\r
1410 (table.cub(xx3,yy3,zz3)=Numjoueur)
\r
1420 If (prox = 1) Then
\r
1448 (** Priorite = 6 **)
\r
1450 (** Deplacement aleatoire **)
\r
1452 IF priorite = 6 Then
\r
1453 Call RandomDepl(lig1,lig2,Numjoueur);
\r
1456 For i := 1 To temps Do
\r
1458 call AffichPt (ptdep);
\r
1461 call Affichpt(ptarr);
\r
1463 call HASCII(ord('#'));
\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
1475 UNIT Phase2 : PROCEDURE (lig1 , lig2 : ligne );
\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
1490 pion11 := NEW elt;
\r
1491 pion12 := NEW elt;
\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
1499 call RechLignesCrois(i,j,k,lig1,lig2,sortie);
\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
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
1510 (** On recherche l'action a faire et on localise les pions
\r
1513 (** Priorite = 1 **)
\r
1515 (** On cherche
\85 aligner 3 pions du joueur1 ou
\r
1516 a contrer l'alignement **)
\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
1530 If Numjoueur = 1 Then
\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
1553 If Numjoueur = 1 Then
\r
1564 (** Priorite = 2 **)
\r
1566 (** On cherche a aligner 3 pions du joueur2 ou a
\r
1567 contrer l'alignement **)
\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
1581 If Numjoueur = 2 Then
\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
1604 If Numjoueur = 2 Then
\r
1615 (** Priorite = 3 **)
\r
1617 (** On essaie d'aligner 2 pions si le joueur possede
\r
1618 exactement 3 pions **)
\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
1630 If table.cub(x2,y2,z2) = Numjoueur
\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
1652 If table.cub(xx2,yy2,zz2) = Numjoueur
\r
1663 (** On situe les 3 pions du joueur 1 **)
\r
1664 If table.cub(x1,y1,z1) = Numjoueur
\r
1689 (** Priorite = 4 **)
\r
1691 (** Placement aleatoire **)
\r
1693 If priorite = 4 Then
\r
1694 call RandomPlac(0);
\r
1697 (** Determination du point de depart **)
\r
1699 If ((priorite = 1) And (Numjoueur = 1)) OR
\r
1700 ((priorite = 2) And (Numjoueur = 2))
\r
1702 If ((pion3.x<>pion11.x) Or (pion3.y<>pion11.y) Or (pion3.z<>pion11.z))
\r
1704 ((pion3.x<>pion12.x) Or (pion3.y<>pion12.y) Or (pion3.z<>pion12.z))
\r
1706 ptdep.x := pion3.x;
\r
1707 ptdep.y := pion3.y;
\r
1708 ptdep.z := pion3.z;
\r
1710 If ((pion2.x<>pion11.x) Or (pion2.y<>pion11.y) Or (pion2.z<>pion11.z))
\r
1712 ((pion2.x<>pion12.x) Or (pion2.y<>pion12.y) Or (pion2.z<>pion12.z))
\r
1714 ptdep.x := pion2.x;
\r
1715 ptdep.y := pion2.y;
\r
1716 ptdep.z := pion2.z;
\r
1718 If ((pion1.x<>pion11.x) Or (pion1.y<>pion11.y) Or (pion1.z<>pion11.z))
\r
1720 ((pion1.x<>pion12.x) Or (pion1.y<>pion12.y) Or (pion1.z<>pion12.z))
\r
1722 ptdep.x := pion1.x;
\r
1723 ptdep.y := pion1.y;
\r
1724 ptdep.z := pion1.z;
\r
1728 If priorite = 3 Then
\r
1729 If (pion1.x<>pion11.x) Or (pion1.y<>pion11.y) Or (pion1.z<>pion11.z)
\r
1731 ptdep.x := pion1.x;
\r
1732 ptdep.y := pion1.y;
\r
1733 ptdep.z := pion1.z;
\r
1735 ptdep.x := pion2.x;
\r
1736 ptdep.y := pion2.y;
\r
1737 ptdep.z := pion2.z;
\r
1741 If ((priorite = 2) And (Numjoueur = 1)) Or
\r
1742 ((priorite = 1) And (Numjoueur = 2)) Or
\r
1745 ptdep.x := pion1.x;
\r
1746 ptdep.y := pion1.y;
\r
1747 ptdep.z := pion1.z;
\r
1756 For i := 1 To temps Do
\r
1758 call AffichPt(ptdep);
\r
1761 call AffichPt(ptarr);
\r
1763 call HASCII(ord('#'));
\r
1768 (*************************************************************************)
\r
1769 (** Phase "Manger" a la suite d'un alignement **)
\r
1770 (** Cette phase est commune au deux joueurs **)
\r
1771 (*************************************************************************)
\r
1774 UNIT Phase3 : PROCEDURE ( lig1 , lig2 : ligne );
\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
1784 priorite := 4 ; (* priorite initialise au maximum *)
\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
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
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
1800 (** Priorite = 1 **)
\r
1802 (** Si l'adversaire a une possibilite d'aligner 3
\r
1803 pions au prochain coup on lui en mange un **)
\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
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
1816 prox := RechPtProx(lig1);
\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
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
1841 prox := RechPtProx(lig2);
\r
1855 (** Priorite = 2 **)
\r
1857 (** Si l'adversaire a trois pions alignes on lui en
\r
1860 If (table.cub (x1, y1, z1) = (3 - Numjoueur))
\r
1862 (table.cub (x2, y2, z2) = (3 - Numjoueur))
\r
1864 (table.cub (x3, y3, z3) = (3 - Numjoueur))
\r
1874 If (table.cub (x1, y1, z1) = (3 - Numjoueur))
\r
1876 (table.cub (xx2, yy2, zz2) = (3 - Numjoueur))
\r
1878 (table.cub (xx3, yy3, zz3) = (3 - Numjoueur))
\r
1888 (** Priorite = 3 **)
\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
1894 If (priorite > 3) AND
\r
1895 (table.cub (x1, y1, z1) = (3 - Numjoueur))
\r
1897 (table.cub (x2, y2, z2) = Numjoueur)
\r
1899 (table.cub (x3, y3, z3) = Numjoueur)
\r
1901 prox := RechPtProx(lig2);
\r
1902 If (((prox = 1) OR (prox = 3)) AND
\r
1903 (table.cub(xx2,yy2,zz2) = Numjoueur))
\r
1905 (((prox = 2) OR (prox = 3)) AND
\r
1906 (table.cub(xx3,yy3,zz3) = Numjoueur))
\r
1915 If (priorite > 3) AND
\r
1916 (table.cub (x1, y1, z1) = (3 - Numjoueur))
\r
1918 (table.cub (xx2, yy2, zz2) = Numjoueur)
\r
1920 (table.cub (xx3, yy3, zz3) = Numjoueur)
\r
1922 prox := RechPtProx(lig1);
\r
1923 If (((prox = 1) OR (prox = 3)) AND
\r
1924 (table.cub(x2,y2,z2) = Numjoueur))
\r
1926 (((prox = 2) OR (prox = 3)) AND
\r
1927 (table.cub(x3,y3,z3) = Numjoueur))
\r
1940 (** Priorite = 4 **)
\r
1942 (** Placement aleatoire sur un pion du joueur adverse **)
\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
1952 For i := 1 To temps Do
\r
1954 call AffichPt(ptmange);
\r
1962 (***************************************************************************)
\r
1964 (** Coroutine : JOUEUR1 **)
\r
1966 (** Strategie offensive **)
\r
1968 (***************************************************************************)
\r
1971 UNIT joueur1 : COROUTINE;
\r
1982 (* Placement des pions *)
\r
1984 Call phase0 ( lig1, lig2 );
\r
1986 detach; (** Retour a la coroutine Arbitre **)
\r
1988 FI; (** Fin de la phase 0 ; Placement de pion **)
\r
1992 (** deplacement d'un pion si le joueur 1 a plus de 3 pions **)
\r
1994 call Phase1 (lig1 , lig2);
\r
1996 detach; (** Retour a la coroutine Arbitre **)
\r
1998 Fi; (** Fin phase = 1 ; Deplacement de pions . Nbpion1 >3 **)
\r
2004 (* Deplacement de pions si le nombre de pions du joueur 1 est <= a 3 *)
\r
2006 Call Phase2 (lig1 , lig2);
\r
2008 detach; (** Retour a la coroutine Arbitre **)
\r
2010 FI; (** Fin phase = 2; Deplacement de pions. Nbpion1 <= 3 **)
\r
2016 (* Le joueur 1 mange un des pions du joueur 2 *)
\r
2018 Call Phase3 (lig1 , lig2);
\r
2020 detach; (** Retour a la coroutine Arbitre **)
\r
2022 FI; (** Fin phase = 3; Manger Pion **)
\r
2030 (***************************************************************************)
\r
2032 (** Coroutine : JOUEUR2 **)
\r
2034 (** Strategie defensive **)
\r
2036 (***************************************************************************)
\r
2040 UNIT joueur2 : COROUTINE;
\r
2052 (* Placement des pions *)
\r
2054 Call phase0 ( lig1, lig2 );
\r
2056 detach; (** Retour a la coroutine Arbitre **)
\r
2058 FI; (** Fin de la phase 0 ; Placement de pion **)
\r
2062 (** deplacement d'un pion si le joueur 1 a plus de 3 pions **)
\r
2064 call Phase1 (lig1 , lig2);
\r
2066 detach; (** Retour a la coroutine Arbitre **)
\r
2068 Fi; (** Fin phase = 1 ; Deplacement de pions . Nbpion1 >3 **)
\r
2074 (* Deplacement de pions si le nombre de pions du joueur 1 est <= a 3 *)
\r
2076 Call Phase2 (lig1 , lig2);
\r
2078 detach; (** Retour a la coroutine Arbitre **)
\r
2080 FI; (** Fin phase = 2; Deplacement de pions. Nbpion1 <= 3 **)
\r
2086 (* Le joueur 1 mange un des pions du joueur 2 *)
\r
2088 Call Phase3 (lig1 , lig2);
\r
2090 detach; (** Retour a la coroutine Arbitre **)
\r
2092 FI; (** Fin phase = 3; Manger Pion **)
\r
2099 (***************************************************************************)
\r
2101 (** Coroutine : ARBITRE **)
\r
2103 (***************************************************************************)
\r
2107 UNIT arbitre : COROUTINE ;
\r
2110 Unit VerifPt : Class;
\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
2117 Var sortie : boolean;
\r
2121 (** Verification de la validit
\82 du point d'arrivee **)
\r
2122 okpt := (table.cub(ptarr.x,ptarr.y,ptarr.z)=0);
\r
2126 If (phase = 1) Or (phase = 2) Then
\r
2127 table.cub(ptdep.x,ptdep.y,ptdep.z) := 0;
\r
2129 call AffichPt(ptdep);
\r
2131 call HASCII(ord('+'));
\r
2134 (** Mise a jour de la table de jeu : le cube **)
\r
2136 table.cub(ptarr.x,ptarr.y,ptarr.z) := numjoueur ;
\r
2137 If numjoueur = 1 Then
\r
2142 call AffichPt(ptarr);
\r
2148 (* verification aligne ==> manger *)
\r
2150 Call RechLignesCrois (ptarr.x,ptarr.y,ptarr.z,lig1,lig2,sortie);
\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
2156 If not aligne Then
\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
2164 Else (* mauvais placement *)
\r
2165 If table.cub(ptarr.x,ptarr.y,ptarr.z) = 1 Then
\r
2171 call AffichPt(ptarr);
\r
2181 Unit VerifLigne : verifpt Class;
\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
2188 Var Absx,Absy,Absz : integer ;
\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
2194 Absx := Abs(ptdep.x - ptarr.x);
\r
2195 Absy := Abs(ptdep.y - ptarr.y);
\r
2196 Absz := Abs(ptdep.z - ptarr.z);
\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
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
2213 call AffichPt(ptdep);
\r
2217 table.cub(ptarr.x,ptarr.y,ptarr.z):= 0 ;
\r
2219 call AffichPt(ptarr);
\r
2221 call HASCII(ord('+'));
\r
2230 Unit Gagne : Function : boolean;
\r
2232 (** D
\82termine si le joueur courant a gagne ou pas **)
\r
2235 If (nbpion1 < 3) Or (nbpion2 < 3)
\r
2238 Else result := false;
\r
2243 Unit PionAligne : Procedure;
\r
2245 Unit VerifMange : Function : boolean;
\r
2247 (** Verifie si le pion mange appartient bien au joueur adverse **)
\r
2251 result:=(table.cub(ptmange.x,ptmange.y,ptmange.z) = (3-Numjoueur));
\r
2254 table.cub(ptmange.x,ptmange.y,ptmange.z) := 0;
\r
2258 If table.cub(ptmange.x,ptmange.y,ptmange.z) = 0
\r
2261 call AffichPt(ptmange);
\r
2263 call HASCII(ord('+'));
\r
2265 If table.cub(ptmange.x,ptmange.y,ptmange.z) = 1
\r
2268 call AffichPt(ptmange);
\r
2272 If table.cub(ptmange.x,ptmange.y,ptmange.z) = 2
\r
2275 call AffichPt(ptmange);
\r
2282 (** Pionaligne : appel de la phase 3 et mise a jour du nombre de pions **)
\r
2284 Var mange : boolean;
\r
2289 While not mange Do
\r
2291 call affichephase(phase);
\r
2292 if numjoueur = 1 then
\r
2297 mange := Verifmange;
\r
2299 If numjoueur = 1 Then
\r
2300 nbpion2 := nbpion2 - 1;
\r
2302 nbpion1 := nbpion1 - 1;
\r
2310 nbpionpla : integer,
\r
2315 okligne : boolean,
\r
2317 verifpoint : verifpt,
\r
2318 veriflig : verifligne,
\r
2326 Call affichejoueur(numjoueur);
\r
2330 (* PLACEMENT DES PIONS *)
\r
2332 While nbpionpla < 18 Do
\r
2335 Call affichephase(phase);
\r
2336 If numjoueur = 1 Then
\r
2342 VerifPoint := NEW VerifPt;
\r
2347 nbpionpla := nbpionpla + 1;
\r
2348 If aligne Then call PionAligne; Fi;
\r
2349 numjoueur := 3 - numjoueur;
\r
2350 Call affichejoueur(numjoueur);
\r
2352 kill (VerifPoint);
\r
2355 (* DEPLACEMENT DES PIONS *)
\r
2360 call affichejoueur(numjoueur);
\r
2362 If numjoueur = 1 Then
\r
2363 if nbpion1 <= 3 then
\r
2365 call affichephase(phase);
\r
2369 call affichephase(phase);
\r
2373 if nbpion2 <= 3 then
\r
2375 call affichephase(phase);
\r
2379 call affichephase(phase);
\r
2384 If ((numjoueur = 1) And (nbpion1 <= 3)) Or
\r
2385 ((numjoueur = 2) And (nbpion2 <= 3))
\r
2387 (** Moins de trois pions ==> Pas de verification sur le deplacement
\r
2388 par rapport aux lignes **)
\r
2389 Verifpoint := NEW verifpt;
\r
2391 Veriflig := NEW verifligne;
\r
2397 Else If ((numjoueur = 1) And (nbpion1 > 3)) Or
\r
2398 ((numjoueur = 2) And (nbpion2 > 3))
\r
2400 if not okligne then
\r
2404 if aligne Then call PionAligne;fi;
\r
2406 Else if aligne Then call Pionaligne;fi;
\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
2428 If not erreur Then
\r
2429 numjoueur := 3 - numjoueur;
\r
2430 call affichejoueur(numjoueur);
\r
2433 If ((numjoueur = 1) And (nbpion1 <= 3)) Or
\r
2434 ((numjoueur = 2) And (nbpion2 <= 3))
\r
2436 kill (verifpoint);
\r
2446 (** Programme principal **)
\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
2453 tab : arrayof integer,
\r
2454 Numjoueur : integer,
\r
2455 ptdep,ptarr,ptmange : elt,
\r
2456 nbpion1, nbpion2 : integer,
\r
2458 lig1,lig2 : ligne,
\r
2459 defense : boolean,
\r
2467 table := NEW cube ;
\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
2476 call AfficheTable;
\r
2478 J1 := NEW joueur1;
\r
2479 J2 := NEW joueur2;
\r