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.