Thema: Sudoku

Einzelnen Beitrag anzeigen

Christian V.

Registriert seit: 15. Apr 2007
5 Beiträge
 
Delphi 7 Enterprise
 
#38

Re: Sudoku

  Alt 15. Apr 2007, 21:26
@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.
  Mit Zitat antworten Zitat