@JJAnke88
Ich habe dir die paar Zeilen geschrieben die dir gefehlt haben. Ich habe mir dann deinen restlichen Source noch schnell angeschaut, und bim beim Überprüfen des Quadrates auf Richtigkeit nicht drausgekomen, und habe mir das mal angeschaut. jedefalls enthielt der HilfArray nicht die von dir benötigten Informationen, deshalb habe ich das auch noch umgeschrieben.(Nebenbei noch den Quelltext an dem ich arbeiten usste umformatiert, ich hoffe du kannst ihn so nicht schlechter lesen

, ne echt, an dem musst du arbeiten, das sieht ja schrecklich aus). So müsste die Funktion(pruf) funktionieren.(Ich habe nur die Funktion für die Quadranten angeschaut und umgeschrieben. Ich denke der Rest funktioniert.)
Zudem wäre eine Fehlermeldung hilfreich, die Sagt an welcher Stelle der Fehler liegt. Allerdings musst du dich nun mit einem neuen Problem herumschlagen: Es werden nicht Alle Felder ausgefüllt wenn ich auf NewGame drücke, die hälfte der Felder bleibt leer.
Delphi-Quellcode:
function CHECK(XKORD,YKORD,AZAHL: BYTE): BOOLEAN;
var qx,qy,temp,i,i2: BYTE;
begin
CHECK := TRUE;
{REIHE}
for I:=1 to 9 do begin
if I <> XKORD then begin
if Sudoku[I,Ykord] = AZAHL then begin
CHECK := FALSE;
Exit;
end;
end;
end;
{SPALTE}
for I:= 1 to 9 do begin
if I <> Ykord then begin
if Sudoku[Xkord,i] = AZAHL then begin
CHECK := FALSE;
EXIT;
end;
end;
end;
{QUADRAT}
qx:=(xKord-1) div 3 +1;
qy:=(yKord-1) div 3 +1;
for i:= 1 to 3 do begin
for i2:= 1 to 3 do begin
if Sudoku[(qx-1)*3+i,(qy-1)*3+i2]=AZahl then begin
check:=false;
exit;
end;
end;
end;
end;
///////////////////////////////////////////////////////////////
procedure tform1.pruf;
var
i,j,x,y,z: BYTE;
rechts,unten,xkord,ykord: BYTE;
hilfe : ARRAY[1..9] OF BYTE;
n,m : BYTE;
begin
// Initalisierung
dzahl := FALSE;
xkord := 1;
ykord := 1;
z:= 0;
//REIHE
for y:= 1 to 9 do begin
for i:=1 to 9 do begin
for j:=1 to 9 do begin
if j<>i then begin
if Zahl[i,y]=Zahl[j,y] then begin
dzahl := true;
doppelt;
exit;
end;
end;
end;
end;
end;
//SPALTE
for x:= 1 to 9 do begin
for i:= 1 to 9 do begin
for j:= 1 to 9 do begin
if i<> j then begin
if Zahl[x,i] = Zahl[x,j] then begin
dzahl := true;
doppelt;
exit;
end;
end;
end;
end;
end;
//Quadrate
for rechts := 1 to 3 do begin
for unten := 1 to 3 do begin
for x:= 1 to 3 do begin
for y:= 1 to 3 do begin
case rechts of
1 : xkord := x;
2 : xkord := x+3;
3 : xkord := x+6;
end;
case unten of
1 : ykord := y;
2 : ykord := y+3;
3 : ykord := y+6;
end;
for m:= 1 to 3 do begin
for n:= 1 to 3 do begin
if (m<>x)OR (n<>y) then begin
if Zahl[xKord,yKord]=Zahl[(rechts-1)*3+m,(unten-1)*3+n] then begin
dzahl := true;
doppelt;
exit;
end;
end;
end;
end;
end;
end;
end;
end;
if dzahl = false then showmessage('Ihre Lösung ist richtig');
end;
Und Bitte halte in Zukunft deinen Quelltext Ordentlicher. Dazu gehört ordentlich Einrücken, und die Begins(Ja, ich weiss, die kann man in bestimmten Fällen weglassen, ist ja ne supersache, aber nicht ÜBERALL WOS NUR GEHT. Das macht den Code sehr schwer Nachvollziehbar wenn überall die end's Fehlen bei for-schleifen.)
Das nächste: hast du den Code eigentlich blind eingetippt? Ohne einmal auf den Monitor zu schauen? Sonst wäre dir sicher aufgefallen, dass du CAPSLOCK eingeschaltet hattes. Der Compiler macht sich daraus zwar keinen Unterschied, aber das menschliche Auge schon. Es ist sehr viel angegnehmer wenn man lowercase(ich meine jetzt hier vor allem Sachen wie end for begin, halt alle reserved words) schreibt.
@Filestricker
Schau dir mal meine
Unit an die ich in diesem Forum gepostet habe(class TSudoku). Damit kannst du im Prinzip Sudokus erzeugen. Vorgehensweise: Du setzt zu Begin per Zufall ein paar werte so, dass Sie die "Sudoku Regeln" nicht verletzen. Dann rufst du die Backtracking Methode auf. Anschliessend Entfernst du zufällig mehrere Felder so, dass es per Heuristik-Algorithmus noch lösbar ist. Dann hast ud ein "gültiges" Sudoku mit nur einer Lösung.
Ich werde allerdings diese Funktion in nächster Zeit noch hinzufügen, sodass man die Lösungsfunktionen nicht "zweckentfremden"muss.