Ich habe ein Generator für 9x9 Sudokus programmiert.
Die Zahlen werden in eine 9x9 StringGrid geschrieben.
Wie kann ich einzelne Trennlinien dicker machen? Also so, dass die Stringgrid in 3x3 Quadrate unterteilt wird die wiederrum aus 3x3 Zahlenfelder bestehen.
Ich weiß, dass man mit GridLineWidth die Zeilenstärke ändern kann, aber das bringt mich nicht weiter.
Dann wäre es auch noch gut wenn man die StringGrid abkopieren könnte, nachdem sie mit dem Sudoku gefüllt wurde.
Gibt es dafür einen Wert den man auf True oder so setzten muss?
Gut wäre wenn es mit strg+c gehen würde, besser wenn zusätzlich auch mit einem rechtsklick-Menü.
Momentan kann man nicht mal mehr markieren, da ich goEditing auf True habe.
Programm mit Quellcode:
http://rapidshare.com/files/12909071...uGenerator.rar
Ich hoffe ich hab mich verständlich ausgedrückt und mir kann jemand helfen
Delphi-Quellcode:
procedure Sudokucreate;
var i,j,k,IFehler:integer;
number,col,col2,row,posi,rnd,c:integer;
SmZ:string; //mögliche Reihen
Bgeloest:boolean;
begin
randomize;
Bgeloest := false; // Sudoku wurde noch nicht erstellt
IFehler := 0; // bisher kein Fehler aufgetaucht
while Bgeloest = false do // solang Sudoku fehlerfrei erstellt wurde
begin
for i := 0 to n-1 do // füllt alle Felder der StringGrid mit 'N'
begin
for j := 0 to n-1 do
Form1.StringGrid1.Cells[i,j]:='N';
end;
for number := 1 to n do // 1-9 wird
begin // in eine zufällige Reihe der ersten Spalte geschrieben,
for col := 0 to n-1 do // dann in die zweite Spalte usw.
begin
SmZ :='';
for k := 0 to n-1 do
SmZ:=SmZ+ inttostr(k); // mögliche Zufallsreihe ist ohne Überprüfung immer die 1.-9.
for row := 0 to n-1 do // es werden alle Zellen der aktuellen Spalte überprüft,
begin // ob schon eine Zahl reingeschrieben wurde
if Form1.StringGrid1.Cells[col,row]<>'N' then
begin
posi := pos(inttostr(row),SmZ); // wenn ja wird die Reihe aus den möglichen
delete(SmZ,posi,1); // Reihen gelöscht
end; {if-bedingung}
end;{row-schleife}
if col > 0 then // es wird überprüft ob in der Reihe die Zahl schon vorhanden ist
begin // wenn ja, wird die Reihe aus den mögliche Reihen gelöscht
for col2 := 0 to col-1 do
begin
for row := 0 to n-1 do
begin
if Form1.StringGrid1.Cells[col2,row] = inttostr(number) then
begin
posi := pos(inttostr(row),SmZ);
delete(SmZ,posi,1);
end {if Zelleninhalt=number}
end;{row-schleife}
end;{col2-schleife}
end;{if col>0}
case col of
0..2: c := 0;
3..5: c := 3;
6..8: c := 6;
end;
for col2 := c to c+2 do // es wird überprüft ob im Quadrat die Zahl schon vorhanden ist
begin // wenn ja, wird die Reihe aus den mögliche Reihen gelöscht
for row := 0 to n-1 do
begin
if Form1.StringGrid1.Cells[col2,row] = inttostr(number) then
begin
case row of
0..2: begin
for i := 0 to 2 do
begin
posi := pos(inttostr(i),SmZ);
delete(SmZ,posi,1);
end;
end;
3..5: begin
for i := 3 to 5 do
begin
posi := pos(inttostr(i),SmZ);
delete(SmZ,posi,1);
end;
end;
6..8: begin
for i := 6 to 8 do
begin
posi := pos(inttostr(i),SmZ);
delete(SmZ,posi,1);
end;
end;
end;
end;{if gleiche nummer in stringgridzelle}
end; {row-schleife}
end; {col2-schleife}
If Length(SmZ) > 0 then // wenn in einer Spalte keine Reihe mehr möglich ist,
begin // tritt ein Fehler auf und es wird nochmal versucht ein Sudoku zu erstellen
rnd := random(Length(SmZ))+1; // Wenn kein Fehler auftritt wird die Zahl in die aktuelle Spalte in
row := strtoint(SmZ[rnd]); // die zufällige Reihe geschrieben
Form1.StringGrid1.Cells[col,row] := inttostr(number)
end
else
begin
IFehler := IFehler+1;
end;
end; {col-schleife}
end; {number-schleife}
If IFehler = 0 then
Bgeloest := true
else
IFehler := 0;
end; {Bgeloest}
end;