Mittlerweile hab ich den Generator schon wieder etwas mehr verbessert(durchschnittlich ~5 Sekunden für ein Sudoku) aber meine Prozedur, welche die Zahlen aus dem vollständigen Sudoku herausziehen soll, funktioniert nicht wie sie soll...
Ich hab zum Thema Sudoku ein wenig "nachgeforscht", und es hieß, dass mindestens 7 der 9 Ziffern irgendwo in dem fertigen Sudoku vorhanden sein müssen, und es mindestens 17 Ziffern insgesamt sein müssen (ich hab in dem Fall 20 genommen). Ob noch mindestens 8 der 9 Zahlen im Spiel vorhanden sind, soll von der IsValid function überprüft werden. Und counter (der am Ende meiner FillUp prozedur auf 81 gesetzt wird) soll angeben, wieviele Ziffern sich noch im Sudoku-Spiel befinden.
Nun sind mir allerdings 2 Fehler aufgefallen:
1. IsValid scheint nie false zu sein (oder es war bisher nur Zufall), denn bei all meinen Versuchen hat die while-Schleife dadurch aufgehört, dass Counter zu klein ist.
2. Ich habe den Wert von Counter bei mehreren Versuchen überprüft, und mit dem Feld verglichen, und immer das gleiche Ergebnis: Counter ist 19, wobei sich im Feld noch 30-40 Ziffern befinden.
Erbitte Hilfe
Code:
while ((IsValid(SG)=true) and (Counter>=20)) do
begin
Col:=random(9);
Row:=random(9);
temp:=SG.Cells[Col,Row];
SG.Cells[Col,Row]:='';
SG.Repaint;
Counter:=Counter-1;
end;
Code:
function TfrmMain.IsValid(SG:TStringGrid):boolean;
var
Col,Row,n,CountNumber,Count:integer;
begin
result:=true;
Count:=0;
for n:=1 to 9 do
begin
CountNumber:=0;
for Col:=0 to 8 do
begin
for Row:=0 to 8 do
begin
if SG.Cells[Col,Row]=InttoStr(n) then
inc(CountNumber,1);
end;
end;
if CountNumber<>0 then
inc(Count,1);
end;
if Count<=7 then result:=false;
end;