program fsfs; uses graph,crt; const largcase= 40; grillex= (640-9*largcase) div 2; grilley= (480-9*largcase) div 2; var pilote,mode: integer; i,j: integer; {pour les boucles} S: string; victoire: boolean; curseurx,curseury: integer; key: char; grille_solution: array[1..9,1..9] of integer; grille_usager: array[1..9,1..9,1..2] of integer; {le 3e argument est 0 pour un chiffre a la mine et 1 pour un chiffre a lencre} var text: integer; b:char; procedure dessin_grille_de_jeu; begin for i:=0 to 9 do {dessine les lignes horizontales de la grille} begin if (i=0) or (i=3) or (i=6) or (i=9) then setlinestyle(0,$c3,3) {le 3 est pour une ligne epaisse} else setlinestyle(0,$c3,1); line(grillex,grilley+i*largcase,grillex+9*largcase,grilley+i*largcase); line(grillex+i*largcase,grilley,grillex+i*largcase,grilley+9*largcase); end; end; procedure determiner_solution; begin grille_solution[1,1]:= 9; grille_solution[1,2]:= 7; grille_solution[1,3]:= 2; grille_solution[1,4]:= 3; grille_solution[1,5]:= 6; grille_solution[1,6]:= 5; grille_solution[1,7]:= 1; grille_solution[1,8]:= 4; grille_solution[1,9]:= 8; grille_solution[2,1]:= 6; grille_solution[2,2]:= 3; grille_solution[2,3]:= 4; grille_solution[2,4]:= 7; grille_solution[2,5]:= 1; grille_solution[2,6]:= 8; grille_solution[2,7]:= 9; grille_solution[2,8]:= 5; grille_solution[2,9]:= 2; grille_solution[3,1]:= 8; grille_solution[3,2]:= 1; grille_solution[3,3]:= 5; grille_solution[3,4]:= 9; grille_solution[3,5]:= 2; grille_solution[3,6]:= 4; grille_solution[3,7]:= 7; grille_solution[3,8]:= 6; grille_solution[3,9]:= 3; grille_solution[4,1]:= 7; grille_solution[4,2]:= 4; grille_solution[4,3]:= 8; grille_solution[4,4]:= 2; grille_solution[4,5]:= 3; grille_solution[4,6]:= 9; grille_solution[4,7]:= 5; grille_solution[4,8]:= 1; grille_solution[4,9]:= 6; grille_solution[5,1]:= 2; grille_solution[5,2]:= 6; grille_solution[5,3]:= 3; grille_solution[5,4]:= 5; grille_solution[5,5]:= 7; grille_solution[5,6]:= 1; grille_solution[5,7]:= 4; grille_solution[5,8]:= 8; grille_solution[5,9]:= 9; grille_solution[6,1]:= 1; grille_solution[6,2]:= 5; grille_solution[6,3]:= 9; grille_solution[6,4]:= 4; grille_solution[6,5]:= 8; grille_solution[6,6]:= 6; grille_solution[6,7]:= 3; grille_solution[6,8]:= 2; grille_solution[6,9]:= 7; grille_solution[7,1]:= 5; grille_solution[7,2]:= 2; grille_solution[7,3]:= 1; grille_solution[7,4]:= 6; grille_solution[7,5]:= 9; grille_solution[7,6]:= 7; grille_solution[7,7]:= 8; grille_solution[7,8]:= 3; grille_solution[7,9]:= 4; grille_solution[8,1]:= 3; grille_solution[8,2]:= 8; grille_solution[8,3]:= 7; grille_solution[8,4]:= 1; grille_solution[8,5]:= 4; grille_solution[8,6]:= 2; grille_solution[8,7]:= 6; grille_solution[8,8]:= 9; grille_solution[8,9]:= 5; grille_solution[9,1]:= 4; grille_solution[9,2]:= 9; grille_solution[9,3]:= 6; grille_solution[9,4]:= 8; grille_solution[9,5]:= 5; grille_solution[9,6]:= 3; grille_solution[9,7]:= 2; grille_solution[9,8]:= 7; grille_solution[9,9]:= 1; end; procedure determiner_debut; begin grille_usager[1,2,1]:=7; grille_usager[1,2,2]:=1; grille_usager[1,4,1]:=3; grille_usager[1,4,2]:=1; grille_usager[1,5,1]:=6; grille_usager[1,5,2]:=1; grille_usager[1,6,1]:=5; grille_usager[1,6,2]:=1; grille_usager[1,7,1]:=1; grille_usager[1,7,2]:=1; grille_usager[2,2,1]:=3; grille_usager[2,2,2]:=1; grille_usager[2,6,1]:=8; grille_usager[2,6,2]:=1; grille_usager[2,9,1]:=2; grille_usager[2,9,2]:=1; grille_usager[3,5,1]:=2; grille_usager[3,5,2]:=1; grille_usager[3,7,1]:=7; grille_usager[3,7,2]:=1; grille_usager[3,9,1]:=3; grille_usager[3,9,2]:=1; grille_usager[4,1,1]:=7; grille_usager[4,1,2]:=1; grille_usager[4,3,1]:=8; grille_usager[4,3,2]:=1; grille_usager[4,6,1]:=9; grille_usager[4,6,2]:=1; grille_usager[4,7,1]:=5; grille_usager[4,7,2]:=1; grille_usager[4,8,1]:=1; grille_usager[4,8,2]:=1; grille_usager[5,2,1]:=6; grille_usager[5,2,2]:=1; grille_usager[5,4,1]:=5; grille_usager[5,4,2]:=1; grille_usager[5,6,1]:=1; grille_usager[5,6,2]:=1; grille_usager[5,8,1]:=8; grille_usager[5,8,2]:=1; grille_usager[6,2,1]:=5; grille_usager[6,2,2]:=1; grille_usager[6,3,1]:=9; grille_usager[6,3,2]:=1; grille_usager[6,4,1]:=4; grille_usager[6,4,2]:=1; grille_usager[6,7,1]:=3; grille_usager[6,7,2]:=1; grille_usager[6,9,1]:=7; grille_usager[6,9,2]:=1; grille_usager[7,1,1]:=5; grille_usager[7,1,2]:=1; grille_usager[7,3,1]:=1; grille_usager[7,3,2]:=1; grille_usager[7,5,1]:=9; grille_usager[7,5,2]:=1; grille_usager[8,1,1]:=3; grille_usager[8,1,2]:=1; grille_usager[8,4,1]:=1; grille_usager[8,4,2]:=1; grille_usager[8,8,1]:=9; grille_usager[8,8,2]:=1; grille_usager[9,3,1]:=6; grille_usager[9,3,2]:=1; grille_usager[9,4,1]:=8; grille_usager[9,4,2]:=1; grille_usager[9,5,1]:=5; grille_usager[9,5,2]:=1; grille_usager[9,6,1]:=3; grille_usager[9,6,2]:=1; grille_usager[9,8,1]:=7; grille_usager[9,8,2]:=1; end; procedure ecrire_grille_usager; begin settextjustify(centertext,centertext); settextstyle(1,horizdir,3); for i:=1 to 9 do for j:=1 to 9 do if grille_usager[i,j,1]<>0 then begin str(grille_usager[i,j,1],S); if grille_usager[i,j,2]=1 then setcolor(yellow) else setcolor(white); outtextxy(grillex+largcase*(2*i-1) div 2,grilley+largcase*(2*j-1) div 2,S); end else begin setcolor(black); outtextxy(grillex+largcase*(2*i-1) div 2-1,grilley+largcase*(2*j-1) div 2,'Û'); end; end; procedure menu; forward; procedure instruction; begin cleardevice; setcolor(white); outtextxy(20,20,'1.C''est un gros carre divise en 9 carres'); outtextxy(20,40,'et c''est 9 carres contiennent 9 cases composees de 3 lignes et 3 colonnes'); outtextxy(20,60,'2. Sur chaque ligne vous devez placer les chiffres de 1 a 9 sans les repeter'); outtextxy(20,80,'3. Sur chaque colonne vous devez placer les chiffres de 1 a 9...'); outtextxy(20,100,'...sans les repeter'); outtextxy(20,120,'4. Dans chaque region de 9 cases, vous devez placer les chiffres de 1 a 9...'); outtextxy(20,140,'... sans les repeter'); outtextxy(20,160,'5. Un truc tres pratique est d''eliminer les cases ou votre chiffre...'); outtextxy(20,180,'...ne peut se trouver'); outtextxy(20,200,'6.Pour gagner du temps vous pouvez commencer par les chiffres les plus nombreux'); outtextxy(20,220,'7.Attention a ce que vos chiffres ne se repetent pas dans une meme ligne ...'); outtextxy(20,240,'...ni dans un meme carre'); outtextxy(20,260,'8.Les nombres ecrits en jaune sont ceux que l''ordinateur vous donne'); outtextxy(20,280,'9.Vous ne pouvez pas ecrire par dessus les chiffres jaunes.'); outtextxy(20,300,'10.Pour ecrire un chiffre, deplacez le curseur a l''aide des 4 fleches...'); outtextxy(20,320,'... et appuyer sur un nombre'); outtextxy(20,340,'11.Si vous voulez effacer un nombre que VOUS avez inscrit (pas ceux en jaune)...'); outtextxy(20,360,'...vous devez appuyer sur la touche E pour effacer votre valeur'); outtextxy(20,380,'12.Pour quitter le jeu appuyer sur la touche Q'); outtextxy(250,400,'amusez-vous! en appuyant sur 2 maintenant'); outtextxy(20,440,' Pour revenir au menu appuyez sur Enter'); repeat until keypressed; menu; end; procedure jeu; begin cleardevice; outtextxy(20,20,'Q=quittez'); outtextxy(20,40,'E=effacer'); dessin_grille_de_jeu; determiner_solution; determiner_debut; ecrire_grille_usager; curseurx:=1; curseury:=1; repeat setcolor(white); line(grillex+largcase div 4+largcase*(curseurx-1),grilley+largcase*curseury-3, grillex+3*largcase div 4+largcase*(curseurx-1),grilley+largcase*curseury-3); key:= readkey; setcolor(black); line(grillex+largcase div 4+largcase*(curseurx-1),grilley+largcase*curseury-3, grillex+3*largcase div 4+largcase*(curseurx-1),grilley+largcase*curseury-3); case upcase(key) of #75:if curseurx>1 then dec(curseurx); #77:if curseurx<9 then inc(curseurx); #72:if curseury>1 then dec(curseury); #80:if curseury<9 then inc(curseury); 'E':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=0; '1':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=1; '2':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=2; '3':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=3; '4':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=4; '5':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=5; '6':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=6; '7':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=7; '8':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=8; '9':if grille_usager[curseurx,curseury,2]<>1 then grille_usager[curseurx,curseury,1]:=9; end; ecrire_grille_usager; victoire:=true; for i:=1 to 9 do for j:=1 to 9 do if grille_usager[i,j,1]<>grille_solution[i,j] then victoire:=false; if victoire then begin cleardevice; outtextxy(230,200,'Toutes mes felicitations vous etes maintenant'); outtextxy(240,230,' un vrai genie'); end; until upcase(key)='Q'; repeat until keypressed; end; procedure choix; begin b:=upcase(readkey); if (b = '1') then instruction else if (b='2') then jeu else end; Procedure Menu; begin cleardevice; setcolor(blue); settextstyle(1,0,30); outtextxy(100,20,'Sudoku'); setcolor(white); settextstyle(0,0,0); outtextxy(150,300,'1 - instructions'); outtextxy(150,315,'2 - jeu'); outtextxy(150,330,'X - quitter'); choix; end; begin pilote:=detect; initgraph(pilote,mode,'M:/BGI'); repeat menu; until (b= 'X'); end.