Delphi, grille de Sudoku

Fermé
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 20 juil. 2008 à 22:11
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 7 juil. 2010 à 21:12
Bonjour,

Il y a déjà quelques temps j'avais fait un solveur de Sudoku en ML avec Caml Light

Aujourd'hui je souhaiterai le reprogrammer mais en Pascal avec Delphi

Question : Comment créer une grille 9x9 éditable sans avoir à mettre en place 81 Edit ?

PS : Je maitrise plutôt bien le langage Pascal, mais pas encore trop le Delphi...
A voir également:

5 réponses

Bonjour,

Pour débuter avec Delphi le mieux est de commencer avec l'excellent Guide Delphi en Français de Frédéric Beaulieu. Ensuite vous pouvez consulter ces très nombreux cours et tutoriels Delphi, et enfin si vous avez des questions commencez par chercher dans la F.A.Q Delphi.
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 juil. 2008 à 01:51
Ecoutez vous tous les Adjur, Djoobi, Djump, André ou NoisetteProd, ma conception d'un forum n'est pas d'être redondant à toujours avoir les mêmes réponses stéréotypés balancées au hasard sans même prendre le temps de lire les questions.
Certes il est parfois bon d'apporter de l'aide provenant de source déjà écrite ailleurs, comme ce guide de Frédéric Beaulieu que j'ai d'ailleurs déjà en ma possession (mais que je n'ai pas lu en entier car il est beaucoup trop volumineux pour l'usage que j'ai envie de faire de Delphi)
Mais à moins que personne n'en ai lu plus que moi, il serait bon d'indiquer une page ou un paragraphe précis de cet ouvrage, de façon à réellement faire progresser mon travail (et celui des autres par la même occasion) car si tu connaissais la réponse à mon problème il t'aurais suffit de me la donner plutôt que de me renvoyer vers cette bibliographie aussi assommante, qu'il m'insupporte de voir à tort et à travers dans tous les forums !

Je remercie d'avance tout ceux qui prennent au sérieux l'aide aux internautes (dont je pense faire partie) et qui sauront je l'espère apporter une réponse réellement constructive à mon problème...
0
Salut,

Tu sais ce que c'est un moteur de recherches ? Tu as jamais entendu parler de google ?

Et tu as pas vu qu'il y à un moteur de recherche haut gauche sur developpez ?

En deux secondes, je tape Sudoku Delphi dans la boite recherches de developpez.com, et oh surprise je trouve un code source Sudoku pour Delphi : https://pascalfonteneau.developpez.com/sudoku/

C'est pas beau de vilipender des personnes qui essayent de t'aider...

Ces personnes qui veulent t'aider ne peuvent pas savoir clairement ou tu en est, ton niveau, ta formation, etc, et ce que tu veux précisément si tu n'explique pas en détail...

Par ailleurs quand on est Prof, donner la soluce toute faite est contre productif, on ne sais pas si ce que tu recherche c'est un exercice, ou un hobbie, les personnes du forum ne sont pas des "medium"...

Le but normalement c'est que toi tu apprenne programmer, d'où des liens sur les tutoriels...
0
Célien Messages postés 5729 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 9 septembre 2021 1 991
21 juil. 2008 à 02:29
Salut KX,

Mon code Pascal passe très bien dans Delphi, tu es bloqué ou au juste ?

Pourquoi ton code Pascal serais pas compilable sous Delphi ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 juil. 2008 à 14:12
Bonjour,

Ce n'est pas que mon code pascal ne passe pas sous Delphi, c'est que je voudrais avoir une grille éditable sur mon Form (un peu comme une combinaison de 81TEdit en 9x9, ou un TF1Book) pour éditer chaque case, de façon à transférer les valeurs vers une variable de type cube=array[1..9,1..9] of array[0..9] of byte; sur laquelle je ferais mes calculs, puis une fois terminé actualiser la grille.

Ma question finalement porte sur l'objet Tquelquechose qui me permettrait de visualiser ma grille, je ne les connais pas tous et je n'ai pas trouvé un qui corresponde à ce que je voulais...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut je serais interessé de voir ton programme en caml si cela ne te derange pas et si ce n'est pas du objective caml ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 juin 2010 à 14:01
Ouh là... c'est que ça commence à dater tout ça !
Je ne sais pas si je l'ai encore, mais c'était en Caml Light, je vais regarder si je le retrouve.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 juil. 2010 à 18:08
Bon, j'ai mis un peu de temps, mais j'ai réussi à le retrouver !
Le code date de 2007, c'était l'un de mes tout premiers programmes, alors autant dire qu'il est loin d'être parfait...
Je pourrais le corriger, l'améliorer, mettre des commentaires ou indenter mon code, mais je n'ai pas trop de temps alors je le laisse brut comme ça, tel qu'il était dans mes archives ;-)

Pour démarrer le programme, je pense qu'il faut faire sudoku();; mais il y avait d'autres fonctionnalités (notamment sauvegarder la grille) mais je ne sais plus trop comment on fait...

#open "graphics";;
open_graph "";;

let init () =
[|[|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
	[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|];
  [|[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];
    [|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];[|0;1;2;3;4;5;6;7;8;9|];|]|];;
    
let grille simple=
let t=ref 3 and p=ref 1 in
if simple then begin clear_graph (); t:=9 ; p:=0 end;
set_color black;
moveto 0 0;
for i=0 to !t do
moveto (!p+270*i/ !t) 0; lineto (!p+270*i/ !t) 270;
done;
for i=0 to !t do
moveto 0 (!p+270*i/ !t); lineto 270 (!p+270*i/ !t);
done;;

let clear_fichier ()=
let canal=open_out "C:/sudo.ini" in
output_byte canal 0;
close_out canal;;

let etat cube=
let e=make_matrix 9 9 0 in
for i=0 to 8 do for j=0 to 8 do
e.(i).(j)<-cube.(i).(j).(0)
done; done; e;;

let sauvegarde fin cube=
let s=ref "sudo.ini" in
if fin then s:="sudo2.ini";
let e=etat cube in
let canal=open_out ("C:/"^(!s)) in
for i=0 to 8 do for j=0 to 8 do
if cube.(i).(j).(0)<>0 then begin
output_byte canal i;
output_byte canal j;
output_byte canal (cube.(i).(j).(0)); end;
done; done;
close_out canal;;

let début fin=
let s=ref "sudo.ini" in
if fin then s:="sudo2.ini";
let l=ref [] in
begin try
let canal=open_in ("C:/"^(!s)) in
if fin then set_color black else set_color red;
while true do
let a=input_byte canal in let b=input_byte canal in let c=input_byte canal in 
l:= !l@[(a,b,c)]; moveto (30*a+11) (30*b+5);
draw_string (string_of_int c);
done;
close_in canal;
with |End_of_file -> ();
	 |sys__Sys_error a -> clear_fichier ();
end;
!l;;

let rec modif t=
grille false;
let s=ref t in
set_color black;
moveto 0 350;
draw_string "pour effacer la grille appuyer sur S";
moveto 0 300;
draw_string "cliquer sur une case pour en modifier la valeur ";
moveto 0 275;
draw_string "pour calculer appuyer sur la barre d'espace ";
let continue1=ref true in
while !continue1 do
let e=wait_next_event [Button_down; Key_pressed] in
if e.button then begin
let i=e.mouse_x/30 and j=e.mouse_y/30 in
if i<9 & j<9 then begin
continue1:=false;
set_color green;
fill_rect (30*i) (30*j) 30 30;
set_color black;
moveto 0 350;
draw_string "                                     ";
moveto 0 300;
draw_string "entrer une valeur de case (0 pour effacer)      ";
moveto 0 275;
draw_string "                                            ";
let continue2=ref true in
while !continue2 do
let f=wait_next_event [Key_pressed] in
let n=(int_of_char f.key-48) in
if n>(-1) & n<10 then begin
continue2:=false;
set_color white;
fill_rect (30*i) (30*j) 30 30;
set_color black;
moveto (30*i) (30*j+30);
lineto (30*i) (30*j);
lineto (30*i+30) (30*j);
moveto (30*i+11) (30*j+5);
set_color red;
if n>0 then draw_string (string_of_int n);
s:=modif (t@[(i,j,n)]);
end; done; end; end;
if e.keypressed & e.key=' ' then begin s:=t; continue1:=false; end;
if e.keypressed & e.key='s' then begin 
clear_fichier (); grille true; grille false;
end; done;
!s;;

let initiation t =
let cube=init () in
let n=list_length t in
let x=ref t in
for k=0 to n-1 do
match hd(!x) with
|(a,b,c)-> if c=0
then cube.(a).(b)<-[|0;1;2;3;4;5;6;7;8;9|]
else cube.(a).(b)<-[|c;0;0;0;0;0;0;0;0;0|];
x:=tl(!x); done; cube;;

let voisins cube v w x y =
let m=cube.(v).(w).(0) and n=cube.(x).(y).(0) in
if m=0 then cube.(v).(w).(n)<-0;
if n=0 then cube.(x).(y).(m)<-0;;

let recherche_ligne cube l=
for i=0 to 8 do for j=0 to 8 do
voisins cube l i l j;
done; done;;

let recherche_colonne cube c=
for i=0 to 8 do for j=0 to 8 do
voisins cube i c j c;
done; done;;

let recherche_région cube m n=
for i=0 to 2 do for j=0 to 2 do
for k=0 to 2 do for l=0 to 2 do
voisins cube (3*m+i) (3*n+j) (3*m+k) (3*n+l);
done; done; done; done;;

let recherche_combi cube l c n=
let l1=ref false and l2=ref false and l3=ref false and L=ref 0 in
let c1=ref false and c2=ref false and c3=ref false and C=ref 0 in
for k=0 to 8 do
if cube.(3*l).(k).(n)=0 then l1:=true;
if cube.(3*l+1).(k).(n)=0 then l2:=true;
if cube.(3*l+2).(k).(n)=0 then l3:=true;
if cube.(k).(3*c).(n)=0 then c1:=true;
if cube.(k).(3*c+1).(n)=0 then c2:=true;
if cube.(k).(3*c+2).(n)=0 then c3:=true;
done;
begin
match (!l1,!l2,!l3) with 
|(true,true,false)->L:=3
|(true,false,true)->L:=2
|(false,true,true)->L:=1
|_->()
end;
begin
match (!c1,!c2,!c3) with 
|(true,true,false)->C:=3
|(true,false,true)->C:=2
|(false,true,true)->C:=1
|_->()
end;
if !L<>0 & !C<>0
then cube.(3*l+ !L-1).(3*c+ !C-1)<-[|n;0;0;0;0;0;0;0;0;0|];;

let rec mini l= match l with
|[]-> 9
|0::q ->(mini q)
|a::q -> min a (mini q);;

let rec maxi l= match l with
|[]-> 0
|a::q -> max a (maxi q);;

let actualiser cube=
let l=ref [] and n=ref 0 in
for i=0 to 8 do
for j=0 to 8 do
l:=list_of_vect cube.(i).(j);
if (mini !l)=(maxi !l) & hd(!l)=0 then begin
cube.(i).(j)<-[|(mini !l);0;0;0;0;0;0;0;0;0|];
set_color blue;
moveto (30*i+11) (30*j+5);
draw_string (string_of_int (mini !l));
end; done; done;;

let global fin=
grille true;
let cube=initiation (modif (début fin)) in
if not fin then (sauvegarde false cube);
let mémoire=ref [|[||]|] in
while !mémoire<>(etat cube) do
for k=0 to 8 do
mémoire:=etat cube;
recherche_colonne cube k;
recherche_ligne cube k;
recherche_région cube (k/3) (k-3*(k/3));
done;
(*
for l=0 to 2 do
for c=0 to 2 do
for n=1 to 9 do
recherche_combi cube l c n
done; done; done;
*)
actualiser cube;
done;
sauvegarde true cube;;
let sudoku ()=global false;;
let continue ()=global true;;

exception stop;;

let vérif ()=
let etat=make_matrix 9 9 0 in
begin try 
let canal=open_in "C:/sudo2.ini" in
while true do
let i=input_byte canal in
let j=input_byte canal in
let k=input_byte canal in
etat.(i).(j)<-k;
done;
close_in canal;
with End_of_file->();
end;
try
let s1=ref 0 and s2=ref 0 in
for i=0 to 8 do
for j=0 to 8 do
if etat.(i).(j)=0 then raise (stop);
s1:= !s1+etat.(i).(j);
s2:= !s2+etat.(j).(i);
done;
if (!s1<>45)||(!s2<>45) then raise(stop);
s1:=0; s2:=0;
done; true;
with stop-> false;;
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 8/07/2010 à 17:52
Quelques remarques :

En publiant le code, il y a eu un bug, ce qui fait que le code ne marche pas...
À la fin de "modif" il est écrit e.key=' ' et e.key='s' mais il s'agit bien ici de caractères donc il faut encadrer les valeurs avec des accents graves [Alt Gr+7] et non pas avec des apostrophes [Alt Gr+4]

Sinon, il y a bien une sauvegarde de la grille mais elle est automatique dans les fichiers "C:\sudo.ini" avant calcul, et "C:\sudo2.ini" après calcul, mais le code tel qu'il est là ne permet pas faire de sauvegarde manuel.
Donc au final seul sudoku();; est à utiliser.
0