AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sudoku Logik

Ein Thema von hans ditter · begonnen am 20. Dez 2010 · letzter Beitrag vom 7. Mär 2011
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#31

AW: Sudoku Logik

  Alt 9. Jan 2011, 00:32
Also, schau mal bitte in diesen Beitrag.... Da wird definitiv return benutzt (und ja sogar erklärt...).

Kann aber auch sein, dass unser lieber Jason da was durcheinander gebracht hat.
Ich habe das ganze in Pseudo-Code geschrieben.

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#32

AW: Sudoku Logik

  Alt 9. Jan 2011, 14:26
Oh... das hab ich dann wohl etwas missverstanden...

Naja, dann muss ich also retunr doch selber "ausschreiben"...

Danke!
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#33

AW: Sudoku Logik

  Alt 9. Jan 2011, 16:00
Also, ich hab jetzt gerade mal den Pseudocode umgesetzt in meinem Programm. Ob er funktioniert, kann ich noch nicht sagen, da er mir (unverständlicherweise) an einer Stelle sagt, dass " '' ist kein gültiger Integerwert".

Hier mal der Code, mit dem alle Zellen gefüllter werden (sollen):
Delphi-Quellcode:
function SetCell(i: integer) : boolean;
var ValidDecision: TStringList;
  j,X,Y: Integer;
  dig: string;
begin
  if i > (Size * Size) - 1 then
  begin
    Result:=true;
    Exit;
  end;
{.....................................................................}
  ValidDecision:=TStringList.Create;
  for j := 1 to Size do
    ValidDecision.Add(IntToStr(j));
{.....................................................................}
  while ValidDecision.Count > 0 do
  begin
    dig:=ValidDecision[random(ValidDecision.Count)];
    if DigitIsOk(i,StrToInt(dig)) then //hier kommt der Fehler!
    begin
      X:=i mod Size;
      Y:=i div Size;
      Form1.Map.Cells[X,Y]:=dig;
      if SetCell(i + 1) then
      begin
        Result:=True;
        Exit;
      end
      else
      begin
        ValidDecision.Delete(ValidDecision.IndexOf(dig));
        dig:=ValidDecision[random(ValidDecision.Count)];
      end;
    end
    else
      ValidDecision.Delete(ValidDecision.IndexOf(dig));
  end;

  ValidDecision.Free;

  Result:=False;
end;
Und dann noch die Überprüfung der Zahl:
Delphi-Quellcode:
function DigitIsOK(i,Digit: integer):boolean;
var
  j: Integer;
  X,Y: integer;
begin
  X:=i mod Size;
  Y:=i div Size;

  Result:=True;

  if not(Digit = 0) then
  begin
    for j := 0 to Size do
    begin
      if (Digit = StrToInt(Form1.Map.Cells[X,i])) OR
         (Digit = StrToInt(Form1.Map.Cells[i,Y])) then
        begin
          Result:=False;
          Break;
        end;
    end;
  end
  else
    Result:=false;
end;
Der Fehler kommt so zwischen der 4. und 5. Zelle. Ich kann mir das nicht so richitg erklären, weil hier die Sprache davon ist, dass i='' ist. Aber wieso? Hoffentlich könnt ihr mir nochmal aus der Patsche helfen.

LG, hans ditter
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#34

AW: Sudoku Logik

  Alt 9. Jan 2011, 16:16
Scheint so als hättest du statt "j" ein "i" (oder umgekehrt).
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#35

AW: Sudoku Logik

  Alt 9. Jan 2011, 18:07
hm, ich hab's grade mal geändert (hattest übrigens recht, das i sollte ein j sein), hat aber nichts geändert.
Ich glaube eher, dass dig irgendwie '' ist. Aber ich weiß nicht warum.
Könntet ihr dahingehend nochmal durchschauen? Such auch schon seit ein paar Stunden nach dem Fehler...
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#36

AW: Sudoku Logik

  Alt 9. Jan 2011, 19:35
Ich glaub da fehlt ein " -1 ", also

dig:=ValidDecision[random(ValidDecision.Count -1 )]; .
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#37

AW: Sudoku Logik

  Alt 11. Jan 2011, 20:36
Hast du absolut Recht... das fehlte!
Aber leider behebt es immer noch nicht mein Problem. Ich glaube fast, dass es irgendwie einen falschen Zugriff auf eine falsche TStringList gibt.
Oh man, ich komm einfach nicht weiter...
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!
  Mit Zitat antworten Zitat
Notxor

Registriert seit: 28. Okt 2009
41 Beiträge
 
Delphi XE2 Professional
 
#38

AW: Sudoku Logik

  Alt 11. Jan 2011, 21:20
Da fehlt noch (mindestens) ein "-1" (glaub ich jedenfalls), und zwar in der DigitIsOk bei for j := 0 to Size -1 do
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#39

AW: Sudoku Logik

  Alt 12. Jan 2011, 13:04
Wie lösche ich den Post wenn ich gerade Müll geschrieben habe????

Egal, versuch ich was evtl. sinnvolles:

Aus der Hilfe: Random gibt eine Zufallszahl im Bereich 0 <= X < Range zurück.

Also ist die -1 in

dig:=ValidDecision[random(ValidDecision.Count -1 )];
doch eher falsch, da random so Zahlen kleiner ValidDecision.Count-1 zurückliefert und nicht kleiner ValidDecision.Count, wie es eigentlich sein soll.
Somit eher wieder:

dig:=ValidDecision[random(ValidDecision.Count)];
Ralph

Geändert von Jumpy (12. Jan 2011 um 13:24 Uhr)
  Mit Zitat antworten Zitat
hans ditter

Registriert seit: 25. Jun 2010
Ort: Niedersachsen
263 Beiträge
 
Turbo Delphi für Win32
 
#40

AW: Sudoku Logik

  Alt 12. Jan 2011, 13:28
Also, ich hab jetzt beides nochmal überprüft.
@Notxor
Ich hab's geändert. Hat auch schonmal was gebracht. Da hat's dann jedesmal funktioniert. Jedes andere 2te Mal kam aber die Fehlermeldung, dass der Litenindex überschritten wurde.

@Jumpy
Ich glaube löschen geht nicht!
Ich hab das auch bei dir geändert. Hat dann dazu geführt, dass ich ca. 10-15 Mal ein Sudoku erzeugen konnte. Aber auch dann kam die Fehlermeldung mit dem überschrittenem Listenindex.

EDIT!!!!

Hier die Fehlerstelle:
Delphi-Quellcode:
function SetCell(i: integer) : boolean;
var ValidDecision: TStringList;
  j,X,Y: Integer;
  dig: string;
begin
  if i > (Size * Size - 1) then
  begin
    Result:=true;
    Exit;
  end;
{.....................................................................}
  ValidDecision:=TStringList.Create;
  for j := 1 to Size do
    ValidDecision.Add(IntToStr(j));
{.....................................................................}
  while ValidDecision.Count > 0 do
  begin
    dig:=ValidDecision[random(ValidDecision.Count)];
    if DigitIsOk(i,StrToInt(dig)) then
    begin
      X:=i mod Size;
      Y:=i div Size;
      Form1.Map.Cells[X,Y]:=dig;
      if SetCell(i + 1) then //hier kommt der Fehler!!!
      begin
        Result:=True;
        Exit;
     (* end
      else
      begin
        ValidDecision.Delete(ValidDecision.IndexOf(dig));
        dig:=ValidDecision[random(ValidDecision.Count)]; *)

//hier ist der Fehler. Der else-Zweig ist total überflüssig!!
      end;
    end
    else
      ValidDecision.Delete(ValidDecision.IndexOf(dig));
  end;

  ValidDecision.Free;

  Result:=False;
end;
[Edit2]
Jetzt bräuchte ich nur nochmal Hilfe mit den Quadraten. Wie kann ich die möglichst dynamisch abfragen?
Hab grad schonmal ein bisschen mit Formeln rumjonliert.. ist aber nicht wirklich was bei rausgekommen.
Man müsste ja auf jeden Fall wissen, wie groß das Spielfeld ist. Das ist wohl auch nicht das Problem.
Vielmehr ist dann die Frage, wie man die einzelnen (von der Anzahl her ja auch noch variierenden) Quadrate überprüft.
Gibt es da irgendeinen mathematischen Weg oder muss man das mit lauter if-Schleifen abfragen? Wenn 2teres: Wie macht man das "dynamisch"?
RudiRüsselSeineSocketKomponente - SirRufo (--> Chat mit PM)

Delphi Programming is the best one!

Geändert von hans ditter (12. Jan 2011 um 13:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 7   « Erste     234 56     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz