program tic_tac_toe_essai; uses crt, graph; var ttt:array[1..3,1..3] of integer; var lettre,reponse,cf,col:char; var x, y,pl,victoire,sortie,z,tour,joueur1, joueur2,point,ptf:integer; var pilote, mode:integer; var ptx1,ptx2,ptx3,ptx4,pty1,pty2,pty3,pty4,axex,axey :integer; var cx,cy,n,h,r,a,go,colx,coly:integer; var lx1,lx2,ly1,ly2:integer; var sorties: char; n1, n2:string[7]; nomdujeu, mc, sophie,S,M,V1,V2: string; procedure departgrille;(*la valeur zero sera attribuee a toutes les cases du tableau ttt*) begin for x:= 1 to 3 do begin for y:=1 to 3 do ttt[x,y]:=0; end; end; procedure grilledebut;(*graphique presentant le titre, puis page presentant les instructions*) begin clrscr; pilote:=detect; (*graphique presentant le titre du jeu et le nom de ses creatrices*) initgraph(pilote,mode,'m:/bgi'); setbkcolor(green); nomdujeu:=('Tic-Tac-Toe'); mc:=('Marie-Christine Marsan'); sophie:=('Sophie Durocher'); settextstyle(3,0,5); outtextxy((getmaxx-textwidth(nomdujeu)) div 2, 1,'Tic-Tac-Toe'); settextstyle(2,0,5); outtextxy((getmaxx-textwidth(mc)) div 2, (getmaxy-textheight(mc)) div 2, 'Marie-Christine Marsan'); outtextxy((getmaxx-textwidth(sophie)) div 2, ((getmaxy-textheight(sophie)) div 2) +40 , 'Sophie Durocher'); readln; closegraph; (*demande aux joueurs leur nom et l'emmagasine dans la bonne variable*) writeln('Bonjour,'); writeln(' '); write('Quel est le nom du joueur 1: '); readln(n1); writeln(' '); write('Quel est le nom du joueur 2: '); read(n2); clrscr; repeat(*les instructions du jeu en mode non graphique*) writeln('instruction:'); writeln('1. Chaque joeur choisi la forme de son jeton.'); writeln('2. Dans la grille 3x3, le joueur 1,', n1 ,', place son jeton dans une case vide.'); writeln('3. Le joueur 2,',n2, ' ,place son jeton dans une case vide.'); writeln('4. Les joeurs continuent ainsi jusqu''a temps qu''un joueur ai reussi a placer son jeton dans trois case de suite'); writeln(' (Les 3 cases peuvent etre en horizontal, en vertical ou en oblique.)'); writeln(' '); writeln(' '); writeln('Pesez sur x pour quitter les instructions'); readln; begin sound(349);(*extrait de la chanson du film le Roi Lion*) delay(800); sound(698); delay(650); sound(587); delay(650); sound(523); delay(650); sound(698); delay(650); sound(597); delay(650); sound(466); delay(900); sound(392); delay(900); sound(349); delay(800); sound(466); delay(600); sound(622); delay(700); sound(587); delay(800); sound(523); delay(2000); nosound; end; sorties:= readkey; until sorties = ('x');(*reecrit les instructions jusqu'a ce que l'utilisateur appuie sur la touche x'*) end; procedure grille;(*graphique du dessin de la planche de jeu, soit une grille*) begin pilote:=detect; initgraph(pilote,mode,'m:/bgi'); (*titre du jeu en haut de la grille*) setbkcolor(green); settextstyle(3,0,4); outtextxy((getmaxx-textwidth(nomdujeu)) div 2, 1,'Tic-Tac-Toe'); setlinestyle(0,$c3,3); line(240,50,240,430); line(400,50,400,430); line(100,166,540,166); line(100,313,540,313); (*ecrire la lettre correspondante a chaque case dans la grille*) outtextxy(215,120,'E'); outtextxy(375,120,'R'); outtextxy(525,120,'T'); outtextxy(215,275,'D'); outtextxy(375,275,'F'); outtextxy(525,275,'G'); outtextxy(215,410,'C'); outtextxy(375,410,'V'); outtextxy(525,410,'B'); (*ecrire au bas de l'ecran le nom des joueurs pour pouvoir ecrire a cote les points qu'ils ont accumules*) settextstyle(0,0,1); outtextxy(8,(getmaxY-textheight(n1)), n1); outtextxy(textwidth(n1)+8, getmaxy-textheight(n1), ':'); outtextxy(getmaxx-(textwidth(n2)+50), getmaxy-textheight(n2), n2); outtextxy(getmaxx- 50 , getmaxy-textheight(n2), ':'); (*afficher sur la meme fenetre que la grille du jeu le nombre de partie gagnee par chaque joueur a cote de leur nom respectif*) S:=' '; str(joueur1,S); outtextxy(100,470,S); M:=' '; str(joueur2,M); outtextxy(600,470 , M) end; procedure dessinx;(*dessin de la forme de la medaille. Ici c'est un X.*) begin setcolor(colx); line(ptx1,pty1,ptx2,pty2); line(ptx3,pty3,ptx4,pty4); end ; procedure dessino;(*dessin de la forme de la medaille. Ici, c'est un cercle vide*) begin setlinestyle(0,$c3,4); setcolor(coly); circle(axex,axey,50); end; procedure forme;(*permet de savoir quelle forme associer a chaque joueur, un X ou un O, pour pouvoir le tracer sur la grille. Chaque fois qu'un X est dessine, un do grave sera joue et chaque fois qu'un O sera joue, un do plus aigu sera joue.*) begin if pl=1 then(*pl1 est associe au X*) begin dessinx; sound(262); delay(150); nosound; end; if pl=2 then (*pl2 est associe au O*) begin dessino; sound(523); delay(150); nosound; end; end; procedure cptf;(*point est une variable qui associe au joueur1 le chiffre associe a la forme de son jeton. (1=X et 2=O). La variable ptf associe au joueur2 une variable qui sera differente de celle du joueur 1 pour pouvoir distinguer quel joueur aura gagne la partie. (Cela explique le 3-point)*) begin if point=1 then ptf:=3-point; if point=2 then ptf:=3-point; end; procedure fin;(*permet de savoir quel joueur a gagne selon la valeur de leur variable, vu a la procedure precedente, qui leur est attribuee*) begin cptf; if victoire= point then begin settextstyle(4,0,3); setcolor(red); Outtextxy(250,75,'Gagnant du tour'); Outtextxy(300,120,n1); joueur1:=joueur1+1; end else if victoire= ptf then begin settextstyle(4,0,3); setcolor(red); Outtextxy(250,75,'Gagnant du tour'); Outtextxy(300,120,n2); joueur2:=joueur2+1; end else if victoire=0 then begin settextstyle(4,0,3); setcolor(red); Outtextxy(250,100,'Partie nulle'); end; readln; end; procedure stp;(*variable qui permet de s'assurer qu'une meme touche ne soit pas peser 2 fois. Sorite=1 signifie que la touche n'a pas encore ete remplie et qu'on peut tracer une forme a l'interieur (case du tableau=0). Tandis que Sortie=0 siginfie que la touche que l'utilisateur a pesee a deja ete remplie. (case du tableau est differente de 0)*) begin if ttt[x,y]=0 then sortie:=1; if ttt[x,y]<>0 then sortie:=0; end; procedure choix;(*procedure permettant de lire la lettre que le joueur pressera sur le clavier. Selon la touche appuyee, elle correspondera a une case du tableau ttt (d'ou le fait que l'on change les valeurs de x et y selon la touche pesee). Puis comme vu precedemment, si la case du tableau lui correspondant est vide, il pourra accorder une valeur de 1 a la variable 'sortie' et ainsi, modififier les coordonnees necessaires au tracage des differents jetons. (les ptx_ et pty_ correspondent a la forme 'x' et les axe_ correspondent a la form 'o') .*) begin lettre:=upcase(readkey); sortie:=0; if (lettre = 'E') then begin x:=1; y:=1; stp; if sortie=1 then begin ptx1:=100; pty1:=50; ptx2:=240; pty2:=166; ptx3:=240; pty3:=50; ptx4:=100; pty4:=166; axex:=170; axey:=108; end; end; if (lettre = 'R') then begin x:=2; y:=1; stp; if sortie=1 then begin ptx1:=240; pty1:=50; ptx2:=400; pty2:=166; ptx3:=400; pty3:=50; ptx4:=240; pty4:=166; axex:=320; axey:=108; end; end; if(lettre ='T') then begin x:=3; y:=1; stp; if sortie=1 then begin ptx1:=400; pty1:=50; ptx2:=540; pty2:=166; ptx3:=540; pty3:=50; ptx4:=400; pty4:=166; axex:=470; axey:=108; end; end; if (lettre ='D') then begin x:=1; y:=2; stp; if sortie=1 then begin ptx1:=100; pty1:=166; ptx2:=240; pty2:=313; ptx3:=240; pty3:=166; ptx4:=100; pty4:=313; axex:=170; axey:=239; end; end; if ( lettre='F') then begin x:=2; y:=2; stp; if sortie=1 then begin ptx1:=240; pty1:=166; ptx2:=400; pty2:=313; ptx3:=400; pty3:=166; ptx4:=240; pty4:=313; axex:=320; axey:=239; end; end; if (lettre='G') then begin x:=3; y:=2; stp; if sortie=1 then begin ptx1:=400; pty1:=166; ptx2:=540; pty2:=313; ptx3:=540; pty3:=166; ptx4:=400; pty4:=313; axex:=470; axey:=239; end; end; if (lettre= 'C') then begin x:=1; y:=3; stp; if sortie=1 then begin ptx1:=100; pty1:=313; ptx2:=240; pty2:=430; ptx3:=240; pty3:=313; ptx4:=100; pty4:=430; axex:=170; axey:= 371; end; end; if(lettre='V') then begin x:=2; y:=3; stp; if sortie=1 then begin ptx1:=240; pty1:=313; ptx2:=400; pty2:=430; ptx3:=400; pty3:=313; ptx4:=240; pty4:=430; axex:=320; axey:=371; end; end; if (lettre='B') then begin x:=3; y:=3; stp; if sortie=1 then begin ptx1:=400; pty1:=313; ptx2:=540; pty2:=430; ptx3:=540; pty3:=313; ptx4:=400; pty4:=430; axex:=470; axey:=371; end; end; end; procedure ronds; (*permet de dessiner des ronds de couleurs differentes a differents endroit sur l'ecran.Il repetera l'operation 50 fois pour un total de 100 cercles.*) begin delay(1000); for a:=1 to 50 do begin randomize; n:=random(14); cx:=random(200)+20; cy:=random(500); r:=random(200)+450; h:=random(500); setfillstyle(1,n); fillellipse(cx,cy,20,20); fillellipse(r,h,20,20); delay(1); end; end; procedure collier;(*dessin d'un collier pour les medailles*) begin setcolor(black); setlinestyle(1,$c3,3); setfillstyle(1,blue); fillellipse(325,100,150,200); setfillstyle(1,white); fillellipse(325,100,100,150); end; procedure medx; (*dessin du pendantif pour la medaille en forme de 'x' de la couleur jaune*) begin setcolor(yellow); line(300,300,350,400); line(300,298,350,398); line(300,296,350,396); line(300,294,350,394); line(300,292,350,392); line(300,290,350,390); line(300,301,350,401); line(300,302,350,402); line(300,303,350,403); line(300,304,350,404); line(300,304,350,405); line(300,400,350,300); line(300,398,350,298); line(300,396,350,296); line(300,394,350,294); line(300,392,350,292); line(300,390,350,290); line(300,401,350,301); line(300,402,350,302); line(300,403,350,303); line(300,404,350,304); line(300,405,350,305); setcolor(white); bar(322,295,327,315); end; procedure medo;(*dessin du pendantif pour la medaille en forme de cercle jaune.*) begin setcolor(yellow); setfillstyle(1,yellow); fillellipse(325,350,50,50); setfillstyle(1,white); fillellipse(325,350,25,25); setcolor(white); bar(322,295,327,315); end; procedure medn;(*dessin du pendantif pour la medaille qui apparaitera lorsque que la partie sera nulle. C'est un cercle contenant un 'x'(dessin utilise pour la medaille du 'x' seulement).*) begin setcolor(yellow); circle(325,350,50); circle(325,350,48); circle(325,350,46); circle(325,350,52); circle(325,350,44); circle(325,350,54); circle(325,350,56); medx; end; procedure musiquevic;(*Petite musique rappelant celle du jeu video Zelda lorsque link gagne un nouvel objet. Elle serta joue seulement lorsque la partie sera finie*) begin sound(131); delay(200); sound(147); delay(200); sound(165); delay(200); sound(176); delay(1500); nosound; end; procedure dessinmed;(*procedure permettant de choisir qu'elle medaille apparaitera lorsque la partie sera finie.*) begin if victoire= 1 then (*si victoire=1, cela veut dire que les 'x' ont gagnes*) begin collier; medx; musiquevic; delay(1000); setcolor(red); settextstyle(1,0,5); fin; end else if victoire=2 then (*si victoire=2, cela veut dire que les 'o' ont gagne.*) begin collier; medo; musiquevic; delay(1000); setcolor(red); settextstyle(1,0,5); fin; end else if victoire=0 then (*si victoire=0, cela veut dire que la partie est nulle.*) begin collier; medn; musiquevic; delay(1000); setcolor(red); settextstyle(1,0,5); fin; end; end; procedure ligne; begin setlinestyle(0,$c3,3); setcolor(blue); line(lx1,ly1,lx2,ly2); end; procedure scanvictoire;(*permet de determiner a chaque tour joue si il y a un tic-tac-toe.(Si une colonne, une ligne ou une diagonale possede 3 formes identiques.) Puis, il accorde a la variable victoire, le chiffre correspondant au joueur qui vient de jouer, puisque c'est necessairement lui qui aura joue un jeton qui creera un tic-tac-toe.Si il n'y a pas de tic-tac-toe, victoire=0 et donc cela est associe a une partie nulle.*) begin if (ttt[1,1]=ttt[1,2]) and (ttt[1,2]=ttt[1,3]) and (ttt[1,3]=pl) then begin victoire:=pl; lx1:=170; ly1:=50; lx2:=170; ly2:=430; ligne; end else if (ttt[2,1]=ttt[2,2]) and (ttt[2,2]=ttt[2,3]) and (ttt[2,3]=pl) then begin victoire:=pl; lx1:=330; ly1:=50; lx2:=330; ly2:=430; ligne; end else if (ttt[3,1]=ttt[3,2]) and (ttt[3,2]=ttt[3,3]) and (ttt[3,3]=pl) then begin victoire:=pl; lx1:=470; ly1:=50; lx2:=470; ly2:=430; ligne; end else if (ttt[1,1]=ttt[2,1]) and (ttt[2,1]=ttt[3,1]) and (ttt[3,1]=pl) then begin victoire:=pl; lx1:=100; ly1:=120; lx2:=540; ly2:=120; ligne; end else if (ttt[1,2]=ttt[2,2]) and (ttt[2,2]=ttt[3,2]) and (ttt[3,2]=pl) then begin victoire:=pl; lx1:=100; ly1:=230; lx2:=540; ly2:=230; ligne; end else if (ttt[1,3]=ttt[2,3]) and (ttt[2,3]=ttt[3,3]) and (ttt[3,3]=pl) then begin victoire:=pl; lx1:=100; ly1:=360; lx2:=540; ly2:=360; ligne; end else if (ttt[1,1]=ttt[2,2]) and (ttt[3,3]=ttt[2,2]) and (ttt[3,3]=pl) then begin victoire:=pl; lx1:=100; ly1:=50; lx2:=540; ly2:=430; ligne; end else if (ttt[3,1]=ttt[2,2]) and (ttt[2,2]=ttt[1,3]) and (ttt[1,3]=pl) then begin victoire:=pl; lx1:=540; ly1:=50; lx2:=100; ly2:=430; ligne; end else if tour=9 then victoire:=0; end; procedure couleur;(*permet aux joueurs de choisir la couleur de leur jeton.*) begin pilote:=detect; initgraph(pilote,mode,'m:/bgi'); setbkcolor(lightblue); outtextxy(5,5,'Choisissez la couleur pour les x'); outtextxy(5,40,'1=bleu'); outtextxy(5,80,'2=rouge'); outtextxy(5,120,'3=mauve'); repeat col:=readkey; (*couleur pour le jeton 'x'*) if col='1' then colx:=1; if col='2' then colx:=4; if col='3' then colx:=5; until (col='1') or (col='2') or (col='3') ;(*si le joueur selectionne autre chose qui n'est pas dans les choix, il devra rechoisir une couleur, jusqu'a ce que la touche selectionnee soit dans les choix.*) cleardevice; setbkcolor(13); outtextxy(5,5,'Choisissez la couleur pour les o'); outtextxy(5,40,'1=rouge clair'); outtextxy(5,80,'2=cyan'); outtextxy(5,120,'3=jaune'); repeat col:=readkey;(*couleur du jeton 'o'*) if col='1' then coly:=12; if col='2' then coly:=3; if col='3' then coly:=14; until (col='1') or (col='2') or (col='3');(*si le joueur selectionne autre chose qui n'est pas dans les choix, il devra rechoisir une couleur, jusqu'a ce que la touche selectionnee soit dans les choix.*) end; procedure shape; (*permet au joueur 1 de choisir la forme de son jeton*) begin pilote:=detect; initgraph(pilote,mode,'m:/bgi'); setbkcolor(10); settextstyle(0,0,1); setcolor(blue); outtextxy(5,5,'Joueur 1 choisissez votre jeton (X/O)'); outtextxy(5,50,'Pesez sur la touche x pour choisir les X'); outtextxy(5,75,'Pesez sur la touche o pour choisir les O'); settextstyle(0,0,1); outtextxy(5,150,'Le joueur 1 debutera '); outtextxy(5,175,'peu importe la forme de son jeton'); repeat cf:=upcase(readkey); if cf='X' then (*il a choisi le jeton en forme de 'x'*) begin pl:=1; point:=pl; end else if cf='O' then (*il a choisi le jeton en forme de 'o'*) begin pl:=2; point:=pl; end until (cf='X') or (cf='O');(*il ne pourra continuer plus loin dans le programme tant que la touche choisi ne correspond pas a un choix.*) end; procedure trophee; (*dessin d'un trophee*) begin pilote:=detect; initgraph(pilote,mode,'m:/bgi'); setlinestyle(0, $c3, 3); setcolor(yellow); setfillstyle(1,yellow); fillellipse(170,160,70,60); bar(100,50,240,160); line(80,70, 80,180); arc(90,70, 0,180,10); arc(100,180,180,360,20); line(260, 70,260,180); arc(250, 70 ,0, 180,10); arc(240, 180, 180,360,20); fillellipse(170, 235, 15,15); line(155, 235,190 ,290); line(185, 235, 150, 290); fillellipse(170,290,20,20); bar(140,310,200,330); bar( 100, 330, 240, 350); bar(70, 350, 270, 370); setlinestyle(0,$c3, 1); setcolor(blue); line(500,0,500,600); line(510,0,630,120); line(630,0,510,120); circle(568,180,60); line(510,240,630,360); line(630,240,510,360); circle(568,420,60); setcolor(white); line(498,0,498,600); line(505,0,625,120); line(625,0,505,120); circle(568,180,58); line(505,240,625,363); line(625,240,505,360); circle(568,420,58); setcolor(red); line(503,0,503,600); line(515,0,635,120); line(635,0,515,120); circle(568,180,55); line(515,240,635,360); line(635,240,515,360); circle(568,420,55); end; procedure lostwoods; (*musique du jeu video Zelda 'Lost Woods'*) begin sound(349); delay(200); sound(440); delay(200); sound(494); delay(400); sound(349); delay(200); sound(440); delay(200); sound(494); delay(400); sound(349); delay(200); sound(440); delay(200); sound(494); delay(200); sound(659); delay(200); sound(587); delay(400); sound(494); delay(200); sound(523); delay(200); sound(494); delay(200); sound(392); delay(200); sound(330); delay(600); sound(294); delay(200); sound(330); delay(200); sound(392); delay(200); sound(330); delay(600); nosound; end; begin(*programme principal*) clrscr; nosound; grilledebut; clrscr; shape; couleur; joueur1:=0; joueur2:=0; repeat departgrille; grille; victoire:=0; pl:=point; sortie:=0; tour:=0; repeat begin repeat (*repete ses procedures tant qu'une case vide n'a pas ete selectionnee*) choix; ttt[x,y]:=pl; forme; scanvictoire; until sortie=1; (*cela permet de ne pas creer de confusion a chaque changement de tour (changement de jeton).*) ptx1:=0; pty1:=0; ptx2:=0; pty2:=0; ptx3:=0; pty3:=0; ptx4:=0; pty4:=0; axex:=1-100; axey:=-100; pl:=3-pl; tour:=tour+1; end; until (victoire=1) or (victoire=2) or (tour=9); (*le processus sera repete tant qu'il n'y a pas de tic-tac-toe ou que les cases ne sont pas toutes pleines*) settextstyle(1,4,5); Outtextxy(50,100,'Pesez sur enter'); readln; cleardevice; setbkcolor(black); ronds; dessinmed; cleardevice; settextstyle(4,0,5); outtextxy(50,200,'Voulez-vous rejouer (N/O)'); reponse:=upcase(readkey); until reponse='N';(*le jeu recommencera tant et aussi longtemps que le joueur ne pese pas sur la touche 'n'*) (*permet d'afficher le pointage final de toutes les parties gagnees par chaque joueur*) V1:=' '; str(joueur1,V1); V2:=' '; str(joueur2,V2); begin (*Permet de determiner quel joueur a gagne le plus de partie. Ce dernier se meritera un trophee a son nom.*) if joueur1>joueur2 then (*dessin d'un trophe et la gravure associe au gagnant (joueur1)*) begin trophee; settextstyle(4,0,2); setcolor(red); Outtextxy(130,75,'Champion'); Outtextxy(155,125,n1); lostwoods; settextstyle(4,0,4); Outtextxy(300,200,n1); outtextxy(400,200,V1); outtextxy(300,300,n2); outtextxy(400,300,V2); readln; end (*dessin du trophee et la gravure associee au gagnant (joueur 2)*) else if joueur1<joueur2 then begin trophee; settextstyle(4,0,2); setcolor(red); Outtextxy(130,75,'Champion'); Outtextxy(155,125,n2); lostwoods; settextstyle(4,0,4); Outtextxy(300,200,n1); outtextxy(400,200,V1); outtextxy(300,300,n2); outtextxy(400,300,V2); readln; end else begin(*dessin du trophee et la gravure associee a une partie nulle*) trophee; settextstyle(4,0,3); setcolor(red); Outtextxy(145,75,'XOX'); lostwoods; settextstyle(4,0,4); Outtextxy(300,200,n1); outtextxy(400,200,V1); outtextxy(300,300,n2); outtextxy(400,300,V2); readln; end; end; end.