%---------------- IFT1010, TP2----------------- %---------------------------------------------- %------par: Daniel LEONARD (LEOD01027604)------ %----------------login: leonard---------------- %---------------------------------------------- %-par: Pascale LIBERSAN-LANIEL (LIBP31607007)-- %---------------login :libersap---------------- %---------------------------------------------- %-par: Thanh Ngoc-Phuong TRUONG (TRUT06547301)- %----------------login: truont----------------- %---------------------------------------------- BEGIN EXTERNAL CLASS DESSIN; APPLICATION CLASS EXEMPLE; BEGIN % declaration des variables INTEGER ARRAY record(1:6); !tableau de record des joueurs; TEXT ARRAY nomjoueur(1:6); !tableau des nom des joueurs; CHARACTER ARRAY maze(0:56, 0:34); !tableau qui contient les donnees du labyrinthe; REF(RADIOPANEL) difficulty; !pour le ratio d'ecoute; REF(RADIOPANEL) abcisse; !pour les dimension en X; REF(RADIOPANEL) ordonnee; !pour les dimension en Y; REF(RADIOPANEL) speed; !pour la vitesse de deplacement; REF(RADIOPANEL) movetu; !pour le deplacement de la souris; REF(DESSIN) instruct; !fenetre avec les instruction; REF(DESSIN) night; !fenetre de Nightmare; REF(DESSIN) highscores; !fenetre pour les meilleurs resultats; REF(BUTTON) reprise; !bouton pour reprendre apres pause; REF(BUTTON) quitter; !bouton pour quitter; REF(BUTTON) aideIN, aidePL; !fenetre d'aide, pour l'intro et durant le jeu; REF(BUTTON) pgb; !bouton pour pause; REF(DIRECTFILE) HiScore; !fichier pour les hiscore; BOOLEAN yes; !si intersection; BOOLEAN moveas; !elle bouge toute seule; BOOLEAN move; !si il veut que la souris bouge toute seule ou pas; BOOLEAN nightmar; !guess; BOOLEAN playagain; !si on rejoue; CHARACTER wall = 'X'; !mur dans le tableau maze; CHARACTER sortie = 'S'; !sortie dans le tableau maze; CHARACTER corridor = ' '; !corridor dans le tableau maze; CHARACTER c1, c2, c3, c4; !cote gauche, droit, haut, bas; CHARACTER wantto; !pour rejouer; TEXT nom; !nom de l'usager; INTEGER dimX, dimY; !n. de case en x, en y; INTEGER u; !name pour RANDINT; INTEGER temps, temps1; !temps; INTEGER heure; !compteur pour le temps; INTEGER xc, yc; !position courante du curseur; INTEGER xs, ys; !position de la sortie; INTEGER xcav, ycav; !position de depart pour Excavate; INTEGER dir; !direction du mouvement aleatoire; INTEGER refr; !marqueur pour le refresh; INTEGER diff; !taux d'obeissance; REAL vitesse; !vitesse en mvt/sec; %procedures 'magiques' PROCEDURE ClickInRadioPanel(rb); REF(RADIOPANEL) rb; BEGIN IF abcisse.CURRENTCHOICE = "27" THEN dimX := 27 ELSE IF abcisse.CURRENTCHOICE = "29" THEN dimX := 29 ELSE IF abcisse.CURRENTCHOICE = "31" THEN dimX := 31 ELSE IF abcisse.CURRENTCHOICE = "33" THEN dimX := 33 ELSE IF abcisse.CURRENTCHOICE = "35" THEN dimX := 35 ELSE IF abcisse.CURRENTCHOICE = "37" THEN dimX := 37 ELSE IF abcisse.CURRENTCHOICE = "39" THEN dimX := 39 ELSE IF abcisse.CURRENTCHOICE = "41" THEN dimX := 41 ELSE IF abcisse.CURRENTCHOICE = "43" THEN dimX := 43 ELSE IF abcisse.CURRENTCHOICE = "45" THEN dimX := 45 ELSE IF abcisse.CURRENTCHOICE = "47" THEN dimX := 47 ELSE IF abcisse.CURRENTCHOICE = "49" THEN dimX := 49 ELSE IF abcisse.CURRENTCHOICE = "51" THEN dimX := 51 ELSE IF abcisse.CURRENTCHOICE = "53" THEN dimX := 53 ELSE IF abcisse.CURRENTCHOICE = "55" THEN dimX := 55; IF ordonnee.CURRENTCHOICE = "17" THEN dimY := 17 ELSE IF ordonnee.CURRENTCHOICE = "19" THEN dimY := 19 ELSE IF ordonnee.CURRENTCHOICE = "21" THEN dimY := 21 ELSE IF ordonnee.CURRENTCHOICE = "23" THEN dimY := 23 ELSE IF ordonnee.CURRENTCHOICE = "25" THEN dimY := 25 ELSE IF ordonnee.CURRENTCHOICE = "27" THEN dimY := 27 ELSE IF ordonnee.CURRENTCHOICE = "29" THEN dimY := 29 ELSE IF ordonnee.CURRENTCHOICE = "31" THEN dimY := 31 ELSE IF ordonnee.CURRENTCHOICE = "33" THEN dimY := 33; IF speed.CURRENTCHOICE = "2 mvt" THEN BEGIN vitesse := 1 / 2; moveas := FALSE; nightmar := FALSE; END ELSE IF speed.CURRENTCHOICE = "3 mvt" THEN BEGIN vitesse := 1 / 3; moveas := FALSE; nightmar := FALSE; END ELSE IF speed.CURRENTCHOICE = "4 mvt" THEN BEGIN vitesse := 1 / 4; moveas := FALSE; nightmar := FALSE; END ELSE IF speed.CURRENTCHOICE = "5 mvt" THEN BEGIN vitesse := 1 / 5; moveas := FALSE; nightmar := FALSE; END ELSE IF speed.CURRENTCHOICE = "10 mvt" THEN BEGIN vitesse := 1 / 10; nightmar := FALSE; moveas := TRUE; END ELSE IF speed.CURRENTCHOICE = "NIGHTMARE" THEN BEGIN vitesse := 1 / 100; nightmar := TRUE; moveas := TRUE; END; IF difficulty.CURRENTCHOICE = "100%" THEN diff := 100 ELSE IF difficulty.CURRENTCHOICE = "90%" THEN diff := 90 ELSE IF difficulty.CURRENTCHOICE = "80%" THEN diff := 80 ELSE IF difficulty.CURRENTCHOICE = "70%" THEN diff := 70 ELSE IF difficulty.CURRENTCHOICE = "60%" THEN diff := 60 ELSE IF difficulty.CURRENTCHOICE = "50%" THEN diff := 50 ELSE IF difficulty.CURRENTCHOICE = "40%" THEN diff := 40; IF movetu.CURRENTCHOICE = "oui" THEN move := TRUE ELSE IF movetu.CURRENTCHOICE = "non" THEN move := FALSE ELSE IF movetu.CURRENTCHOICE = "sais pas" THEN BEGIN INTEGER i; i := RANDINT(1, 100, u); IF REM(i, 2) = 1 THEN move := TRUE ELSE move := FALSE; END; END---CLICKINRADIOPANEL(rb)---; PROCEDURE Handle_Special_Key_Down(key_code); INTEGER key_code; BEGIN INTEGER c; !comparateur de difficulte; c := RANDINT(0, 100, u); !left-arrow; IF key_code = 16Rff51 AND xc > 0 AND c <= diff THEN MoveLeft(xc, yc, maze, dir) ELSE !right-arrow; IF key_code = 16Rff53 AND xc < (dimX + 1) AND c <= diff THEN MoveRight(xc, yc, maze, dir) ELSE !up-arrow; IF key_code = 16Rff52 AND yc > 0 AND c <= diff THEN MoveUp(xc, yc, maze, dir) ELSE !down-arrow; IF key_code = 16Rff54 AND yc < (dimY + 1) AND c <= diff THEN MoveDown(xc, yc, maze, dir); END---Handle_Special_Key_Down(key_code)---; PROCEDURE Button_Press(B); REF(BUTTON) B; IF B == aideIN THEN Instruction(2) ELSE IF B == aidePL THEN Instruction(3) ELSE IF B == pgb THEN PGA; PROCEDURE Refresh; BEGIN IF refr = 1 THEN BEGIN PrintMaze(dimX, dimY, maze, xs, ys); IF dir = 1 THEN GerbilLeft(xc, yc); IF dir = 2 THEN GerbilRight(xc, yc); IF dir = 3 THEN GerbilUp(xc, yc); IF dir = 4 THEN GerbilDown(xc, yc); END; END---Refresh---; %declaration des procedures PROCEDURE PGA; !pause game; BEGIN refr := 0; EFFACER; reprise.SHOW; aidePL.HIDE; pgb.HIDE; reprise.WAIT; reprise.HIDE; aidePL.SHOW; pgb.SHOW; refr := 1; Refresh; END---PGA---; PROCEDURE Instruction(i);INTEGER i; BEGIN REF(BUTTON) b; IF i = 1 THEN !fenetre; BEGIN !d'instruction; INTEGER x = 475, y = 170; !intro; instruct :- MAKEDESSIN("Instructions").SETSIZE(600,450); pause(0.1); instruct.TEXTE(300,60,"Gerdel s'est perdu dans un des multiples"); instruct.TEXTE(300,80,"labyrinthes du c!233!l!232!bre Mont X-Windows."); instruct.TEXTE(300,100,"Sors-le de l!224! et je t'accepterai"); instruct.TEXTE(300,120,"parmi mes rares initi!233!s."); instruct.TEXTE(300,160,"Pour faire d!233!placer"); instruct.TEXTE(300,180,"Gerdel, tu dois te"); instruct.TEXTE(300,200,"servir de tes"); instruct.TEXTE(300,220,"pouvoirs"); instruct.TEXTE(300,240,"mentaux et des"); instruct.TEXTE(300,260,"fl!232!ches du clavier."); instruct.TEXTE(300,280,"Fais attention, Gerdel"); instruct.TEXTE(300,300,"n'en fait souvent qu'!224! sa"); instruct.TEXTE(300,320,"t!234!te mais, !224! toi de le mater."); instruct.TEXTE(300,360,"Va, et reviens-moi au plus vite. Tu"); instruct.TEXTE(300,380,"auras alors ma plus grande consid!233!ration."); instruct.PLUME(1); instruct.COULEUR("black"); instruct.RECTANGLE(x + 18, y + 3, x + 24, y + 9, 1); instruct.RECTANGLE(x + 15, y + 9, x + 27, y + 39, 1); instruct.RECTANGLE(x + 12, y + 12, x + 30, y + 33, 1); instruct.RECTANGLE(x + 6, y + 18, x + 36, y + 21, 1); instruct.RECTANGLE(x + 6, y + 33, x + 36, y + 36, 1); instruct.RECTANGLE(x + 21, y + 39, x + 24, y + 42, 1); instruct.RECTANGLE(x + 3, y + 42, x + 21, y + 45, 1); instruct.RECTANGLE(x + 3, y + 12, x + 6, y + 18, 1); instruct.RECTANGLE(x + 3, y + 27, x + 6, y + 33, 1); instruct.RECTANGLE(x + 36, y + 12, x + 39, y + 18, 1); instruct.RECTANGLE(x + 36, y + 27, x + 39, y + 33, 1); instruct.ENCRE("white"); instruct.RECTANGLE(x + 15, y + 12, x + 18, y + 15, 1); instruct.RECTANGLE(x + 24, y + 12, x + 27, y + 15, 1); instruct.ENCRE("black"); instruct.TEXTE(500,230,"Gerdel,"); instruct.TEXTE(500,250,"c'est moi!"); b :- instruct.MAKEFANCYBUTTON("!192! vos ordres, Ma!238!tre").PLACEDOWNRIGHT; b.WAIT; instruct.DESTROY; END; IF i = 2 THEN !aide durant; BEGIN !l'intro; instruct :- MAKEDESSIN("Aide").SETSIZE(600,400); PAUSE(0.1); instruct.TEXTE(300,75,"Avant de commencer !224! jouer!"); instruct.TEXTE(300,125,"Le pointeur de la souris doit en tout temps pointer"); instruct.TEXTE(300,150,"sur l'espace r!233!serv!233! pour ton nom"); instruct.TEXTE(300,175,"(c'est-!224!-dire au moment o!249! tu entres ton nom et"); instruct.TEXTE(300,200,"lorsque tu le saisis (touche ""Retour""))"); instruct.TEXTE(300,250,"Apr!232!s cela, tu peux s!233!lectionner les"); instruct.TEXTE(300,275,"caract!233!ristiques voulues pour ta partie."); instruct.TEXTE(300,300,"Ensuite, cliques sur le bouton pour commencer..."); b :- instruct.MAKEFANCYBUTTON("Je vais y arriver, Ma!238!tre").PLACEDOWNRIGHT; b.WAIT; instruct.DESTROY; END; IF i = 3 THEN !aide durant; BEGIN !le jeu; refr := 0; EFFACER; aidePL.HIDE; pgb.HIDE; instruct :- MAKEDESSIN("Aide").SETSIZE(600,500); PAUSE(0.1); instruct.TEXTE(300,60,"QUOI!!!"); instruct.TEXTE(300,80,"Tu n'est pas encore sorti de l!224!?"); instruct.TEXTE(300,100,"Ce n'est pourtant pas si compliqu!233!!"); instruct.TEXTE(300,140,"Les petites fl!232!ches du clavier font d!233!placer Gerdel:"); instruct.TEXTE(300,160,"* la fl!232!che du haut vers le haut *"); instruct.TEXTE(300,180,"* la fl!232!che du bas vers le bas *"); instruct.TEXTE(300,200,"* la fl!232!che de gauche vers la gauche *"); instruct.TEXTE(300,220,"* la fl!232!che de droite vers la droite *"); instruct.TEXTE(300,240,"La sortie du labyrinthe se trouve sur un des c!244!t!233!s"); instruct.TEXTE(300,260,"de la montagne (bien s!251!r!)."); instruct.TEXTE(300,280,"Si tu as choisi un faible taux d'ob!233!issance et une grande"); instruct.TEXTE(300,300,"vitesse de d!233!placement, ne te plains pas !224! moi,"); instruct.TEXTE(300,320,"Gerdel risque d'!234!tre tout simplement incontrolable."); instruct.TEXTE(300,360,"Va et ram!232!ne-moi cet !233!tourdi de Gerdel."); instruct.TEXTE(300,380,"Fais vite, je ne peux plus attendre."); instruct.TEXTE(300,400,"ET sache que je songe fortement !224! ne pas t'inclure"); instruct.TEXTE(300,420,"parmi mes braves."); b :- instruct.MAKEFANCYBUTTON("J'y cours, Ma!238!tre").PLACEDOWNRIGHT; b.WAIT; aidePL.SHOW; pgb.SHOW; refr := 1; instruct.DESTROY; END; END---Instruction(a, b)---; PROCEDURE PlaceButton(i); INTEGER i; !place les; BEGIN !boutons; IF i = 1 THEN BEGIN quitter :- MAKEFANCYBUTTON("I won't let you get lost, Gerdel...").PLACEDOWNRIGHT.HIDE; aideIN :- MAKEFANCYBUTTON("Aidez-moi, !212! Ma!238!tre").PLACEDOWNLEFT; END; IF i = 2 THEN BEGIN aideIN.DESTROY; aidePL :- MAKEBUTTON("Aidez-moi, !212! Ma!238!tre").PLACEDOWNLEFT; pgb :- MAKEBUTTON("pause").PLACERIGHTOF(aidePL); POLICE("courrier", 24); reprise :- MAKEBUTTON("d!233!pause").PLACEAT(width / 2 - 100, height / 2 - 100).SETSIZE(200,200).HIDE; SETTYPEFACE("helvetica", 12, TRUE, FALSE); END; END---PlaceButton(i)---; PROCEDURE Setting(x, y, v, d, n); NAME x, y, v, d, n; TEXT n; INTEGER x, y; REAL v, d; !place les; BEGIN !radiopanels; x := 27; !et assigne; y := 17; !des variables; v := 1 / 2; d := 100; move := TRUE; n :- ASK_FOR_TEXT("Ton nom"); movetu :- MAKERADIOPANEL.HIDE; speed :- MAKERADIOPANEL.HIDE; difficulty :- MAKERADIOPANEL.HIDE; abcisse :- MAKERADIOPANEL.HIDE; ordonnee :- MAKERADIOPANEL.HIDE; movetu.SETHORIZONTAL .ADDBUTTON("oui") .ADDBUTTON("non") .ADDBUTTON("sais pas") .SETBUTTON("oui") .SETHEADING("Mouvement automatique") .PLACEAT(50, 50); speed.SETHORIZONTAL .ADDBUTTON("2 mvt") .ADDBUTTON("3 mvt") .ADDBUTTON("4 mvt") .ADDBUTTON("5 mvt") .ADDBUTTON("10 mvt") .ADDBUTTON("NIGHTMARE") .SETBUTTON("2 mvt") .SETHEADING("Mouvement par seconde") .PLACEBELOW(movetu); difficulty.SETHORIZONTAL .ADDBUTTON("100%") .ADDBUTTON("90%") .ADDBUTTON("80%") .ADDBUTTON("70%") .ADDBUTTON("60%") .ADDBUTTON("50%") .ADDBUTTON("40%") .SETBUTTON("100%") .SETHEADING("Taux d'ob!233!issance") .PLACEBELOW(speed); ordonnee.SETHORIZONTAL .ADDBUTTON("17") .ADDBUTTON("19") .ADDBUTTON("21") .ADDBUTTON("23") .ADDBUTTON("25") .ADDBUTTON("27") .ADDBUTTON("29") .ADDBUTTON("31") .ADDBUTTON("33") .SETBUTTON("17") .SETHEADING("Hauteur du labyrinthe") .PLACEBELOW(difficulty); abcisse.SETHORIZONTAL .ADDBUTTON("27") .ADDBUTTON("29") .ADDBUTTON("31") .ADDBUTTON("33") .ADDBUTTON("35") .ADDBUTTON("37") .ADDBUTTON("39") .ADDBUTTON("41") .ADDBUTTON("43") .ADDBUTTON("45") .ADDBUTTON("47") .ADDBUTTON("49") .ADDBUTTON("51") .ADDBUTTON("53") .ADDBUTTON("55") .SETBUTTON("27") .SETHEADING("Longueur du labyrinythe") .PLACEBELOW(ordonnee); movetu.SHOW; speed.SHOW; difficulty.SHOW; abcisse.SHOW; ordonnee.SHOW; quitter.SHOW; quitter.WAIT; END---Setting(x, y, v, d, n)---; PROCEDURE CreateMountain(x, y, m); INTEGER x, y; CHARACTER ARRAY m; !met des; BEGIN !X dans la; !matrice maze; INTEGER i, j; !compteurs; FOR i := 0 STEP 1 UNTIL x + 1 DO FOR j := 0 STEP 1 UNTIL y + 1 DO m(i, j) := wall; END---CreateMountain(x, y, m)---; PROCEDURE SetPerceuse(x, y, a, b);NAME a, b; INTEGER a, b, x, y; !determine; BEGIN !le point; IF REM(x // 2, 2) = 0 THEN a := x // 2 + 1 !de depart; ELSE a := x // 2; !pour creuser; IF REM(y // 2, 2) = 0 THEN b := y // 2 + 1 ELSE b := y // 2; END---SetPerceuse(x, y, a, b)---; PROCEDURE Excavate(x, y, m); INTEGER x, y; CHARACTER ARRAY m; !cree; BEGIN !le; !labyrinthe; INTEGER i; !compteur; INTEGER d1; !direction 0=droite 1=gauche 2=haut 3 =bas; INTEGER d; !modulo4 pour la direction; m(x, y) := corridor; d1 := RANDINT(1, 4, u); FOR i := 1 STEP 1 UNTIL 4 DO BEGIN d := MOD(d1 + i, 4); IF d=0 AND (x < (dimX - 1)) AND THEN (m(x + 2,y) = wall) THEN BEGIN m(x + 1, y) := corridor; Excavate(x + 2, y, m); END ELSE IF (d = 1) AND (x > 2) AND THEN (m(x - 2,y) = wall) THEN BEGIN m(x - 1, y) := corridor; Excavate(x - 2, y, m); END ELSE IF (d = 2) AND (y < (dimY - 1)) AND THEN (m(x,y + 2) = wall) THEN BEGIN m(x, y + 1) := corridor; Excavate(x,y+2,m); END ELSE IF (d = 3) AND (y > 2) AND THEN m(x, y - 2) = wall THEN BEGIN m(x, y - 1) := corridor; Excavate(x,y-2,m) END; END; END---Excavate(x, y, m)---; PROCEDURE EffaceTableau; !efface; BEGIN !les tableau; difficulty.DESTROY; abcisse.DESTROY; ordonnee.DESTROY; speed.DESTROY; movetu.DESTROY; quitter.DESTROY; END---EffaceTableau---; PROCEDURE CreateSortie(x, y, a, b, m); NAME a, b; INTEGER a, b, x, y; CHARACTER ARRAY m; !trouve la; BEGIN !sortie et la; !met dans la; INTEGER cote; !matrice maze,; cote := RANDINT(1, 4, u); !cote droit; IF cote = 1 THEN BEGIN a := RANDINT(2, x - 1, u); b := 0; IF m(a, 1) = wall THEN CreateSortie(xc, yc, xs, xs, maze); END; !cote gauche; IF cote = 2 THEN BEGIN b := RANDINT(2, y - 1, u); a := x + 1; IF m(x, b) = wall THEN CreateSortie(xc, yc, xs, xs, maze); END; !cote haut; IF cote = 3 THEN BEGIN a := RANDINT(2, x - 1, u); b := y + 1; IF m(a, y) = wall THEN CreateSortie(xc, yc, xs, xs, maze); END; !cote bas; IF cote = 4 THEN BEGIN b := RANDINT(2, y - 1, u); a := 0; IF m(1, b) = wall THEN CreateSortie(x, y, a, b, m); END; END---CreateSortie(x, y, a, b, m)---; PROCEDURE Nightmare; !une; BEGIN !surprise; night :- MAKEDESSIN("You're Sick").SETBACKGROUND("gray50").SETSIZE(500,100); pause(0.1); night.POLICE("courrier", 12); night.TEXTE(night.WIDTH / 2, night.HEIGHT / 2 - 25, "Here you go, it was your choice"); night.TEXTE(night.WIDTH / 2, night.HEIGHT / 2 + 25, "This window will self destruct in 7 seconds...:)"); pause(7); night.DESTROY; END---Nightmare---; PROCEDURE HideBouton; !cache; BEGIN !des bouton; aidePL.HIDE; !pour; pgb.HIDE; !Nightmare; END---HideBouton---; PROCEDURE PointDEntree(x, y, m); NAME x, y; CHARACTER ARRAY m; INTEGER x, y; !trouve; BEGIN !le point; x := RANDINT(1, dimX, u); !d'entree; y := RANDINT(1, dimY, u); !et y imprime; IF m(x, y) = wall THEN PointDEntree(xc, yc, maze); !la creature; Gerbilup(xc, yc); END---PointDEntree(x, y, m)---; PROCEDURE PrintMaze(x, y, m, a, b); CHARACTER ARRAY m; INTEGER a, b, x, y; !affiche; BEGIN !le; !labyrinthe; INTEGER i; !1ere dimension du tableau; INTEGER j; !2e dimension du tableau; EFFACER; COULEUR("gray90"); PLUME(0); FOR i := 0 STEP 1 UNTIL x + 1 DO FOR j := 0 STEP 1 UNTIL y + 1 DO BEGIN IF (m(i, j) = wall) THEN BEGIN RECTANGLE(i * 16, j * 16, (i + 1) * 16, (j + 1) * 16, 2); END; END; m(xs, ys) := sortie; !affiche; COULEUR("gray10"); !la sortie; RECTANGLE((a * 16) - 1, (b * 16) - 1, ((a + 1) * 16) + 1, ((b + 1) * 16) + 1, 2); PLUME(2); COULEUR("white"); RECTANGLE(356, 600, 556, 650, 1); TEXTE(456, 625,"Temps:"); END---PrintMaze(x, y, m, a, b)---; PROCEDURE TcheckSide(x, y, b, d, m, c1, c2, c3, c4); NAME b ,c1, c2, c3 ,c4; BOOLEAN b; INTEGER x, y, d; CHARACTER ARRAY m; CHARACTER c1, c2, c3, c4; !regarde; BEGIN !si les cotes; c1 := m(x, y - 1); !sont des; c2 := m(x + 1, y); !corridor; c3 := m(x, y + 1); c4 := m(x - 1, y); IF d = 1 THEN BEGIN IF (c1 = corridor AND c2 = corridor AND c4 = corridor) OR (c1 = corridor AND c4 = corridor) OR (c1 = corridor AND c2 = corridor) OR (c2 = corridor AND c4 = corridor) OR c1 = sortie OR c2 = sortie OR c4 = sortie THEN b := TRUE ELSE b := FALSE; END; IF d = 2 THEN BEGIN IF (c1 = corridor AND c2 = corridor AND c3 = corridor) OR (c1 = corridor AND c2 = corridor) OR (c2 = corridor AND c3 = corridor) OR (c1 = corridor AND c3 = corridor) OR c1 = sortie OR c2 = sortie OR c3 = sortie THEN b := TRUE ELSE b := FALSE; END; IF d = 3 THEN BEGIN IF (c2 = corridor AND c3 = corridor AND c4 = corridor) OR (c2 = corridor AND c3 = corridor) OR (c3 = corridor AND c4 = corridor) OR (c2 = corridor AND c4 = corridor) OR c2 = sortie OR c3 = sortie OR c4 = sortie THEN b := TRUE ELSE b := FALSE; END; IF d = 4 THEN BEGIN IF (c1 = corridor AND c3 = corridor AND c4 = corridor) OR (c3 = corridor AND c4 = corridor) OR (c1 = corridor AND c4 = corridor) OR (c1 = corridor AND c3 = corridor) OR c1 = sortie OR c3 = sortie OR c4 = sortie THEN b := TRUE ELSE b := FALSE; END; END---TcheckSide(x, y, b, d, c1, c2, c3, c4)---; PROCEDURE Travaille; !boucle; BEGIN !principale; IF moveas OR move THEN BEGIN TcheckSide(xc, yc, yes, dir, maze, c1, c2, c3, c4); IF yes THEN RandomMove ELSE Continue(c1, c2, c3, c4); END; temps1 := CLOCKTIME; PAUSE(vitesse); IF temps1 - temps >= 1 THEN BEGIN heure := heure + 1; COULEUR("white"); ENCRE("white"); RECTANGLE(481,610,554,640,1); ENCRE("black"); TEXTE(506,625,INT_AS_TEXT(heure)); temps := CLOCKTIME; END; HANDLE_PENDING_EVENTS; END; PROCEDURE RandomMove; !choisi; BEGIN !un cote au; !hazard; INTEGER s; !cote choisi au hazard; s := RANDINT(1, 4, u); IF s = 1 THEN MoveUp(xc, yc, maze, dir); IF s = 2 THEN MoveRight(xc, yc, maze, dir); IF s = 3 THEN MoveDown(xc, yc, maze, dir); IF s = 4 THEN MoveLeft(xc, yc, maze, dir); END---RandomMove---; PROCEDURE Continue(c1, c2, c3, c4); CHARACTER c1, c2, c3, c4; !si pas de; BEGIN !randommove; IF dir = 1 THEN BEGIN IF c1 <> wall THEN MoveUp(xc, yc, maze, dir) ELSE IF c2 <> wall THEN MoveRight(xc, yc, maze, dir) ELSE IF c4 <> wall THEN MoveLeft(xc, yc, maze, dir) ELSE IF c1 = wall THEN MoveDown(xc, yc, maze, dir) END; IF dir = 2 THEN BEGIN IF c2 <> wall THEN MoveRight(xc, yc, maze, dir) ELSE IF c3 <> wall THEN MoveDown(xc, yc, maze, dir) ELSE IF c1 <> wall THEN MoveUp(xc, yc, maze, dir) ELSE IF c2 = wall THEN MoveLeft(xc, yc, maze, dir) END; IF dir = 3 THEN BEGIN IF c3 <> wall THEN MoveDown(xc, yc, maze, dir) ELSE IF c4 <> wall THEN MoveLeft(xc, yc, maze, dir) ELSE IF c2 <> wall THEN MoveRight(xc, yc, maze, dir) ELSE IF c3 = wall THEN MoveUp(xc, yc, maze, dir) END; IF dir = 4 THEN BEGIN IF c4 <> wall THEN MoveLeft(xc, yc, maze, dir) ELSE IF c1 <> wall THEN MoveUp(xc, yc, maze, dir) ELSE IF c3 <> wall THEN MoveDown(xc, yc, maze, dir) ELSE IF c4 = wall THEN MoveRight(xc, yc, maze, dir) END END---Continue(c1, c2, c3, c4)---; PROCEDURE MoveLeft(x, y, m, d); NAME x, y, d; INTEGER x, y, d; CHARACTER ARRAY m; !bouge; IF m(x - 1, y) = corridor OR m(x - 1, y) = sortie THEN !a gauche; BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); d := 4; x := x - 1; Gerbilleft(x, y); END ELSE BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); d := 4; Gerbilleft(x, y); END; PROCEDURE MoveRight(x, y, m, d); NAME x, y, d; INTEGER x, y, d; CHARACTER ARRAY m; !bouge; IF m(x + 1,y) = corridor OR m(x + 1, y) = sortie THEN !a droite; BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); d := 2; x := x + 1; Gerbilright(x, y); END ELSE BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); d := 2; Gerbilright(x, y); END; PROCEDURE MoveUp(x, y, m, d); NAME x, y, d; INTEGER x, y, d; CHARACTER ARRAY m; !bouge; IF m(x, y - 1) = corridor OR m(x, y - 1) = sortie THEN !en haut; BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); y := y - 1; d := 1; Gerbilup(x, y); END ELSE BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); d := 1; Gerbilup(x, y); END; PROCEDURE MoveDown(x, y, m, d); NAME x, y, d; INTEGER x, y, d; CHARACTER ARRAY m; !bouge; IF m(x, y + 1) = corridor OR m(x, y + 1) = sortie THEN !en bas; BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); y := y + 1; d := 3; Gerbildown(x, y); END ELSE BEGIN EFFACER_RECT(x * 16 + 1, y * 16 + 1, (x + 1) * 16 - 1, (y + 1) * 16 - 1); d := 3; Gerbildown(x, y); END; PROCEDURE Gerbilup(x, y); INTEGER x, y; !imprime; BEGIN !la petite; ENCRE("black"); !creature; PLUME(1); !face vers; COULEUR("black"); !le haut; RECTANGLE((x * 16) + 6, (y * 16) + 1, (x * 16) + 7, (y * 16) + 2, 1); RECTANGLE((x * 16) + 5, (y * 16) + 3, (x * 16) + 8, (y * 16) + 12, 1); RECTANGLE((x * 16) + 4, (y * 16) + 4, (x * 16) + 9, (y * 16) + 11, 1); LIGNE((x * 16) + 2, (y * 16) + 6, (x * 16) + 11, (y * 16) + 6); LIGNE((x * 16) + 2, (y * 16) + 11, (x * 16) + 11, (y * 16) + 11); POINT((x * 16) + 7, (y * 16) + 13); LIGNE((x * 16) + 1, (y * 16) + 14, (x * 16) + 6, (y * 16) + 14); LIGNE((x * 16) + 1, (y * 16) + 4, (x * 16) + 1, (y * 16) + 5); LIGNE((x * 16) + 1, (y * 16) + 9, (x * 16) + 1, (y * 16) + 10); LIGNE((x * 16) + 12, (y * 16) + 4, (x * 16) + 12, (y * 16) + 5); LIGNE((x * 16) + 12, (y * 16) + 9, (x * 16) + 12, (y * 16) + 10); ENCRE("white"); POINT((x * 16) + 5, (y * 16) + 4); POINT((x * 16) + 8, (y * 16) + 4); ENCRE("black"); END---Gerbil---(x, y); PROCEDURE Gerbildown(x, y); INTEGER x, y; !imprime; BEGIN !face au; ENCRE("black"); !bas; PLUME(1); COULEUR("black"); RECTANGLE((x * 16) + 6, (y * 16) + 14, (x * 16) + 7, (y * 16) + 14, 1); RECTANGLE((x * 16) + 5, (y * 16) + 12, (x * 16) + 8, (y * 16) + 3, 1); RECTANGLE((x * 16) + 4, (y * 16) + 11, (x * 16) + 9, (y * 16) + 4, 1); LIGNE((x * 16) + 2, (y * 16) + 4, (x * 16) + 11, (y * 16) + 4); LIGNE((x * 16) + 2, (y * 16) + 4, (x * 16) + 11, (y * 16) + 9); LIGNE((x * 16) + 1, (y * 16) + 5, (x * 16) + 1, (y * 16) + 6); LIGNE((x * 16) + 12, (y * 16) + 5, (x * 16) + 12, (y * 16) + 6); LIGNE((x * 16) + 1, (y * 16) + 10, (x * 16) + 1, (y * 16) + 11); LIGNE((x * 16) + 12, (y * 16) + 10, (x * 16) + 12, (y * 16) + 11); LIGNE((x * 16) + 1, (y * 16) + 1, (x * 16) + 6, (y * 16) + 1); POINT((x * 16) + 7, (y * 16) + 2); ENCRE("white"); POINT((x * 16) + 5, (y * 16) + 11); POINT((x * 16) + 8, (y * 16) + 11); ENCRE("black"); END---Gerbildown---(x, y); PROCEDURE Gerbilleft(x, y); INTEGER x, y; !imprime; BEGIN !face a; ENCRE("black"); !gauche; PLUME(1); COULEUR("black"); RECTANGLE((x * 16) + 1, (y * 16) + 6, (x * 16) + 2, (y * 16) + 7, 1); RECTANGLE((x * 16) + 3, (y * 16) + 5, (x * 16) + 11, (y * 16) + 8, 1); RECTANGLE((x * 16) + 4, (y * 16) + 4, (x * 16) + 11, (y * 16) + 9, 1); LIGNE((x * 16) + 6, (y * 16) + 2, (x * 16) + 6, (y * 16) + 11); LIGNE((x * 16) + 11, (y * 16) + 2, (x * 16) + 11, (y * 16) + 11); LIGNE((x * 16) + 4, (y * 16) + 1, (x * 16) + 5, (y * 16) + 1); LIGNE((x * 16) + 4, (y * 16) + 12, (x * 16) + 5, (y * 16) + 12); LIGNE((x * 16) + 9, (y * 16) + 1, (x * 16) + 10, (y * 16) + 1); LIGNE((x * 16) + 9, (y * 16) + 12, (x * 16) + 10, (y * 16) + 12); LIGNE((x * 16) + 14, (y * 16) + 12, (x * 16) + 14, (y * 16) + 7); POINT((x * 16) + 13, (y * 16) + 6); ENCRE("white"); POINT((x * 16) + 4, (y * 16) + 5); POINT((x * 16) + 4, (y * 16) + 8); ENCRE("black"); END---Gerbilleft---(x, y); PROCEDURE Gerbilright(x, y); INTEGER x, y; !imprime; BEGIN !face a; ENCRE("black"); !droite; PLUME(1); COULEUR("black"); RECTANGLE((x * 16) + 13, (y * 16) + 6, (x * 16) + 14, (y * 16) + 7, 1); RECTANGLE((x * 16) + 12, (y * 16) + 5, (x * 16) + 3, (y * 16) + 8, 1); RECTANGLE((x * 16) + 11, (y * 16) + 4, (x * 16) + 4, (y * 16) + 9, 1); LIGNE((x * 16) + 4, (y * 16) + 2, (x * 16) + 4, (y * 16) + 11); LIGNE((x * 16) + 9, (y * 16) + 2, (x * 16) + 9, (y * 16) + 11); LIGNE((x * 16) + 5, (y * 16) + 1, (x * 16) + 6, (y * 16) + 1); LIGNE((x * 16) + 5, (y * 16) + 12, (x * 16) + 6, (y * 16) + 12); LIGNE((x * 16) + 10, (y * 16) + 1, (x * 16) + 11, (y * 16) + 1); LIGNE((x * 16) + 10, (y * 16) + 12, (x * 16) + 11, (y * 16) + 12); LIGNE((x * 16) + 1, (y * 16) + 1, (x * 16) + 1, (y * 16) + 6); POINT((x * 16) + 2, (y * 16) + 7); ENCRE("white"); POINT((x * 16) + 11, (y * 16) + 5); POINT((x * 16) + 11, (y * 16) + 8); ENCRE("black"); END---Gerbilright---(x, y); PROCEDURE EndingSequence; !presque; BEGIN !la fin; refr := 0; EFFACER; aidePL.DESTROY; pgb.DESTROY; reprise.DESTROY; AddToTable(nom, IF 100 - heure < 0 THEN 0 ELSE 100 - heure); TrierScore; POLICE("times", 24); TEXTE(width / 2, height / 2, "Bravo " & nom); TEXTE(width / 2, height / 2 + 100, IF 100 - heure < 0 THEN "Ton nombre de repas gratuits : 0" ELSE "Ton nombre de repas gratuits : " & INT_AS_TEXT(100 - heure)); SETTYPEFACE("helvetica", 12, TRUE, FALSE); pgb :- MAKEBUTTON("Vous !234!tes gentil Ma!238!tre").PLACEDOWNLEFT.WAIT; EFFACER; pgb.DESTROY; ShowScore(HighScores, Record, NomJoueur); AddToScoreFile(HiScore, Record, NomJoueur); wantto := ASK_FOR_CHAR("Veux-tu !234!tre encore damner ?"); IF wantto = 'o' OR wantto = 'O' OR wantto = 'y' OR wantto = 'Y' THEN playagain := FALSE ELSE playagain := TRUE; END---EndingSequence---; PROCEDURE FinalEndingSequence; !guess; BEGIN EFFACER; POLICE("times", 24); TEXTE(WIDTH / 2,HEIGHT / 2,"Tu peux retourner dans ta cage....."); PAUSE(5); END; PROCEDURE CreateFile; !cree fichier; BEGIN !HiScore; REF(DIRECTFILE) fichier; fichier :- NEW DIRECTFILE("HiScore"); fichier.SETACCESS("AnyCreate"); fichier.OPEN(BLANKS(80)); fichier.OUTINT(101, -4); fichier.OUTTEXT("God"); fichier.OUTIMAGE; fichier.OUTINT(100, -4); fichier.OUTTEXT("Prgmrs"); fichier.OUTIMAGE; fichier.CLOSE; END---CreateFile---; PROCEDURE PlaceInTable(f, r, nj); NAME f; REF(DIRECTFILE) f; INTEGER ARRAY r; TEXT ARRAY nj; !initialise; BEGIN !le tableau; TEXT p; !nom de la personne; INTEGER result; !son resultat; INTEGER i; !compteur; FOR i := 1 STEP 1 UNTIL 6 DO BEGIN r(i) := 0; nj(i) :- BLANKS(10); END; f :- NEW DIRECTFILE("HiScore"); f.SETACCESS("AnyCreate"); f.OPEN(BLANKS(80)); f.INIMAGE; i := 1; WHILE NOT f.ENDFILE DO BEGIN result := f.ININT; r(i) := result; p :- f.INTEXT(10).STRIP; nj(i) :- p.STRIP; i := i + 1; f.INIMAGE; END; f.CLOSE; END---PLaceInTable(f, r, nj)---; PROCEDURE AddToTable(joueur, p); TEXT joueur; INTEGER p; !update au; BEGIN !tableau; BOOLEAN c; INTEGER j; j := 1; c := TRUE; WHILE j <= 6 AND c DO BEGIN IF record(j) <> 0 AND nomjoueur(j) =/= NOTEXT THEN BEGIN j := j + 1; c := TRUE; END ELSE BEGIN record(j) := p; nomjoueur(j) :- joueur.STRIP; c := FALSE; END; END; END---AddToTable(joueur, p)---; PROCEDURE SwapInt(v1, v2); NAME v1, v2; INTEGER v1, v2; !guess; BEGIN INTEGER t; t := v1; v1 := v2; v2 := t; END---SwapInt(v1, v2)---; PROCEDURE SwapText(v1, v2); NAME v1, v2; TEXT v1, v2; !guess; BEGIN TEXT t; t :- v1; v1 :- v2; v2 :- t; END---SwapText(v1, v2)---; PROCEDURE TrierScore; !guess; BEGIN INTEGER i, j, max; !compteur, compteur, ; FOR i := 1 STEP 1 UNTIL 5 DO BEGIN max := i; FOR j := i + 1 STEP 1 UNTIL 6 DO IF Record(j) > Record(max) THEN max := j; SwapInt(Record(i), Record(max)); SwapText(NomJoueur(i), NomJoueur(max)); END; END---TrierScore---; PROCEDURE ShowScore(fenetre, TabScore, TabNom); REF(DESSIN) fenetre; INTEGER ARRAY TabScore; TEXT ARRAY TabNom; !guess; BEGIN INTEGER index, rang; fenetre :- MAKEDESSIN("The Best Score"); fenetre.SETSIZE(600, 400); PAUSE(0.1); fenetre.TEXTE(240, 70, "Nom"); fenetre.TEXTE(360, 70, "Score"); fenetre.PLUME(5); fenetre.LIGNE(200, 90, 400, 90); fenetre.LIGNE(300, 60, 300, 290); fenetre.TEXTE(240, 110, TabNom(1)); fenetre.TEXTE(360, 110 , Int_As_Text(TabScore(1))); rang := 150; FOR index := 2 STEP 1 UNTIL 5 DO BEGIN IF TabNom(index) =/= NOTEXT AND TabScore(index ) <> 0 THEN BEGIN IF TabNom(index) <> TabNom(index-1) AND TabScore(index) <> TabScore(index-1) THEN BEGIN fenetre.TEXTE(240, rang, TabNom(index)); fenetre.TEXTE(360, rang, Int_As_Text(TabScore(index))); rang := rang + 40; END; END; END; fenetre.MAKEFANCYBUTTON("Congratulation!").PLACEDOWNRIGHT.WAIT; fenetre.DESTROY; END---ShowScore(fenetre, TabScore, TabNom)---; PROCEDURE AddToScoreFile(fichier, TabRecord, TabJoueur); NAME fichier; REF(DIRECTFILE) fichier; INTEGER ARRAY TabRecord; TEXT ARRAY TabJoueur; !guess; BEGIN INTEGER n; fichier :- NEW DIRECTFILE("HiScore"); fichier.SETACCESS("Append"); fichier.OPEN(BLANKS(80)); fichier.OUTINT(TabRecord(1), 4); fichier.OUTCHAR(' '); fichier.OUTTEXT(TabJoueur(1)); fichier.OUTIMAGE; FOR n := 2 STEP 1 UNTIL 5 DO BEGIN IF TabRecord(n) <> 0 AND TabJoueur(n) =/= NOTEXT THEN BEGIN IF TabRecord(n) <> TabRecord(n-1) AND TabJoueur(n) <> TabJoueur(n-1) THEN BEGIN fichier.OUTINT(TabRecord(n), 4); fichier.OUTCHAR(' '); fichier.OUTTEXT(TabJoueur(n)); fichier.OUTIMAGE; END; END; END; fichier.CLOSE; END---AddToScoreFile(fichier, TabRecord, TabJoueur)---; %le programme comme tel SETSIZE(912,650).SETBACKGROUND("gray10"); u := CLOCKTIME; CreateFile; Instruction(1); WHILE NOT playagain DO BEGIN PlaceButton(1); Setting(dimX, dimY, vitesse, diff, nom); CreateMountain(dimX, dimY, maze); SetPerceuse(dimX, dimY, xcav, ycav); Excavate(xcav, ycav, maze); EffaceTableau; CreateSortie(dimX, dimY, xs, ys, maze); PlaceButton(2); IF nightmar THEN BEGIN Hidebouton; Nightmare; END; PrintMaze(dimX, dimY, maze, xs, ys); PointDEntree(xc, yc, maze); TEXTE(506, 625, "0"); refr := 1; dir := 1; PlaceInTable(HiScore, record, nomjoueur); temps := CLOCKTIME; WHILE NOT maze(xc, yc) = sortie DO Travaille; EndingSequence; END; FinalEndingSequence; END; NEW EXEMPLE("**********Le probl!232!me du Mont X-Windows**********"); END %C'est fini, il n'y a plus rien a corriger....... :)