PROGRAM Reversi; (*** 2ø PROJET DE LI1 DU BINOME : LAPORTE-FAURET Olivier GOUDOU Pascal ***) CONST noir=0, bleu=1, rouge=4, jaune=14, blanc=15, bas_g=1, gauche=2, haut_g=3, haut=4, haut_d=5, droite=6, bas_d=7, bas=8; VAR nb_rouges,nb_bleus,libre : INTEGER, grille : ARRAYOF ARRAYOF rectangle, gr_prio : ARRAYOF ARRAYOF INTEGER, meill_coup : ARRAYOF infos, som_prio,nb_pions_pris : INTEGER, ligne,colonne : INTEGER; (***********************************************************************) UNIT points : CLASS; VAR x,y : INTEGER; END points; (***********************************************************************) UNIT rectangle : CLASS; VAR p1, p2 : points, occupe : INTEGER; END rectangle; (***********************************************************************) UNIT infos : CLASS; VAR sens : INTEGER, li,co : INTEGER; END infos; (***********************************************************************) UNIT affiche_grille : PROCEDURE; UNIT init_grille : PROCEDURE; (*** Cette proc‚dure permet d'initialiser les grilles et les tableaux n‚cessaires au bon d‚roulement du programme. ***) VAR i,j,icks,igrec : INTEGER; BEGIN (* initialisation de la grille devant contenir les pions rouges et bleus *) ARRAY grille DIM (1:8); FOR i:=1 TO 8 DO ARRAY grille(i) DIM (1:8); OD; igrec:=40; FOR i:=1 TO 8 DO icks:=10; FOR j:=1 TO 8 DO grille(i,j):=NEW rectangle; grille(i,j).p1:=NEW points; grille(i,j).p2:=NEW points; grille(i,j).p1.x:=icks; grille(i,j).p1.y:=igrec; grille(i,j).p2.x:=icks+36; grille(i,j).p2.y:=igrec+30; grille(i,j).occupe:=noir; icks:=icks+36; OD; igrec:=igrec+30; OD; (* initialisation de la grille des priorit‚s *) ARRAY gr_prio dim (1:8); FOR i:=1 TO 8 DO ARRAY gr_prio(i) DIM (1:8); OD; gr_prio(1,1):=20; gr_prio(1,8):=20; gr_prio(8,1):=20; gr_prio(8,8):=20; gr_prio(1,3):=14; gr_prio(1,6):=14; gr_prio(8,3):=14; gr_prio(8,6):=14; gr_prio(3,1):=14; gr_prio(6,1):=14; gr_prio(3,8):=14; gr_prio(6,8):=14; gr_prio(1,4):=12; gr_prio(1,5):=12; gr_prio(8,4):=12; gr_prio(8,5):=12; gr_prio(4,1):=12; gr_prio(5,1):=12; gr_prio(4,8):=12; gr_prio(5,8):=12; gr_prio(1,2):=9; gr_prio(1,7):=9; gr_prio(8,2):=9; gr_prio(8,7):=9; gr_prio(2,1):=9; gr_prio(7,1):=9; gr_prio(2,8):=9; gr_prio(7,8):=9; gr_prio(3,3):=6; gr_prio(3,6):=6; gr_prio(6,3):=6; gr_prio(6,6):=6; gr_prio(3,4):=4; gr_prio(3,5):=4; gr_prio(6,4):=4; gr_prio(6,5):=4; gr_prio(4,3):=4; gr_prio(5,3):=4; gr_prio(4,6):=4; gr_prio(5,6):=4; gr_prio(2,3):=2; gr_prio(2,4):=2; gr_prio(2,5):=2; gr_prio(2,6):=2; gr_prio(7,3):=2; gr_prio(7,4):=2; gr_prio(7,5):=2; gr_prio(7,6):=2; gr_prio(3,2):=2; gr_prio(4,2):=2; gr_prio(5,2):=2; gr_prio(6,2):=2; gr_prio(3,7):=2; gr_prio(4,7):=2; gr_prio(5,7):=2; gr_prio(6,7):=2; gr_prio(4,4):=2; gr_prio(4,5):=2; gr_prio(5,4):=2; gr_prio(5,5):=2; gr_prio(2,2):=1; gr_prio(2,7):=1; gr_prio(7,2):=1; gr_prio(7,7):=1; END init_grille; UNIT cercles_au_centre : PROCEDURE; VAR i,j : INTEGER; BEGIN CALL dessine_cercle(4,4,rouge); CALL dessine_cercle(4,5,bleu); CALL dessine_cercle(5,4,bleu); CALL dessine_cercle(5,5,rouge); nb_rouges:=2; nb_bleus:=2; libre:=60; END cercles_au_centre; UNIT chiffres : IIUWGRAPH PROCEDURE; VAR i,col,lig : INTEGER; BEGIN CALL COLOR(blanc); col:=28; FOR i:=49 TO 56 DO CALL MOVE(col,30); CALL HASCII(i); col:=col+36; OD; lig:=55; FOR i:=49 TO 56 DO CALL MOVE(0,lig); CALL HASCII(i); lig:=lig+30; OD; END chiffres; UNIT quadrillage : IIUWGRAPH PROCEDURE; VAR col,lig : INTEGER; BEGIN CALL COLOR(blanc); col:=10; WHILE col<=298 DO CALL MOVE(col,40); CALL DRAW(col,280); col:=col+36; OD; lig:=40; WHILE lig<=280 DO CALL MOVE(10,lig); CALL DRAW(296,lig); lig:=lig+30; OD; END quadrillage; VAR col,lig,tch : INTEGER; BEGIN CALL init_grille; CALL quadrillage; CALL cercles_au_centre; CALL chiffres; END affiche_grille; (***********************************************************************) UNIT dessine_cercle : IIUWGRAPH PROCEDURE(ptx,pty,couleur : INTEGER); VAR cx,cy : INTEGER; BEGIN PREF MOUSE BLOCK BEGIN CALL COLOR(couleur); cx:=(grille(ptx,pty).p1.x + grille(ptx,pty).p2.x)/2; cy:=(grille(ptx,pty).p1.y + grille(ptx,pty).p2.y)/2; CALL HIDECURSOR; CALL CIRB(cx,cy,16,0.0,0.0,couleur,1,1,1); CALL SHOWCURSOR; grille(ptx,pty).occupe:=couleur; END; END dessine_cercle; (***********************************************************************) UNIT efface : IIUWGRAPH PROCEDURE(x,y : INTEGER); VAR abscis : INTEGER; BEGIN CALL COLOR(noir); CALL MOVE (x,y); FOR abscis:=x TO 639 DO CALL OUTSTRING(" "); CALL MOVE(abscis,y); OD; END efface; (***********************************************************************) UNIT texte : IIUWGRAPH PROCEDURE (x,y,c : INTEGER; s : STRING); BEGIN PREF MOUSE BLOCK BEGIN CALL COLOR(c); CALL MOVE (x,y); CALL OUTSTRING(s); END; END texte; (***********************************************************************) UNIT fill : IIUWGRAPH PROCEDURE (x,y,large,haut,couleur:INTEGER) ; VAR i : INTEGER ; BEGIN CALL COLOR(couleur); FOR i:=y TO y+haut DO CALL MOVE(x,i) ; CALL DRAW(x+large,i) ; OD ; END fill; (***********************************************************************) UNIT saisie_rep : IIUWGRAPH PROCEDURE (couleur : INTEGER; OUTPUT valeur : CHAR); VAR c : INTEGER; BEGIN DO c:=INKEY; IF c=78 ORIF c=79 ORIF c=110 ORIF c=111 THEN EXIT FI; (* N *) (* O *) (* n *) (* o *) OD; valeur:=CHR(c); (*CALL COLOR(couleur); CALL HASCII(c); CALL pause(1);*) END saisie_rep; (***********************************************************************) UNIT pause : PROCEDURE(seconde : INTEGER); VAR temps:INTEGER; BEGIN FOR temps:=1 TO (1000*seconde) DO OD; END pause; (***********************************************************************) UNIT test_couleur : PROCEDURE(couleur : INTEGER); BEGIN IF couleur=rouge THEN nb_rouges:=nb_rouges+1; nb_bleus:=nb_bleus-1 ELSE nb_bleus:=nb_bleus+1; nb_rouges:=nb_rouges-1; FI; END test_couleur; (***********************************************************************) (* Dans les 4 proc‚dures qui suivent, les flŠches pr‚sentes sous les en_tˆtes indiquent le sens dans lequel s'effectue la coloration *) UNIT diagonale_droite : PROCEDURE(xd,yd,xa,ya,colorie : INTEGER); (* > *) (* / *) (* / *) (* / *) (* / *) VAR i,j : INTEGER; BEGIN i:=xd; j:=yd; WHILE i>=xa AND j<=ya DO CALL dessine_cercle(i,j,colorie); CALL test_couleur(colorie); i:=i-1; j:=j+1; OD; END diagonale_droite; (***********************************************************************) UNIT diagonale_gauche : PROCEDURE(xd,yd,xa,ya,colorie : INTEGER); (* < *) (* \ *) (* \ *) (* \ *) (* \ *) VAR i,j : INTEGER; BEGIN i:=xd; j:=yd; WHILE i>=xa AND j>=ya DO CALL dessine_cercle(i,j,colorie); CALL test_couleur(colorie); i:=i-1; j:=j-1; OD; END diagonale_gauche; (***********************************************************************) UNIT verticale : PROCEDURE(xd,xa,y,colorie : INTEGER); (* | *) (* | *) (* | *) (* | *) (* v *) VAR i : INTEGER; BEGIN i:=xd; WHILE i<=xa DO CALL dessine_cercle(i,y,colorie); CALL test_couleur(colorie); i:=i+1; OD; END verticale; (***********************************************************************) UNIT horizontale : PROCEDURE(x,yd,ya,colorie : INTEGER); (* *) (* *) (* -----> *) (* *) (* *) VAR j : INTEGER; BEGIN j:=yd; WHILE j<=ya DO CALL dessine_cercle(x,j,colorie); CALL test_couleur(colorie); j:=j+1; OD; END horizontale; (***********************************************************************) UNIT cherche_intervalle : IIUWGRAPH PROCEDURE(abscis,ordon,couleur : INTEGER; dessinez : BOOLEAN; OUTPUT trouve : BOOLEAN); VAR i,j,inverse : INTEGER, somme,nb_pris,so,nbp : INTEGER; BEGIN IF couleur=rouge THEN inverse:=bleu ELSE inverse:=rouge FI; IF ordon>2 THEN (* recherche en bas … gauche *) IF abscis<7 THEN i:=abscis; j:=ordon; DO so:=so+gr_prio(i,j); i:=i+1; j:=j-1; IF i>8 ORIF j<1 THEN EXIT FI; IF grille(i,j).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF i<=8 ANDIF i<>abscis+1 ANDIF j>=1 ANDIF j<>ordon-1 ANDIF grille(i,j).occupe=couleur THEN somme:=so; nb_pris:=nbp; trouve:=TRUE; IF dessinez THEN CALL diagonale_droite(i-1,j+1,abscis+1,ordon-1,couleur); ELSE IF couleur=rouge THEN RETURN FI; FI; FI; FI; (*abscis<7*) (* recherche vers la gauche *) so:=0; nbp:=0; j:=ordon; DO so:=so+gr_prio(abscis,j); j:=j-1; IF j<1 THEN EXIT FI; IF grille(abscis,j).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF j>=1 ANDIF j<>ordon-1 ANDIF grille(abscis,j).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL horizontale(abscis,j+1,ordon-1,couleur); ELSE IF couleur=rouge THEN RETURN FI; FI; FI; (* recherche en haut … gauche *) IF abscis>2 THEN so:=0; nbp:=0; i:=abscis; j:=ordon; DO so:=so+gr_prio(i,j); i:=i-1; j:=j-1; IF i<1 ORIF j<1 THEN EXIT FI; IF grille(i,j).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF i>=1 ANDIF i<>abscis-1 ANDIF j>=1 ANDIF j<>ordon-1 ANDIF grille(i,j).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL diagonale_gauche(abscis-1,ordon-1,i+1,j+1,couleur); ELSE IF couleur=rouge THEN RETURN FI; FI; FI; FI; (*abscis>2*) FI; (*ordon>2*) (* recherche vers le haut *) IF abscis>2 THEN so:=0; nbp:=0; i:=abscis; DO so:=so+gr_prio(i,ordon); i:=i-1; IF i<1 THEN EXIT FI; IF grille(i,ordon).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF i>=1 ANDIF i<>abscis-1 ANDIF grille(i,ordon).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL verticale(i+1,abscis-1,ordon,couleur); ELSE IF couleur=rouge THEN RETURN FI; FI; FI; FI; (*abscis>2*) IF ordon<7 THEN (* recherche en haut … droite *) IF abscis>2 THEN so:=0; nbp:=0; i:=abscis; j:=ordon; DO so:=so+gr_prio(i,j); i:=i-1; j:=j+1; IF i<1 ORIF j>8 THEN EXIT FI; IF grille(i,j).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF i>=1 ANDIF i<>abscis-1 ANDIF j<=8 ANDIF j<>ordon+1 ANDIF grille(i,j).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL diagonale_droite(abscis-1,ordon+1,i+1,j-1,couleur); ELSE IF couleur=rouge THEN RETURN FI; FI; FI; FI; (*abscis>2*) (* recherche vers la droite *) so:=0; nbp:=0; j:=ordon; DO so:=so+gr_prio(abscis,j); j:=j+1; IF j>8 THEN EXIT FI; IF grille(abscis,j).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF j<=8 ANDIF j<>ordon+1 ANDIF grille(abscis,j).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL horizontale(abscis,ordon+1,j-1,couleur); ELSE IF couleur=rouge THEN RETURN FI; FI; FI; (* recherche en bas … droite *) IF abscis<7 THEN so:=0; nbp:=0; i:=abscis; j:=ordon; DO so:=so+gr_prio(i,j); i:=i+1; j:=j+1; IF i>8 ORIF j>8 THEN EXIT FI; IF grille(i,j).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF i<=8 ANDIF i<>abscis+1 ANDIF j<=8 ANDIF j<>ordon+1 ANDIF grille(i,j).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL diagonale_gauche(i-1,j-1,abscis+1,ordon+1,couleur) ELSE IF couleur=rouge THEN RETURN FI; FI; FI; FI; (*abscis<7*) FI; (*ordon<7*) (* recherche vers le bas *) IF abscis<7 THEN so:=0; nbp:=0; i:=abscis; DO so:=so+gr_prio(i,ordon); i:=i+1; IF i>8 THEN EXIT FI; IF grille(i,ordon).occupe<>inverse THEN EXIT FI; nbp:=nbp+1; OD; IF i<=8 ANDIF i<>abscis+1 ANDIF grille(i,ordon).occupe=couleur THEN somme:=somme+so; nb_pris:=nb_pris+nbp; trouve:=TRUE; IF dessinez THEN CALL verticale(abscis+1,i-1,ordon,couleur) FI; FI; FI; (*abscis<7*) IF trouve ANDIF dessinez THEN CALL dessine_cercle(abscis,ordon,couleur); IF couleur=rouge THEN nb_rouges:=nb_rouges+1 ELSE nb_bleus:=nb_bleus+1; FI; FI; IF somme>=som_prio THEN IF nb_pris>nb_pions_pris THEN som_prio:=somme; nb_pions_pris:=nb_pris; ligne:=abscis; colonne:=ordon; FI; FI; END cherche_intervalle; (***********************************************************************) UNIT cherche_case : PROCEDURE(abscis,ordon : INTEGER; OUTPUT trouve : BOOLEAN); (* Cette proc‚dure va permettre de rechercher dans la matrice "grille", la position du point de coordonn‚es (abscis,ordon) - ce point correspond en fait au point de clic de la souris. La case ainsi obtenue se situe … la ligne lig et en colonne col *) VAR verif : BOOLEAN, lig,col : INTEGER; BEGIN FOR lig:=1 TO 8 DO IF grille(lig,1).p1.y<=ordon ANDIF ordon<=grille(lig,1).p2.y THEN FOR col:=1 TO 8 DO IF grille(lig,col).p1.x<=abscis ANDIF abscis<=grille(lig,col).p2.x THEN IF grille(lig,col).occupe=noir THEN CALL cherche_intervalle(lig,col,rouge,TRUE,trouve); FI; EXIT; FI; OD; EXIT; FI; OD; END cherche_case; (***********************************************************************) UNIT app_tch : IIUWGRAPH PROCEDURE; VAR tch : INTEGER; BEGIN CALL texte(150,310,jaune,"APPUYER SUR ENTREE"); DO tch:=INKEY; IF tch=13 THEN EXIT FI; OD; END app_tch; (***********************************************************************) UNIT resultat : PROCEDURE; BEGIN WRITELN("Rouges = ",nb_rouges :2 ,", Bleus = ",nb_bleus :2); IF nb_rouges>nb_bleus THEN WRITE("Les Rouges ont gagn‚ de ",nb_rouges-nb_bleus :2," point(s)") FI; IF nb_rouges