unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls;
type
Tform1 =
class(TForm)
Feld: TStringGrid;
sudoku_create: TButton;
loesen: TButton;
procedure sudoku_createClick(Sender: TObject);
procedure berechnen(x,y,zahl,dlauf:integer);
procedure unterquadrat(zahl,dlauf:Integer);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
zelle:
array[0..8,0..8]
of integer;
Xrow:
set of 0..8;
//
Xcol:
set of 0..8;
//Mengenvariable
zahlen:
set of 1..9;
form1: Tform1;
implementation
{$R *.dfm}
procedure Tform1.sudoku_createClick(Sender: TObject);
var col,row,zahl,dlauf:integer;
begin
//Zellen leeren - auf Anfangszustand setzen
for col:=0
to 8
do
begin
for row:=0
to 8
do
begin
form1.feld.Cells[col,row]:=inttostr(0);
form1.feld.Color:=clwhite;
end;
end;
//### Feld [1,1] bis [9,9] füllen ###
for zahl:=1
to 9
do // jede Zahlgruppe durcharbeiten (9x die 1; 9x die 2 etc.)
begin
for dlauf:=1
to 9
do unterquadrat(zahl,dlauf);
// 9x die jeweilige Zahl eintragen
Xcol:=[];
Xrow:=[];
end;
end;
procedure TForm1.unterquadrat(zahl,dlauf:Integer);
var x,y:integer;
begin
//Unterquadrate 1-9
case dlauf
of
1:
begin
x:=0;
y:=0;
berechnen(x,y,zahl,dlauf);
end;
// [...], x,y variiert
end;
procedure TForm1.berechnen(x,y,zahl,dlauf:integer);
var col,row,hilfe:integer;
begin
// Prüfen ob Zeile oder Spalte schon gesperrt wurde durch eine der Zahlen
//
// Hintergrund:
// Es wird jede Zahl 9x durch die 9 Unterquadrate gerasselt. Dabei muss die jeweilige
// Spalte/Zeile geblockt werden um die Eindeutigkeit des lösbaren Sudokus zu bewahren.
col:=random(3)+ x;
row:=random(3)+ y;
if col
in XCol
then berechnen(x,y,zahl,dlauf)
//wenn Spalte bereits belegt
else
begin
if row
in Xrow
then berechnen(x,y,zahl,dlauf)
//wenn Zeile bereits belegt
else
begin
hilfe:=strtoint(form1.Feld.Cells[col,row]);
if hilfe
in zahlen
then //prüft ob Feld bereits belegt ist
begin
berechnen(x,y,zahl,dlauf);
//Zelle ist belegt
end
else
begin
form1.Feld.Cells[col,row]:=inttostr(zahl);
zelle[col,row]:=zahl;
//Für das abspeichern der Werte
Xrow:= Xrow + [row];
//Mengenvariable wird erhöht
Xcol:= Xcol + [col]
end;
end;
end;
end;
end.