Gut dann werd ich mal konkretisieren. Die Lösen-Funktion des Sudokus funktioniert noch nicht. Beim drücken des Buttons zur laufzeit hängt sich das programm dann auf. Im moment sieht diese Prozedur jetzt so aus:
Delphi-Quellcode:
procedure TForm1.BitBtn3Click(Sender: TObject);
var x,y,bes:integer;
n:string;
function SIndex(x,y:integer):integer; begin result:= (x+(y*9))+1; end;
begin
Start();
for y:=0 to 8 do
for x:=0 to 8 do
begin
bes:=Bestaetigen(StringGrid1.Cells[x,y]);
if bes>0 then
begin
if WertSetzen(SIndex(x,y), bes) then
begin
S[SIndex(x,y)].a:=bes;
S[SIndex(x,y)].b:=false;
end else
begin
MessageBox(self.Handle, 'Falsche Eingabe!','Bitte erneut eingeben', mb_iconerror);
exit;
end;
end else
if bes<0 then
begin
n:='Ungültige Eingabe:' + StringGrid1.Cells[x,y];
MessageBox(self.Handle, pchar(n), 'Fehler', mb_iconerror);
exit;
end;
end;
Loesen();
for y:=0 to 8 do
for x:=0 to 8 do
StringGrid1.Cells[x,y]:=IntToStr(S[SIndex(x,y)].a);
end;
die ausgabe hab ich dann noch für mojidoku umegebastelt, aber auch das funktioniert noch nicht
StringGrid1.Cells[x,y]:=chr(ord(S[SIndex(x,y)].a)+26);
Loesen() ist eine eigenständige Prozedur
Delphi-Quellcode:
procedure Loesen();
var
c:integer;
begin
c:=1;
while c<=81
do
begin
if S[c].b
then
begin
if S[c].a<9
then
begin
inc(S[c].a);
if WertSetzen(c,S[c].a)
then
begin
inc(c);
end else
if S[c].a=9
then
repeat
if S[c].b
then S[c].a:=0;
dec(c);
if S[c].b
then WertFreigeben(c,S[c].a);
until S[c].b
end else
begin
WertFreigeben(c,S[c].a);
repeat
if S[c].b
then S[c].a:=0;
dec(c);
if S[c].b
then WertFreigeben(c,S[c].a);
until S[c].b
end;
end else inc(c);
end;
end;
so ich hoffe ihr könnt mir helfen. ich habe anfangs eine offene schleife vermutet aber keinen anhaltspunkt dafür gefunden.
[edit=mkinzler]Code-Tags durch Delphi-Tags ersetzt Mfg, mkinzler[/edit]