5 pref iiuwgraph block ;
\r
10 SortieProg : Boolean,
\r
14 UNIT couple : CLASS;
\r
15 Var absi, ordo :integer;
\r
18 UNIT Link : CLASS (Val: couple);
\r
27 UNIT empty : FUNCTION (p: pile): boolean;
\r
33 Result:= (p.top = none);
\r
37 UNIT push : FUNCTION ( Curseur :couple ; p: pile) : Pile;
\r
40 aux := New Link( Curseur);
\r
41 If(not empty(p)) then
\r
48 UNIT tete : FUNCTION ( P : pile ): couple;
\r
50 Result := new couple;
\r
51 If(not empty(p)) then
\r
52 Result := P.top.Val;
\r
56 UNIT pop : FUNCTION (p : pile): pile;
\r
61 lk := New Link(p.top.val);
\r
63 result.top:= p.top.next;
\r
71 UNIT matrice : CLASS ;
\r
72 var A: arrayof arrayof integer;
\r
76 UNIT sortie : FUNCTION ( Curseur : couple ) : boolean;
\r
78 If NOT((entree.absi = Curseur.absi) AND
\r
79 (entree.ordo = Curseur.ordo)) ANDIF
\r
80 ( (Curseur.absi = 1) OR (Curseur.absi = TailleMax.absi) OR
\r
81 (Curseur.ordo = 1) OR (Curseur.ordo = TailleMax.ordo) )
\r
89 UNIT droite : FUNCTION ( Curseur : couple ) : boolean;
\r
91 If ( Curseur.Absi <> TailleMax.Absi) ANDIF
\r
92 ( A(Curseur.absi + 1, Curseur.ordo) = 1 )
\r
100 UNIT gauche : FUNCTION ( Curseur : couple ) : boolean;
\r
102 If ( Curseur.Absi <> 1 ) ANDIF
\r
103 ( A(Curseur.absi-1 , Curseur.ordo) = 1)
\r
111 UNIT devant : FUNCTION ( Curseur : couple ) : boolean;
\r
113 If ( Curseur.Ordo <> TailleMax.Ordo) ANDIF
\r
114 ( A(Curseur.absi , Curseur.ordo+1) = 1 )
\r
122 UNIT derriere : FUNCTION ( Curseur : couple ) : boolean;
\r
124 If ( Curseur.Ordo <> 1 ) ANDIF
\r
125 ( A(Curseur.absi , Curseur.ordo-1) = 1 )
\r
136 UNIT CreatMat : PROCEDURE (mat : matrice);
\r
139 Array Mat.A Dim (1 : TailleMax.Absi);
\r
140 For i:= 1 To TailleMax.Absi Do
\r
141 Array Mat.A(i) dim (1 : TailleMax.Ordo);
\r
145 UNIT InitMat : PROCEDURE (mat : matrice);
\r
148 (* Initialisation de la matrice; toutes les cases sont des murs *)
\r
149 For i:= 1 To TailleMax.Ordo Do
\r
150 For j:= 1 To TailleMax.Absi Do
\r
159 (* Procedures n
\82cessaires
\85 l'affichage de la matrice *)
\r
161 UNIT Bold : PROCEDURE;
\r
163 write( chr(27), "[1m")
\r
166 UNIT Reverse : PROCEDURE;
\r
168 write( chr(27), "[7m")
\r
171 UNIT Normal : PROCEDURE;
\r
173 write( chr(27), "[0m")
\r
176 UNIT Underscore : PROCEDURE;
\r
178 write( chr(27), "[4m")
\r
181 UNIT EraseLine : PROCEDURE;
\r
183 write( chr(27), "[K")
\r
186 UNIT inchar : IIUWgraph FUNCTION : integer;
\r
191 If i <> 0 Then exit Fi;
\r
196 UNIT NewPage : PROCEDURE;
\r
198 write( chr(27), "[2J")
\r
201 UNIT SetCursor : PROCEDURE (row, column : integer);
\r
202 var c,d,e,f : char,
\r
209 i := column div 10;
\r
210 j := column mod 10;
\r
213 write( chr(27), "[", c, d, ";", e, f, "H")
\r
217 (* Procedure d'affichage du labyrinthe *)
\r
219 UNIT AffichageLaby : PROCEDURE ( Mat : matrice);
\r
226 For i:= 1 To TailleMax.Ordo Do
\r
229 For j := 1 To TailleMax.Absi Do
\r
233 Then (* On a un mur *)
\r
234 write (" ",chr(88));
\r
246 UNIT RechChemin : PROCEDURE ( Mat : matrice );
\r
248 Var SolExiste : boolean,
\r
249 Curseur,Elem : couple,
\r
254 UNIT AfficheChemin : PROCEDURE ( Curseur : couple , Retour : boolean );
\r
260 Call SetCursor ( Curseur.ordo + 1 , (Curseur.absi*2) + 1 );
\r
267 write ( chr(254) );
\r
269 Call SetCursor ( Curseur.ordo + 1, (Curseur.absi*2) + 1 );
\r
277 Call SetCursor (22,10);
\r
279 Call SetCursor (23,15);
\r
281 Call SetCursor (24,15);
\r
284 Curseur := New Couple ;
\r
285 Curseur.Absi := Entree.absi;
\r
286 Curseur.Ordo := Entree.Ordo;
\r
287 Mat.A ( Curseur.absi, Curseur.Ordo ) := 2;
\r
289 Call AfficheChemin ( Curseur , Retour );
\r
294 While (Not Mat.Sortie(curseur)) AND ( SolExiste )
\r
296 If Mat.Gauche(curseur)
\r
299 Call AfficheChemin ( Curseur, Retour );
\r
300 Elem := New Couple ;
\r
301 Elem.Absi := Curseur.Absi;
\r
302 Elem.Ordo := Curseur.Ordo;
\r
303 P := Push ( Elem , P );
\r
304 Curseur.absi := Curseur.absi - 1;
\r
305 Mat.A ( Curseur.Absi, Curseur.Ordo) := 2;
\r
306 Call AfficheChemin ( Curseur, Retour );
\r
308 If Mat.devant(curseur)
\r
311 Call AfficheChemin ( Curseur, Retour );
\r
312 Elem := New Couple;
\r
313 Elem.Absi := Curseur.Absi;
\r
314 Elem.Ordo := Curseur.ordo;
\r
315 P := Push ( Elem , P );
\r
316 Curseur.ordo := Curseur.ordo + 1;
\r
317 Mat.A(Curseur.Absi, Curseur.Ordo) := 2;
\r
318 Call AfficheChemin ( Curseur, Retour );
\r
320 If Mat.droite(curseur)
\r
323 Call AfficheChemin (Curseur, Retour );
\r
324 Elem := New Couple;
\r
325 Elem.absi := Curseur.absi;
\r
326 Elem.ordo := Curseur.ordo;
\r
327 P := push ( Elem ,P );
\r
328 Curseur.absi := curseur.absi + 1;
\r
329 Mat.A(Curseur.Absi, Curseur.Ordo) := 2;
\r
330 Call AfficheChemin ( Curseur, Retour );
\r
332 If Mat.Derriere(curseur)
\r
335 Call AfficheChemin(Curseur,Retour);
\r
336 Elem := New Couple;
\r
337 Elem.Absi := Curseur.absi;
\r
338 Elem.Ordo := Curseur.ordo;
\r
339 P := push ( Elem , P);
\r
340 Curseur.ordo := Curseur.ordo - 1;
\r
341 Mat.A(Curseur.absi, Curseur.Ordo) := 2;
\r
342 Call AfficheChemin ( Curseur,Retour );
\r
346 (* On revient sur un endroit defja visit
\82 *)
\r
348 Call AfficheChemin ( Curseur, Retour );
\r
349 Elem := New Couple;
\r
351 Curseur.Ordo:= Elem.Ordo;
\r
352 Curseur.Absi := Elem.Absi;
\r
355 Call AfficheChemin ( Curseur , Retour);
\r
357 SolExiste := false;
\r
366 If Curseur.Ordo = 1 then
\r
367 call SetCursor(1, (Curseur.Absi*2)+1);
\r
370 If Curseur.Ordo = TailleMax.Ordo then
\r
371 call SetCursor(TailleMax.Ordo+2, (Curseur.Absi*2)+1);
\r
374 If Curseur.Absi = 1 then
\r
375 call SetCursor (Curseur.Ordo+1, 1);
\r
378 If Curseur.Absi = TailleMax.Absi then
\r
379 call SetCursor ( Curseur.ordo+1, (TailleMax.Absi*2)+3);
\r
383 call SetCursor(22,15);
\r
384 write(" Le labyrinthe n'a pas de sortie ... ");
\r
387 call SetCursor(23,15);
\r
388 write(" Pour revenir au Menu :");
\r
390 write(" Tapez ",chr(17), chr(217));
\r
397 UNIT ChargeLaby : PROCEDURE (output Mat : Matrice);
\r
398 var i, j : integer;
\r
401 Mat := New Matrice;
\r
402 open(F,integer,unpack("donnees.lab"));
\r
404 get(F, Entree.Absi, Entree.Ordo, TailleMax.Absi, TailleMax.Ordo);
\r
405 call CreatMat(Mat);
\r
406 for i:= 1 to TailleMax.Ordo do
\r
407 for j:= 1 to TailleMax.Absi do
\r
412 call AffichageLaby(Mat);
\r
416 UNIT SauveLaby : PROCEDURE ( Entree : couple,
\r
417 TailleMax : couple,
\r
420 var i, j : integer;
\r
423 open(F,integer,unpack("donnees.lab"));
\r
425 put(f, Entree.Absi, Entree.Ordo, TailleMax.Absi, TailleMax.Ordo);
\r
426 for i:= 1 to TailleMax.Ordo do
\r
427 for j:= 1 to TailleMax.Absi do
\r
437 UNIT CreationLaby : PROCEDURE ( inout mat : matrice);
\r
439 UNIT CreationChemin : PROCEDURE (inout Mat : Matrice);
\r
440 var Curseur : couple,
\r
446 BLOCK; (* Affichage des moyens de deplacement du curseur *)
\r
451 Call SetCursor(2, 77);
\r
454 Call SetCursor(3, 77);
\r
457 Call SetCursor(4, 74);
\r
460 write(chr(17),"-|-",chr(16));
\r
464 Call SetCursor(5, 77);
\r
467 Call SetCursor(6, 77);
\r
471 Call SetCursor(22, 10);
\r
472 write("Deplacez vous
\85 l'aide des fl
\82ches ");
\r
473 Call SetCursor(23,15);
\r
474 write("Selectionnez l'");
\r
478 write(" du labyrinthe ");
\r
479 Call SetCursor(24, 15);
\r
480 write("Validez avec la touche ");
\r
482 write(chr(17),chr(217));
\r
484 End; (* block Affichage des moyens de deplacement du curseur *)
\r
487 BLOCK (* Validation de l'entree du Ladyrinthe *)
\r
493 While NOT ( (Entree.Ordo = 1) Or (Entree.Ordo = TailleMax.Ordo) Or
\r
494 (Entree.Absi = 1) Or (Entree.Absi = TailleMax.Absi) )
\r
496 (* Verification de la conformit
\82 de l'entr
\82e *)
\r
498 If Entree.Ordo <> 0
\r
503 Call SetCursor ( Entree.ordo + 1 , (Entree.Absi*2) + 1 );
\r
507 Call SetCursor ( 25, 10 ) ;
\r
508 write ("L'entr
\82e S
\82lectionn
\82e n'est pas conforme ... Recommencez");
\r
513 Call SetCursor ( 2, 3 );
\r
515 Call SetCursor (2, 3);
\r
518 Call SetCursor( 25, 10 );
\r
521 Call SetCursor (2 , 3);
\r
523 While (I <> 13) (* RC *)
\r
525 (* Avant de d
\82placer le curseur on reinscrit un mur
\r
526 dans la case non validee *)
\r
528 write(chr(88)); (* X *)
\r
529 Call SetCursor(Entree.ordo + 1 , ( Entree.Absi*2) + 1);
\r
534 (* Placement de l'entree suivant les touches frappees *)
\r
535 When 50 : If Entree.Ordo < TailleMax.Ordo
\r
538 Entree.Ordo := Entree.Ordo + 1;
\r
540 When 52 : If Entree.Absi > 1
\r
543 Entree.Absi := Entree.Absi - 1;
\r
545 When 54 : If Entree.Absi < TailleMax.Absi
\r
548 Entree.Absi := Entree.Absi + 1;
\r
550 When 56 : If Entree.Ordo > 1
\r
553 Entree.Ordo := Entree.Ordo - 1;
\r
555 Otherwise erreur:=True;
\r
558 (* On Place le curseur Sur les nouvelles coordonnees de l'entree *)
\r
559 Call SetCursor(Entree.ordo + 1 , ( Entree.Absi*2) + 1 );
\r
561 Call SetCursor(Entree.ordo + 1 , ( Entree.Absi*2) + 1 );
\r
567 (* Affichage D'un signe au point d'entree *)
\r
571 Call SetCursor ( 1, (Entree.Absi*2) + 1 );
\r
573 Call SetCursor ( 1, (Entree.Absi*2) + 1 );
\r
576 If Entree.Ordo = TailleMax.Ordo
\r
578 Call SetCursor ( Entree.Ordo + 2 , ( Entree.Absi*2 ) + 1 );
\r
580 Call SetCursor ( Entree.Ordo + 2 , ( Entree.Absi*2 ) + 1 );
\r
585 Call SetCursor ( Entree.Ordo + 1, 1);
\r
587 Call SetCursor ( Entree.Ordo + 1, 1);
\r
590 If Entree.Absi = TailleMax.Absi
\r
592 Call SetCursor ( Entree.Ordo + 1, (Entree.Absi* 2 ) + 3);
\r
594 Call SetCursor (Entree.Ordo + 1 , (Entree.Absi* 2) + 3);
\r
597 End; (* Block Validation de l'entree *)
\r
600 BLOCK (* Affichage des options *)
\r
603 Call SetCursor(10,74);
\r
606 Call SetCursor(11, 73);
\r
608 Call SetCursor(12, 75);
\r
611 Call SetCursor(23, 15);
\r
613 write("Choisissez les ");
\r
617 write(" du labyrinthe ");
\r
619 Call SetCursor(Entree.Ordo + 1 , (Entree.Absi*2) + 1 );
\r
621 End; (* Block Affichage des options *)
\r
624 BLOCK (* Validation du ou des Chemins du Labyrinthe *)
\r
627 (* Positionnement sur le point d'entree *)
\r
628 Curseur := New Couple;
\r
629 Curseur.Absi := Entree.absi;
\r
630 Curseur.Ordo := Entree.ordo;
\r
631 Mat.A(Entree.Absi, Entree.Ordo):= 1;
\r
637 (* Creation des chemins *)
\r
639 (* Affichage de la valeur de la case avant d
\82placement du curseur *)
\r
641 Call SetCursor(Curseur.Ordo+1, (Curseur.Absi*2) + 1);
\r
642 If Mat.A ( Curseur.Absi, Curseur.Ordo ) = 0
\r
648 Call SetCursor(Curseur.Ordo + 1 , (Curseur.Absi*2) + 1) ;
\r
655 (* Interpretation de la touche frapp
\82e *)
\r
656 When 50 : If Curseur.Ordo < TailleMax.Ordo
\r
659 Curseur.Ordo := Curseur.Ordo + 1;
\r
663 When 52 : If Curseur.Absi > 1
\r
666 Curseur.Absi := Curseur.Absi - 1;
\r
670 When 54 : If Curseur.Absi < TailleMax.Absi
\r
673 Curseur.Absi := Curseur.Absi + 1;
\r
677 When 56 : If Curseur.Ordo > 1
\r
680 Curseur.Ordo:= Curseur.Ordo-1;
\r
684 When 32 : If (Curseur.Ordo = Entree.Ordo) And
\r
685 (Curseur.Absi = Entree.Absi)
\r
687 (* On ne peut pas murer l'entree *)
\r
697 If ( I = 32 ) (*Si on veut murer *)
\r
699 Mat.A(Curseur.Absi,Curseur.Ordo) := 0 ;
\r
701 Mat.A(Curseur.Absi, Curseur.Ordo) := 1;
\r
706 (* Affichage du curseur sur la nouvelle case *)
\r
708 Call SetCursor (Curseur.Ordo + 1 ,(Curseur.Absi*2) + 1 );
\r
709 If Mat.A ( Curseur.Absi, Curseur.Ordo) = 1
\r
715 Call SetCursor(Curseur.Ordo + 1 , (Curseur.Absi*2) + 1 );
\r
721 Call SetCursor (Curseur.Ordo + 1, (Curseur.Absi * 2) + 1);
\r
723 If Mat.A ( Curseur.Absi, Curseur.Ordo) = 1
\r
729 Call SetCursor (Curseur.Ordo + 1, (Curseur.Absi * 2) + 1);
\r
732 End ; (* Block Validation des chemins *)
\r
734 END CreationChemin;
\r
736 BEGIN (* creation labyrinthe *)
\r
742 While (TailleMax.Ordo < 1) Or (TailleMax.Ordo > 20) Or
\r
743 (TailleMax.Absi < 1) Or (TailleMax.Absi > 30)
\r
745 (* Lecture de la taille du labyrinthe *)
\r
746 writeln(" Entrez la hauteur du labyrinthe ");
\r
747 write(" comprise entre 1 et 20 : ");
\r
748 readln(TailleMax.Ordo);
\r
750 writeln(" Entrez la largeur du labyrinthe");
\r
751 write(" comprise entre 1 et 30 : ");
\r
752 readln(TailleMax.Absi);
\r
756 Call CreatMat(mat);
\r
758 Call AffichageLaby(Mat);
\r
760 Call CreationChemin(Mat);
\r
761 call SetCursor(25,1);
\r
762 write(" Le labyrinthe cr
\82e est sauvegard
\82 dans le fichier DONNEES.LAB ... ");
\r
766 UNIT Menu : PROCEDURE (output Choix : char);
\r
772 call SetCursor(5,32);
\r
776 call SetCursor(9,20);
\r
779 call SetCursor(9,22);
\r
780 write("- Cr
\82ation d'un labyrinthe. ");
\r
782 call SetCursor(12,20);
\r
785 call SetCursor(12,22);
\r
786 write("- Chargement d'un labyrinthe.");
\r
788 call SetCursor(15,20);
\r
791 call SetCursor(15,22);
\r
792 write("- Sortie du programme.");
\r
794 call SetCursor(19,30);
\r
797 call SetCursor(22,20);
\r
798 write("Validez votre choix avec ");
\r
800 write(chr(17),chr(217));
\r
801 call SetCursor(19,38);
\r
803 while (ord(Choix) <> 49) AND (ord(Choix) <> 50) AND (ord(Choix) <> 51) do
\r
805 call SetCursor(24,10);
\r
806 write("Choix incorrect ");
\r
808 call SetCursor(19,38);
\r
814 BEGIN (* Programme principal *)
\r
816 SortieProg:= false;
\r
817 while not SortieProg do
\r
820 when 49 : Mat := New Matrice;
\r
821 Entree := New Couple;
\r
822 TailleMax := New Couple;
\r
823 call CreationLaby(mat);
\r
824 call SauveLaby(Entree, TailleMax, Mat, F);
\r
825 call RechChemin(Mat);
\r
831 when 50 : Mat := New Matrice;
\r
832 Entree := New Couple;
\r
833 TailleMax := New Couple;
\r
834 call ChargeLaby(Mat);
\r
835 call RechChemin(Mat);
\r
841 when 51 : SortieProg := True;
\r
844 end; (* End iiuwgraph *)
\r
846 END; (* End Programme *)
\r