Program LABYRINTHE; Begin Pref MOUSE Block Unit LABYGRAPH: IIUWGRAPH Class; Unit LIFO: Class; Unit ELEM: Class (S: SALLE); Var ANTE: ELEM; End ELEM; Unit PILE: Class; Var PREM: ELEM; End PILE; Unit EMPIL: Procedure (InOut E: ELEM; InOut P: PILE); Begin If Not VIDE (P) Then E.ANTE:= P.PREM; Fi; P.PREM:= E; End EMPIL; Unit DEPIL: Procedure (InOut P: PILE); Var AUX: ELEM; Begin If Not VIDE (P) Then AUX:= P.PREM; If AUX.ANTE=/=None Then P.PREM:= AUX.ANTE; Fi; Kill (AUX.S); Kill (AUX); Fi; End DEPIL; Unit VIDE: Function (P: PILE): Boolean; Begin Result:= (P.PREM=None); End VIDE; End LIFO; Unit PIECE: Class (N,E,S,O: Boolean; MARQUE: Boolean); End PIECE; Unit SALLE: Class (L,C: Integer; PC: PIECE); End SALLE; Unit PRINCE: Procedure (X,Y: Integer); Begin Call Move (X+5,Y+10); Call Draw (X+5,Y+6); Call Move (X+6,Y+5); Call Draw (X+6,Y+6); Call Move (X+7,Y+2); Call Draw (X+7,Y+3); Call Move (X+7,Y+5); Call Draw (X+7,Y+15); Call Point (X+6,Y+15); Call Move (X+8,Y+1); Call Draw (X+8,Y+10); Call Move (X+9,Y+1); Call Draw (X+9,Y+10); Call Move (X+10,Y+2); Call Draw (X+10,Y+3); Call Move (X+10,Y+5); Call Draw (X+10,Y+15); Call Move (X+11,Y+5); Call Draw (X+11,Y+6); Call Point (X+11,Y+15); Call Move (X+12,Y+6); Call Draw (X+12,Y+10); Call Draw (X+15,Y+13); Call Draw (X+15,Y+15); Call Move (X+14,Y+14); Call Draw (X+16,Y+14); End; Unit PRINCNORD: Procedure (OutPut PNORD: ArrayOf Integer); Var X,Y: Integer; Begin X:=0; Y:=0; Call Cls; Call Move (X+5,Y+10); Call Draw (X+5,Y+6); Call Move (X+6,Y+5); Call Draw (X+6,Y+6); Call Move (X+7,Y+2); Call Draw (X+7,Y+3); Call Move (X+7,Y+5); Call Draw (X+7,Y+15); Call Point (X+6,Y+14); Call Move (X+8,Y+1); Call Draw (X+8,Y+10); Call Move (X+9,Y+1); Call Draw (X+9,Y+10); Call Move (X+10,Y+2); Call Draw (X+10,Y+3); Call Move (X+10,Y+5); Call Draw (X+10,Y+15); Call Move (X+11,Y+5); Call Draw (X+11,Y+6); Call Point (X+11,Y+14); Call Move (X+12,Y+6); Call Draw (X+12,Y+10); Call Move (X+13,Y+10); Call Draw (X+13,Y+16); Call GOODGET (PNORD); End; Unit PRINCEST: Procedure (OutPut PEST: ArrayOf Integer); Var X,Y: Integer; Begin X:=0; Y:=0; Call Cls; Call Move (X+1,Y+13); Call Draw (X+4,Y+13); Call Draw (X+6,Y+11); Call Draw (X+6,Y+9); Call Draw (X+10,Y+5); Call Draw (X+10,Y+12); Call Draw (X+9,Y+13); Call Draw (X+7,Y+13); Call Draw (X+7,Y+14); Call Move (X+10,Y+1); Call Draw (X+10,Y+3); Call Move (X+11,Y+1); Call Draw (X+11,Y+10); Call Move (X+12,Y+1); Call Draw (X+12,Y+3); Call Point (X+13,Y+2); Call Move (X+12,Y+5); Call Draw (X+12,Y+15); Call Point (X+13,Y+15); Call Point (X+13,Y+7); Call Move (X+14,Y+8); Call Draw (X+15,Y+8); Call GOODGET (PEST); End; Unit PRINCSUD: Procedure (OutPut PSUD: ArrayOf Integer); Var X,Y: Integer; Begin X:=0; Y:=0; Call Cls; Call Move (X+4,Y+1); Call Draw (X+4,Y+9); Call Point (X+5,Y+10); Call Move (X+6,Y+10); Call Draw (X+6,Y+6); Call Move (X+7,Y+5); Call Draw (X+7,Y+6); Call Move (X+8,Y+2); Call Draw (X+8,Y+3); Call Move (X+8,Y+5); Call Draw (X+8,Y+15); Call Point (X+7,Y+16); Call Move (X+9,Y+1); Call Draw (X+9,Y+10); Call Move (X+10,Y+1); Call Draw (X+10,Y+10); Call Move (X+11,Y+2); Call Draw (X+11,Y+3); Call Move (X+11,Y+5); Call Draw (X+11,Y+15); Call Move (X+12,Y+5); Call Draw (X+12,Y+6); Call Move (X+12,Y+5); Call Draw (X+12,Y+6); Call Point (X+12,Y+16); Call Move (X+13,Y+6); Call Draw (X+13,Y+10); Call GOODGET (PSUD); End; Unit PRINCOUEST: Procedure (OutPut POUEST: ArrayOf Integer); Var X,Y: Integer; Begin X:=0; Y:=0; Call Cls; Call Move (X+2,Y+8); Call Draw (X+3,Y+8); Call Point (X+4,Y+2); Call Point (X+4,Y+7); Call Move (X+5,Y+1); Call Draw (X+5,Y+3); Call Move (X+5,Y+5); Call Draw (X+5,Y+15); Call Draw (X+4,Y+15); Call Move (X+6,Y+1); Call Draw (X+6,Y+10); Call Move (X+7,Y+1); Call Draw (X+7,Y+3); Call Move (X+16,Y+4); Call Draw (X+11,Y+4); Call Move (X+11,Y+5); Call Draw (X+9,Y+7); Call Draw (X+7,Y+5); Call Draw (X+7,Y+12); Call Draw (X+8,Y+13); Call Draw (X+10,Y+13); Call Draw (X+10,Y+14); Call GOODGET (POUEST); End; Unit PRINCESSE: Procedure (X,Y: Integer); Begin Call Point (X+5,Y+5); Call Point (X+12,Y+5); Call Move (X+8,Y+1); Call Draw (X+11,Y+4); Call Move (X+9,Y+1); Call Draw (X+6,Y+4); Call Move (X+7,Y+2); Call Draw (X+13,Y+8); Call Move (X+10,Y+2); Call Draw (X+4,Y+8); Call Point (X+4,Y+12); Call Move (X+5,Y+11); Call Draw (X+5,Y+12); Call Move (X+6,Y+9); Call Draw (X+6,Y+12); Call Point (X+7,Y+6); Call Move (X+7,Y+8); Call Draw (X+7,Y+15); Call Move (X+8,Y+5); Call Draw (X+8,Y+12); Call Move (X+9,Y+5); Call Draw (X+9,Y+12); Call Point (X+10,Y+6); Call Move (X+10,Y+8); Call Draw (X+10,Y+15); Call Move (X+11,Y+9); Call Draw (X+11,Y+12); Call Move (X+12,Y+11); Call Draw (X+12,Y+12); Call Point (X+13,Y+12); End; Unit COEUR: Procedure (X,Y: Integer); Begin Call Move (X+8,Y+5); Call Draw (X+6,Y+3); Call Draw (X+4,Y+3); Call Draw (X+2,Y+5); Call Draw (X+2,Y+9); Call Draw (X+7,Y+14); Call Draw (X+10,Y+14); Call Draw (X+15,Y+9); Call Draw (X+15,Y+5); Call Draw (X+13,Y+3); Call Draw (X+11,Y+3); Call Draw (X+9,Y+5); Call Move (X+4,Y+7); Call Draw (X+4,Y+8); Call Draw (X+8,Y+12); Call Draw (X+9,Y+12); End; Unit BBLANC: Procedure (X,Y: Integer); Begin Call Move (X+7,Y+3); Call Draw (X+3,Y+7); Call Draw (X+3,Y+10); Call Draw (X+7,Y+14); Call Draw (X+10,Y+14); Call Draw (X+14,Y+10); Call Draw (X+14,Y+7); Call Draw (X+10,Y+3); Call Draw (X+7,Y+3); Call Move (X+5,Y+8); Call Draw (X+5,Y+9); Call Draw (X+8,Y+12); Call Draw (X+9,Y+12); End; Unit BNOIRE: Procedure (X,Y: Integer); Begin Call Move (X+3,Y+7); Call Draw (X+3,Y+10); Call Move (X+4,Y+6); Call Draw (X+4,Y+11); Call Move (X+5,Y+5); Call Draw (X+5,Y+7); Call Move (X+5,Y+10); Call Draw (X+5,Y+12); Call Move (X+6,Y+4); Call Draw (X+6,Y+9); Call Move (X+6,Y+11); Call Draw (X+6,Y+13); Call Move (X+7,Y+3); Call Draw (X+7,Y+10); Call Move (X+7,Y+12); Call Draw (X+7,Y+14); Call Move (X+8,Y+3); Call Draw (X+8,Y+11); Call Move (X+8,Y+13); Call Draw (X+8,Y+14); Call Move (X+9,Y+3); Call Draw (X+9,Y+11); Call Move (X+9,Y+13); Call Draw (X+9,Y+14); Call Move (X+10,Y+3); Call Draw (X+10,Y+14); Call Move (X+11,Y+4); Call Draw (X+11,Y+13); Call Move (X+12,Y+5); Call Draw (X+12,Y+12); Call Move (X+13,Y+6); Call Draw (X+13,Y+11); Call Move (X+14,Y+7); Call Draw (X+14,Y+10); End; Unit BARNORD: Procedure (X,Y: Integer); Begin Call Move (X+5,Y+1); Call Draw (X+5,Y+4); Call Move (X+12,Y+1); Call Draw (X+12,Y+4); End; Unit BAROUEST: Procedure (X,Y: Integer); Begin Call Move (X+1,Y+5); Call Draw (X+4,Y+5); Call Move (X+1,Y+12); Call Draw (X+4,Y+12); End; Unit BARSUD: Procedure (X,Y: Integer); Begin Call Move (X+5,Y+13); Call Draw (X+5,Y+16); Call Move (X+12,Y+13); Call Draw (X+12,Y+16); End; Unit BAREST: Procedure (X,Y: Integer); Begin Call Move (X+13,Y+5); Call Draw (X+16,Y+5); Call Move (X+13,Y+12); Call Draw (X+16,Y+12); End; Unit BARHORIZ: Procedure (X,Y: Integer); Begin Call Move (X+1,Y+5); Call Draw (X+16,Y+5); Call Move (X+1,Y+10); Call Draw (X+16,Y+10); Call Move (X+1,Y+12); Call Draw (X+16,Y+12); End; Unit BARVERTI: Procedure (X,Y: Integer); Begin Call Move (X+5,Y+1); Call Draw (X+5,Y+16); Call Move (X+7,Y+1); Call Draw (X+7,Y+16); Call Move (X+12,Y+1); Call Draw (X+12,Y+16); End; Unit TOMBE: Procedure (X,Y: Integer); Begin Call Move (X+2,Y+5); Call Draw (X+6,Y+3); Call Move (X+4,Y+1); Call Draw (X+4,Y+8); Call Draw (X+6,Y+8); Call Draw (X+15,Y+13); Call Draw (X+12,Y+16); Call Move (X+11,Y+16); Call Draw (X+2,Y+11); Call Move (X+2,Y+10); Call Draw (X+4,Y+8); Call Move (X+4,Y+11); Call Draw (X+11,Y+14); End; Unit PELOTE: Procedure (X,Y: Integer); Begin Call Move (X+6,Y+2); Call Draw (X+2,Y+6); Call Draw (X+2,Y+11); Call Draw (X+6,Y+15); Call Draw (X+11,Y+15); Call Draw (X+15,Y+11); Call Draw (X+15,Y+6); Call Draw (X+11,Y+2); Call Draw (X+6,Y+2); Call Draw (X+6,Y+9); Call Draw (X+11,Y+14); Call Draw (X+11,Y+8); Call Move (X+4,Y+5); Call Draw (X+4,Y+10); Call Draw (X+8,Y+14); Call Move (X+13,Y+12); Call Draw (X+13,Y+5); Call Draw (X+9,Y+9); Call Draw (X+9,Y+11); Call Point (X+8,Y+10); Call Move (X+9,Y+3); Call Draw (X+7,Y+5); Call Move (X+11,Y+4); Call Draw (X+7,Y+8); End PELOTE; Unit FIN: Procedure (X,Y: Integer); Begin Call Move (X,Y); Call Draw (X+32,Y); Call Draw (X+32,Y+19); Call Draw (X,Y+19); Call Draw (X,Y); Call Move (X+10,Y+5); Call Draw (X+10,Y+4); Call Draw (X+4,Y+4); Call Draw (X+4,Y+15); Call Draw (X+6,Y+15); Call Draw (X+6,Y+4); Call Point (X+7,Y+10); Call Point (X+8,Y+10); Call Point (X+8,Y+11); Call Move (X+13,Y+4); Call Draw (X+17,Y+4); Call Move (X+13,Y+15); Call Draw (X+17,Y+15); Call Move (X+14,Y+5); Call Draw (X+14,Y+14); Call Move (X+16,Y+5); Call Draw (X+16,Y+14); Call Move (X+22,Y+4); Call Draw (X+20,Y+4); Call Draw (X+20,Y+15); Call Draw (X+22,Y+15); Call Draw (X+22,Y+4); Call Draw (X+29,Y+15); Call Draw (X+29,Y+4); Call Draw (X+28,Y+4); End FIN; Unit BLANC: Procedure (X,Y: Integer); Var I: Integer; Begin Call Color (0); For I:=1 To 16 Do Call Move (X+1,Y+I); Call Draw (X+16,Y+I); Od; Call Color (15); End BLANC; (* ------------------------------------------------------------------------- *) Unit GOODGET: Procedure (OutPut PDIR: ArrayOf Integer); Var TAB: ArrayOf Integer, I,J: Integer; Begin Array PDIR Dim (1:66); Call Move (1,1); TAB:= GetMap (16,16); PDIR (1):= TAB (1); For I:=1 To 4 Do For J:=1 To 8 Do PDIR (1+8*(I-1)+J):= TAB (1+J); Od; Od; Kill (TAB); End GOODGET; (* ------------------------------------------------------------------------- *) Unit TEMPO: Procedure (T: Integer); Var I: Integer; Begin For I:=1 To T Do Od; End TEMPO; (* ------------------------------------------------------------------------- *) Unit XCASE: Function (XC: Integer): Integer; Begin Result:= BX+32*(XC-1)+16; End; (* ------------------------------------------------------------------------- *) Unit YCASE: Function (YC: Integer): Integer; Begin Result:= BY+32*(YC-1)+16; End; (* ------------------------------------------------------------------------- *) (* ------------------------------------------------------------------------- *) Unit INITLABY: Procedure (OutPut LABY: ArrayOf ArrayOf PIECE); Var I,J,LIG,COL: Integer; Begin LIG:= 10; COL:= 15; Array LABY Dim (1:LIG); For I:=1 To LIG Do Array LABY (I) Dim (1:COL); For J:=1 to COL Do LABY (I,J):= New PIECE (True,True,True,True,False); Od Od; BX:= (496-(COL*32+16)) DIV 2; BY:= (336-(LIG*32+16)) DIV 2; End INITLABY; (* ------------------------------------------------------------------------- *) (* ------------------------------------------------------------------------- *) Unit BATIR: Procedure (InOut LABY: ArrayOf ArrayOf PIECE; OutPut ENTREE,SORTIE: SALLE); Unit XBOUL: Function (XB: Integer): Integer; Begin Result:= BX+32*(XB-1); End; (* ------------------------------------------------------------------------- *) Unit YBOUL: Function (YB: Integer): Integer; Begin Result:= BY+32*(YB-1); End; (* ------------------------------------------------------------------------- *) Unit AFFMUR: Procedure (YDEB,XDEB: Integer; COUL,DIR: Boolean); Var X,Y: Integer; Begin If COUL Then Call Color (15); Else Call Color (0); Fi; X:= XBOUL (XDEB); Y:= YBOUL (YDEB); If DIR= VERTI Then Call BARSUD (X,Y); Call BARVERTI (X,Y+16); Call BARNORD (X,Y+32); If XDEB>1 Then LABY(YDEB,XDEB-1).E:= Not COUL; Fi; If XDEB<=Upper (LABY (1)) Then LABY(YDEB,XDEB).O:= Not COUL; Fi; Else (* DIR=HORIZ *) Call BAREST (X,Y); Call BARHORIZ (X+16,Y); Call BAROUEST (X+32,Y); If YDEB>1 Then LABY(YDEB-1,XDEB).S:= Not COUL; Fi; If YDEB<=Upper (LABY) Then LABY(YDEB,XDEB).N:= Not COUL; Fi; Fi; Call Color (15); End AFFMUR; (* ------------------------------------------------------------------------- *) Unit AFFLONGMUR: Procedure (XDEB,YDEB,XFIN,YFIN: Integer,COUL: Boolean); Var DEB,FIN,I: Integer; Begin If XDEB=XFIN And YDEB=/=YFIN Then DEB:= IMIN (YDEB,YFIN); FIN:= IMAX (YDEB,YFIN); For I:= DEB To FIN-1 Do Call AFFMUR (I,XDEB,COUL,VERTI); Od; Else If YDEB=YFIN And XDEB=/=XFIN Then DEB:= IMIN (XDEB,XFIN); FIN:= IMAX (XDEB,XFIN); For I:= DEB To FIN-1 Do Call AFFMUR (YDEB,I,COUL,HORIZ); Od; Else Write (Chr(7)); Fi; Fi; End AFFLONGMUR; (* ------------------------------------------------------------------------- *) Unit CREERLABY: Procedure (InOut LABY: ArrayOf ArrayOf PIECE); Unit BOULPROCH: Procedure (X,Y: Integer; OutPut XBL,YBL: Integer; OutPut ERR: Boolean); Begin ERR:= False; XBL:= (X-BX+8) DIV 32+1; If XBL>Upper (LABY (1))+1 Then ERR:= True; Else YBL:= (Y-BY+8) DIV 32+1; If YBL>Upper (LABY)+1 Then ERR:= True; Fi; Fi; End BOULPROCH; (* ------------------------------------------------------------------------- *) Unit BOULBLNR: Procedure (XBL,YBL: Integer); Var X,Y: Integer; Begin X:= XBOUL (XBL); Y:= YBOUL (YBL); Call Move (X,Y); Call Color (0); Call BBLANC (X,Y); Call Color (15); Call BNOIRE (X,Y); End BOULBLNR; (* ------------------------------------------------------------------------- *) Unit BOULNRBL: Procedure (XBL,YBL: Integer); Var X,Y: Integer; Begin X:= XBOUL (XBL); Y:= YBOUL (YBL); Call Move (X,Y); Call Color (0); Call BNOIRE (X,Y); Call Color (15); Call BBLANC (X,Y); End BOULNRBL; (* ------------------------------------------------------------------------- *) Var X,Y,XDEB,YDEB,XFIN,YFIN: Integer, LEFT,RIGHT,CENTER,ERREUR,BORD: Boolean; Begin Call ShowCursor; Do Call Status (X,Y,LEFT,RIGHT,CENTER); If (LEFT Or RIGHT) And X>XFINI And XYFINI And YUpper (LABY (1)) Or XC<1 Then ERR:= True; Else YC:= (Y-BY-8) DIV 32+1; If YC>Upper (LABY) Or YC<1 Then ERR:= True; Fi; Fi; End CASEPROCH; (* ------------------------------------------------------------------------- *) Var X,Y,XC,YC: Integer, LEFT,RIGHT,CENTER,ERREUR,PLACENTREE,PLACSORTIE,OCCUPEE: Boolean; Begin Call ShowCursor; PLACENTREE:= False; PLACSORTIE:= False; Do Call Status (X,Y,LEFT,RIGHT,CENTER); If (LEFT Or RIGHT) And PLACENTREE And PLACSORTIE And X>XFINI And XYFINI And YE.ANTE.S.C Then Call DEPOUEST (E.ANTE,POS); Else Call DEPEST (E.ANTE,POS); Fi; Else If E.S.L>E.ANTE.S.L Then Call DEPSUD (E.ANTE,POS); Else Call DEPNORD (E.ANTE,POS); Fi; Fi; End DEMITOUR; (* ------------------------------------------------------------------------- *) Const TEMPS= 150, COUL= 7; Var I,POS: Integer, TROUVE,FIN,DMTR: Boolean, AUX,ENT: SALLE, E: ELEM, P: PILE, TAB: ArrayOf Integer; Begin DMTR:= True; P:= New PILE; ENTREE.PC.MARQUE:= True; E:= New ELEM (ENTREE); Call EMPIL (E,P); Call BLANC (XCASE (ENTREE.C),YCASE (ENTREE.L)); Call PELOTE (XCASE (ENTREE.C),YCASE (ENTREE.L)); ENT:= Copy (ENTREE); TROUVE:= False; While Not TROUVE Do FIN:= False; While Not FIN Do AUX:= E.S; If E.S.PC.N AndIf Not LABY (E.S.L-1,E.S.C).MARQUE Then E:= New ELEM (New SALLE (AUX.L-1,AUX.C,LABY (AUX.L-1,AUX.C))); E.S.PC.MARQUE:= True; Call EMPIL (E,P); Call DEPNORD (E,POS); Else If AUX.PC.E AndIf Not LABY (AUX.L,AUX.C+1).MARQUE Then E:= New ELEM (New SALLE (AUX.L,AUX.C+1,LABY (AUX.L,AUX.C+1))); E.S.PC.MARQUE:= True; Call EMPIL (E,P); Call DEPEST (E,POS); Else If AUX.PC.S AndIf Not LABY (AUX.L+1,AUX.C).MARQUE Then E:= New ELEM (New SALLE (AUX.L+1,AUX.C,LABY (AUX.L+1,AUX.C))); E.S.PC.MARQUE:= True; Call EMPIL (E,P); Call DEPSUD (E,POS); Else If AUX.PC.O AndIf Not LABY (AUX.L,AUX.C-1).MARQUE Then E:= New ELEM (New SALLE (AUX.L,AUX.C-1, LABY (AUX.L,AUX.C-1))); E.S.PC.MARQUE:= True; Call EMPIL (E,P); Call DEPOUEST (E,POS); Else FIN:= True; Fi; Fi; Fi; Fi; If Not FIN Then DMTR:= True; If E.S.L=SORTIE.L And E.S.C=SORTIE.C Then TROUVE:= True; FIN:= True; Fi; Fi; Od; If Not TROUVE Then Call DEMITOUR (E,POS,DMTR); Call DEPIL (P); If Not VIDE (P) Then E:= P.PREM; Else Exit; Fi; Fi; Od; If TROUVE Then Call BLANC (XCASE (SORTIE.C),YCASE (SORTIE.L)); Call COEUR (XCASE (SORTIE.C),YCASE (SORTIE.L)); Write (Chr(7)); Write (Chr(7)); Else Call BLANC (XCASE (ENT.C),YCASE (ENT.L)); Call TOMBE (XCASE (ENT.C),YCASE (ENT.L)); Call BLANC (XCASE (SORTIE.C),YCASE (SORTIE.L)); Call TOMBE (XCASE (SORTIE.C),YCASE (SORTIE.L)); Write (Chr(7)); Fi; End CHERCHER; (* ------------------------------------------------------------------------- *) Unit TOUCHE: Procedure; Var I: Integer; Begin I:= 0; While I<>32 Do I:= Inkey; Od; End TOUCHE; (* ------------------------------------------------------------------------- *) Var BX,BY,NBOUT: Integer, SOURIS: Boolean, PNORD,PEST,PSUD,POUEST: ArrayOf Integer; Begin Call Gron (1); Call PRINCNORD (PNORD); Call PRINCEST (PEST); Call PRINCSUD (PSUD); Call PRINCOUEST (POUEST); SOURIS:= Init (NBOUT); If SOURIS Then Inner; Fi; Call TOUCHE; Call Groff; End LABYGRAPH; (* ------------------------------------------------------------------------- *) (* ------------------------------------------------------------------------- *) Begin Pref LABYGRAPH Block Var LABY: ArrayOf ArrayOf PIECE, ENTREE,SORTIE: SALLE; Begin (*Do*) Call INITLABY (LABY); Call BATIR (LABY,ENTREE,SORTIE); Call CHERCHER (LABY,ENTREE,SORTIE); (*Od;*) End; End; End LABYRINTHE