5 (* auteur: VERNAZOBRES Fr
\82d
\82ric 1992/1993 *)
\r
7 pref iiuwgraph block;
\r
10 (****************************************************************************)
\r
11 (* Attente d'un caract
\82re
\85 lire au clavier *)
\r
12 (****************************************************************************)
\r
14 UNIT Readkey:FUNCTION:CHAR;
\r
25 (****************************************************************************)
\r
26 (* Affichage des allumettes *)
\r
27 (****************************************************************************)
\r
29 unit alumet:procedure(x,y:integer);
\r
32 call move(160+y*20,50+x*50);
\r
33 call draw(163+y*20,50+x*50);
\r
34 call draw(163+y*20,20+x*50);
\r
35 call draw(160+y*20,20+x*50);
\r
36 call draw(160+y*20,50+x*50);
\r
38 call cirb(161+y*20,20+x*50,3,10,10,4,2,3,2);
\r
45 UNIT dessin_all:procedure(x:integer);
\r
46 var i,j,k,s:integer;
\r
56 FOR i:=0 to ((x mod 16)+s-1)
\r
63 (****************************************************************************)
\r
64 (* Effacement d'une allumette *)
\r
65 (****************************************************************************)
\r
68 var i,j,s,t,k,l:integer,c:char,y,z:real;
\r
76 if (s=0) then j:=t mod 16-1 else j:=t mod (15*s+1) fi;
\r
81 call cirb(161+j*20,20+s*50+k,3,10,10,2,2,2,2);
\r
82 call move(157+j*20,18+s*50+k);
\r
84 call draw(162+j*20,11+s*50+k);
\r
85 call draw(165+j*20,18+s*50+k);
\r
86 for l:=1 to 300 do od;
\r
88 call cirb(161+j*20,20+s*50+k,3,10,10,0,2,2,2);
\r
89 call move(157+j*20,18+s*50+k);
\r
91 call draw(162+j*20,11+s*50+k);
\r
92 call draw(165+j*20,18+s*50+k);
\r
102 (****************************************************************************)
\r
103 (* Strategie nø1 (l'ordinateur gagne si le nb d'allumettes =/= 4n+5) *)
\r
104 (****************************************************************************)
\r
107 UNIT strategie1:coroutine;
\r
108 var g,l:integer,c:char,f:feu;
\r
115 if (x=0) then x:=1 fi;
\r
119 call move(100,280);
\r
122 if (rep=3) then call outstring(" strat
\82gie 1:") fi;
\r
123 call outstring(" j'enl
\8ave ");
\r
125 call outstring(" allumette(s)");
\r
126 for l:=1 to 6800 do od;
\r
130 call move(100,280);
\r
131 call outstring(" ");
\r
138 (****************************************************************************)
\r
139 (* Strategie Nø2 (arbre de jeu) *)
\r
140 (****************************************************************************)
\r
145 var valeur:integer,
\r
146 gauche,centre,droit:noeud;
\r
152 Unit arbre_jeu:procedure(nb:integer;inout pair:boolean;inout cpt:integer);
\r
159 if pair then cpt:=cpt-1 else cpt:=cpt+1 fi;
\r
162 if nb>1 then call arbre_jeu(nb-1,pair,cpt) fi;
\r
163 if nb>2 then call arbre_jeu(nb-2,pair,cpt) fi;
\r
164 if nb>3 then call arbre_jeu(nb-3,pair,cpt) fi;
\r
172 Unit undeuxtrois:procedure(nb:integer;output choix:integer);
\r
173 var cptg,cptc,cptd:integer,
\r
180 if nb>1 then call arbre_jeu(nb-1,pair,cptg) fi;
\r
181 if nb>2 then call arbre_jeu(nb-2,pair,cptc) fi;
\r
182 if nb>3 then call arbre_jeu(nb-3,pair,cptd) fi;
\r
183 if ((cptg<=cptc) and (cptg<=cptd))
\r
187 if ((cptc<=cptg) and (cptc<=cptd))
\r
191 if ((cptd<=cptg) and (cptd<=cptc))
\r
203 Unit strategie2:coroutine;
\r
204 var l:integer,f:feu;
\r
208 call move(100,280);
\r
209 call outstring(" je reflechis !!!");
\r
210 call undeuxtrois(nb,x);
\r
211 call move(100,280);
\r
212 call outstring(" ");
\r
213 call move(100,280);
\r
215 if (rep=3) then call outstring(" strat
\82gie 2:") fi;
\r
216 call outstring(" j'enl
\8ave ");
\r
218 call outstring(" allumette(s)");
\r
219 for l:=1 to 6800 do od;
\r
223 call move(100,280);
\r
224 call outstring(" ");
\r
238 (****************************************************************************)
\r
239 (* programme principal *)
\r
240 (****************************************************************************)
\r
242 var c,ch,car:char,x,rep,y,amoi,nb,g:integer,
\r
243 s1:strategie1,f:feu,s2:strategie2;
\r
249 write(chr(27),"[2J");
\r
253 writeln("1: Jouer contre l'ordinateur niveau facile");
\r
254 writeln("2: Jouer contre l'ordinateur niveau difficile ");
\r
255 writeln("3: Mode d
\82monstration");
\r
256 writeln("4: Sortir");
\r
258 write("R
\82ponse:");
\r
260 if (rep>0) and (rep<5) then exit fi;
\r
265 if (rep=4) then exit fi;
\r
273 write("Avec combien d'allumettes(2<= =>30) voulez vous jouer?: ")
\r
275 write("Avec combien d'allumettes(2<= =>16) voulez vous jouer?: ");
\r
279 if (nb>=2) and (nb<=30) then exit fi;
\r
281 if (nb>=2) and (nb<=15) then exit fi;
\r
291 write("Voulez vous commencer (y/n)?: ");
\r
293 if (c='y') orif (c='n') then exit fi;
\r
302 call draw(455,250);
\r
303 call draw(455,310);
\r
306 if (c='n') then g:=0 else g:=1 fi;
\r
307 if (rep=2) orif (rep=3) then s1:=new strategie1 fi;
\r
308 if (rep=1) orif (rep=3) then s2:=new strategie2 fi;
\r
312 call dessin_all(nb);
\r
315 if (nb=1) then exit fi;
\r
316 if (rep=1) orif (rep=3)
\r
323 if nb=1 then exit fi;
\r
331 call move(110,280);
\r
332 call outstring("Combien voulez vous enlever");
\r
333 call move(110,290);
\r
334 call outstring("d'allumettes (entre 1 et 3) ? : ");
\r
338 if (car='1') orif (car='2') orif (car='3')
\r
340 if (nb-x>=1) then exit fi;
\r
348 call move(100,280);
\r
349 call outstring(" ");
\r
350 call move(100,290);
\r
351 call outstring(" ");
\r
360 call move(210,290);
\r
363 if (rep=3) then call outstring("strategie 2: ") fi;
\r
364 call outstring("J'AI PERDU")
\r
368 call outstring("strategie 1: J'AI PERDU")
\r
370 call outstring("VOUS AVEZ PERDU")
\r