steph sudoku
Messages postés1Date d'inscriptiondimanche 14 mai 2006StatutMembreDernière intervention14 mai 2006
-
14 mai 2006 à 18:30
Abadianet
Messages postés40Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention19 juin 2006
-
15 mai 2006 à 20:54
Bonsoir a tous!
j'ai un probleme sévère, je suis bloqué depuis trois semaines sur un tp en fac.
je dois le rendre mardi et je n'est toujours pas trouvé la solution à la programmation de mon sudoku.
J'ai une redondance de doubons. je suis perdu. Pourriez-vous m'apporter une aide ou une solution. Merci d'avance
Voici mon code sources. l'utilisation des strings est imposé par mon prof
//Empêche l'utilisateur de sélectionner une cellule non vide.
procedure TForm2.StringGrid1SelectCell(Sender: TObject; Col, Row: Longint; var CanSelect: Boolean);
begin
CanSelect := (StringGrid1.Cells[col,row]='');
end;
//Génère une nouvelle grille
procedure TForm2.Nouvellegrille1Click(Sender: TObject);
var I,J,z,A,B: integer;
TAB : array [1..9] of integer;
TUB : array [1..9] of integer;
T1:ttime;
begin
form2.Caption := 'Nom du joueur : ' + form1.Edit1.Text;
if (messagedlg('Voulez-vous vraiment commencer une nouvelle partie?', mtconfirmation, [mbyes,mbno],0) = mryes) then
begin
randomize;
//Prend l'heure du début de la partie
//timer1.Enabled := true;
T1 := (now);
label9.Caption:= timetostr(T1);
//Permet d'écrire seulement dans les colonnes sans doublons.
For I := 0 to 8 do
begin
For A:=1 to 9 do
begin
TAB[A]:=0;
end;
For J := 0 to 8 do
begin
z := (Random (9)+1);
If (TAB[z]=0) then
begin
stringgrid1.Cells[I,J] := inttostr(z);
TAB[z]:=z;
end
else
begin
While (TAB[z]=z)do
begin
z := (Random (9)+1);
end;
stringgrid1.Cells[I,J] := inttostr(z);
TAB[z]:=z;
end;
end;
end;
end;
//Permet d'écrire seulement dans les lignes sans doublons.
{For J := 0 to 8 do
begin
For B:=1 to 9 do
begin
TUB[B]:=0;
end;
For I := 0 to 8 do
begin
z := (Random (9)+1);
If (TUB[z]=0) then
begin
stringgrid1.Cells[I,J] := inttostr(z);
TUB[z]:=1;
end
else
begin
While (TUB[z]=1)do
begin
z := (Random (9)+1);
end;
stringgrid1.Cells[I,J] := inttostr(z);
TUB[z]:=1;
end;
end;
end;
end;}
end;
//Permet d'enregistrer la partie en cours.
procedure TForm2.Enregistrerlapartie1Click(Sender: TObject);
var Sudoku: typSudoku;
I,J:integer;
begin
If (savedialog1.Execute = true) then
begin
assignfile(Fic,savedialog1.FileName);
rewrite(Fic);
For J := 0 to 8 do
begin
For I := 0 to 8 do
begin
if stringgrid1.cells[J,I] = '' then
begin
Sudoku.table [I+1,J+1] := 0;
end
else
begin
Sudoku.table[I+1,J+1]:= strtoint(stringgrid1.cells[J,I]);
Sudoku.niveau := label2.Caption;
Sudoku.nom := form2.Caption;
end;
end;
end;
write(Fic,Sudoku);
Closefile(Fic);
end;
end;
//Permet d'ouvrir une partie existante.
procedure TForm2.Ouvrirunepartie1Click(Sender: TObject);
var Sudoku : typSudoku;
I, J : integer;
begin
If (opendialog1.Execute = true) then
begin
assignfile(Fic,opendialog1.FileName);
reset(Fic);
while not eof (Fic) do
begin
read(Fic,Sudoku);
For J := 0 to 8 do
begin
For I := 0 to 8 do
begin
if Sudoku.table [I+1,J+1] = 0 then
begin
stringgrid1.cells[J,I] := '';
end
else
begin
stringgrid1.cells[J,I]:= inttostr (Sudoku.table[I+1,J+1]);
label2.caption := Sudoku.niveau;
form2.Caption := Sudoku.nom;
If Sudoku.niveau = 'Facile' then
begin
form2.Color:= clSkyBlue;
label1.font.Color := clBlue ;
end;
If Sudoku.niveau = 'Moyen' then
begin
form2.Color:= cllime;
label1.font.Color := clFuchsia ;
end;
If Sudoku.niveau = 'Difficile' then
begin
form2.Color:= clRed;
label1.font.Color := clYellow ;
end;
end;
end;
end;
end;
Closefile(Fic);
end;
end;
//Permet de quitter la partie.
procedure TForm2.Quitter1Click(Sender: TObject);
begin
if (messagedlg('Voulez-vous vraiment quitter la partie?', mtconfirmation, [mbyes,mbno],0) = mryes) then
begin
if (messagedlg('Voulez-vous enregistrer la partie?', mtconfirmation, [mbyes,mbno],0) = mryes) then
begin
Enregistrerlapartie1.Click;
end;
Application.Terminate;
end;
end;
//Donne la position du curseur.
procedure TForm2.StringGrid1Click(Sender: TObject);
var I,J,k:integer;
valeur :string;
T1,T2,T3:ttime;
begin
Label4.Caption :=IntToStr(StringGrid1.Col +1);
Label23.Caption :=IntToStr(StringGrid1.Row +1);
{//Vérifie si la valeur existe dans la colonne.
for J:=0 to StringGrid1.Row-1 do
begin
if (stringgrid1.cells[stringgrid1.Col,J]=valeur) then
begin
showmessage('La valeur '+valeur+' existe déja dans la colonne. Cliquez sur "Effacer".');
beep;
end;
end;
for J:= StringGrid1.Row+1 to 8 do
begin
if (stringgrid1.cells[stringgrid1.Col,J]=valeur) then
begin
showmessage('La valeur '+valeur+' existe déja dans la colonne. Cliquez sur "Effacer".');
beep;
end;
end;
//Vérifie si la valeur existe dans la ligne.
for I:=0 to StringGrid1.Col-1 do
begin
if (stringgrid1.cells[I,stringgrid1.Row]=valeur) then
begin
showmessage('La valeur '+valeur+' existe déja dans la ligne. Cliquez sur "Effacer".');
beep;
end;
end;
for I:= StringGrid1.Col+1 to 8 do
begin
if (stringgrid1.cells[I,stringgrid1.Row]=valeur)then
begin
showmessage('La valeur '+valeur+' existe déja dans la ligne. Cliquez sur "Effacer".');
beep;
end;
end;}
//Controle gagné lorsque toutes les cases sont remplies.
k:=0;
for I := 0 to 8 do
begin
for J := 0 to 8 do
begin
if stringgrid1.Cells[I,J]<>'' then
begin
k:=k+1;
end;
end;
end;
if k=81 then
begin
showmessage('Bravo!');
T2 := (now);
T3 := T2-T1;
Label5.Caption := timetostr(T3);
end;
end;
{procedure TForm2.Button12Click(Sender: TObject);
var I,J:integer;
valeur :string;
begin
valeur:= stringgrid1.Cells[StringGrid1.Col,StringGrid1.Row];
label24.Caption:=valeur ;
//Vérifie si la valeur existe dans la colonne.
for J:=0 to StringGrid1.Row-1 do
begin
if stringgrid1.cells[stringgrid1.Col,J]=valeur then
begin
showmessage('La valeur '+valeur+' existe déja dans la colonne. Cliquez sur "Effacer".');
beep;
end;
end;
for J:= StringGrid1.Row+1 to 8 do
begin
if stringgrid1.cells[stringgrid1.Col,J]=valeur then
begin
showmessage('La valeur '+valeur+' existe déja dans la colonne. Cliquez sur "Effacer".');
beep;
end;
end;
//Vérifie si la valeur existe dans la ligne.
for I:=0 to StringGrid1.Col-1 do
begin
if stringgrid1.cells[I,stringgrid1.Row]=valeur then
begin
showmessage('La valeur '+valeur+' existe déja dans la ligne. Cliquez sur "Effacer".');
beep;
end;
end;
for I:= StringGrid1.Col+1 to 8 do
begin
if stringgrid1.cells[I,stringgrid1.Row]=valeur then
begin
showmessage('La valeur '+valeur+' existe déja dans la ligne. Cliquez sur "Effacer".');
beep;
end;
end;
end;}
//Permet de remplir le stringgrid à l'aide des boutons
procedure TForm2.Button1Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button1.Caption;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button2.Caption;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button3.Caption;
end;
procedure TForm2.Button4Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button4.Caption;
end;
procedure TForm2.Button5Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button5.Caption;
end;
procedure TForm2.Button6Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button6.Caption;
end;
procedure TForm2.Button7Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button7.Caption;
end;
procedure TForm2.Button8Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button8.Caption;
end;
procedure TForm2.Button9Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= button9.Caption;
end;
//Bouton effacer.
procedure TForm2.Button10Click(Sender: TObject);
begin
stringgrid1.Cells[stringgrid1.Col,stringgrid1.Row]:= '';
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var T1,T2,T3 : ttime;
k:integer;
begin
If (k=50) then
begin
T2 := (now);
T3:= T2-T1;
Label5.Caption := timetostr (T3);
//Timer1.Enabled := false;
end;
end;
Abadianet
Messages postés40Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention19 juin 20061 15 mai 2006 à 20:54
Bonsoir,
Si j'ai bien compris ta demande, elle concerne la génération de grille, alors va voir ce lien qui explique une génération très simple : http://www.bloofi.com/sudoku/sudoku1.html
Par ailleurs, tu as de l'optimisation à faire sur ton code : tous les Stringgrid1.Cells[x,y]:='';