Sudoku-/Schleifen-Problem

  • also ich bin ja grad dabei Einen Sudoku-generator zu bauen aber der hängt sich immer an irgendeiner stelle auf:

    Spoiler anzeigen
    [autoit]

    Global $Zahlen[10][10]
    Global $Err = False
    Global $Return

    [/autoit] [autoit][/autoit] [autoit]

    Dim $Ohne[28]
    Dim $OhneQuadrat[10]
    Dim $OhneZeile[10]
    Dim $OhneSpalte[10]
    Dim $show
    ;______________________________________________________________________

    [/autoit] [autoit][/autoit] [autoit]

    For $Zeile = 1 To 9
    For $Spalte = 1 To 9

    $OhneQuadrat = OhneQuadrat($Zeile, $Spalte)
    $OhneZeile = OhneZeile($Zeile)
    $OhneSpalte = OhneSpalte($Spalte)

    $Ohne = zusammen($OhneZeile, $OhneSpalte, $OhneQuadrat)

    $Zahl = Generate($Ohne)
    If $Err = True Then
    $Zeile = 0
    $Spalte = 0
    Global $Zahlen[10][10]
    Else
    $Zahlen[$Zeile][$Spalte] = $Zahl
    For $ToolTip = 1 To 27
    $show = $show & $Ohne[$ToolTip]
    Next
    ToolTip("Zeile: " & $Zeile & @CRLF & "Spalte: " & $Spalte & @CRLF & @CRLF & $show)
    $Zahlen[$Zeile][$Spalte] = $Zahl
    $show = ""
    EndIf
    Dim $Ohne[28]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $FOW = FileOpen(@ScriptDir & "\Ausgabe.txt", 1)
    For $Zeile = 1 To 9
    For $Spalte = 1 To 9

    FileWrite($FOW, $Zahlen[$Zeile][$Spalte])

    If $Spalte = 9 Then
    FileWrite($FOW, @LF)
    EndIf

    Next
    Next
    FileClose($FOW)

    [/autoit] [autoit][/autoit] [autoit]

    Func Generate($Array)
    $OK = False
    Global $Durchlaufen = 0
    $To = UBound($Array)-1

    Do
    $Random = Random(1, 9, 1)
    $OK = True
    For $Check = 1 To $To
    If $Random = $Array[$Check] Then
    $OK = False
    EndIf
    Next
    $Durchlaufen = $Durchlaufen+1
    If $Durchlaufen = 100 Then
    ExitLoop
    EndIf
    Until $OK = True
    If $Durchlaufen = 100 Then
    Global $Err = True
    Else
    Return $Random
    EndIf
    EndFunc ;==> Generate

    [/autoit] [autoit][/autoit] [autoit]

    Func OhneQuadrat($WoZeile, $WoSpalte)

    Switch $WoZeile

    Case 1 To 3

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(1, 3, 1, 3)
    Case 4 To 6
    $Return = GetQu(1, 3, 4, 6)
    Case 7 To 9
    $Return = GetQu(1, 3, 7, 9)
    EndSwitch

    Case 4 To 6

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(4, 6, 1, 3)
    Case 4 To 6
    $Return = GetQu(4, 6, 4, 6)
    Case 7 To 9
    $Return = GetQu(4, 6, 7, 9)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Case 7 To 9

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(7, 9, 1, 3)
    Case 4 To 6
    $Return = GetQu(7, 9, 4, 6)
    Case 7 To 9
    $Return = GetQu(7, 9, 7, 9)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    Return $Return
    EndFunc ;==> OhneQuadrat

    [/autoit] [autoit][/autoit] [autoit]

    Func OhneZeile($x)
    Local $Return[10]
    For $y = 1 To 9
    $Return[$y] = $Zahlen[$x][$y]
    Next
    Return $Return
    EndFunc ;==> OhneZeile

    [/autoit] [autoit][/autoit] [autoit]

    Func OhneSpalte($y)
    Local $Return[10]
    For $x = 1 To 9
    $Return[$x] = $Zahlen[$x][$y]
    Next
    Return $Return
    EndFunc ;==> OhneSpalte

    [/autoit] [autoit][/autoit] [autoit]

    Func GetQu($Von_x, $Zu_x, $Von_y, $Zu_y)

    Local $Nummer = 1
    Local $Ohne[10]

    For $FillZeile = $Von_x To $Zu_x
    For $FillSpalte = $Von_y To $Zu_y
    $Ohne[$Nummer] = $Zahlen[$FillZeile][$FillSpalte]
    $Nummer = $Nummer+1
    Next
    Next
    Return $Ohne
    EndFunc ;==> qfill

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Zusammen($x, $y, $q)
    Local $Return[28]
    Local $Nummer = 1
    For $zusammen = 1 To 9
    $Return[$zusammen] = $x[$Nummer]
    $Nummer = $Nummer+1
    Next
    $Nummer = 1
    For $zusammen = 10 To 18
    $Return[$zusammen] = $y[$Nummer]
    $Nummer = $Nummer+1
    Next
    $Nummer = 1
    For $zusammen = 19 To 27
    $Return[$zusammen] = $q[$Nummer]
    $Nummer = $Nummer+1
    Next
    Return $Return
    EndFunc ;==> Zusammen

    [/autoit]


    ich brauche unbedingt hilfe ich hap echt keinen plan wo der sich aufhängt.

    ps: denn tooltip hap ich eingebaut um zu sehen wie weit er schon iss.


    Edit peethebee: Sinnvollen Threadtitel vergeben - deiner wäre eingentlich ein Löschgrund :rolleyes:

    Wo wir gerade dabei sind: Das Wort heißt "habe" (kurz allenfalls "hab"), nicht "hap"... :D

  • Hi,
    Wenn ich deine Frage aus der Shoutbox richtig verstehe, ist die Situation folgende:

    [autoit]

    Dim Null[9], Eins[9], Zwei[9]

    [/autoit]

    Was spricht gegen folgende Lösung:

    [autoit]

    Dim Alle[3, 9]

    [/autoit]

    ?
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    • Offizieller Beitrag

    Er bleibt wohl im If-Teil hängen nachdem $Err auf True gesetzt ist kommt er da nicht mehr raus.

    Tipp: Man sollte niemals von Hand Variablen verändern die von einer For ... Next Schleife als Zähler benutzt wird benutzt wird und schon garnicht auf Werte die die Variable nie annehmen kann! Dafür nimmt man in der Regel While ... WEnd oder Do ... Until - Schleifen. ;)

  • eigentlich nix aber ich haps jetzt so gemacht dann lass ich das jetzt auch so.
    das iss aber keine antwort auf meine gestellte frage.

  • also ich hap mal die for schleifen durch while schleifen ersetz.
    er bleibt jetzt auch nirgendwo mer hängen.
    aber er generiert jetzt komischeweise nur noch die ersten 9 zahlen. ?(

    also das iss das Skript dazu:

    Spoiler anzeigen
    [autoit]

    Global $Zahlen[10][10]
    Global $Err = False
    Global $Return

    [/autoit] [autoit][/autoit] [autoit]

    Dim $Ohne[28]
    Dim $OhneQuadrat[10]
    Dim $OhneZeile[10]
    Dim $OhneSpalte[10]
    Dim $Show
    Dim $Write
    Dim $Zeile = 0
    Dim $Spalte = 0
    ;__________________________________________________________

    [/autoit] [autoit][/autoit] [autoit]

    While $Zeile < 9
    $Zeile = $Zeile+1
    While $Spalte < 9
    $Spalte = $Spalte+1

    $OhneQuadrat = OhneQuadrat($Zeile, $Spalte)
    $OhneZeile = OhneZeile($Zeile)
    $OhneSpalte = OhneSpalte($Spalte)

    $Ohne = zusammen($OhneZeile, $OhneSpalte, $OhneQuadrat)

    $Zahl = Generate($Ohne)
    If $Err = True Then
    $Zeile = 0
    $Spalte = 0
    Global $Zahlen[10][10]
    Global $Err = False
    Else
    $Zahlen[$Zeile][$Spalte] = $Zahl
    For $ToolTip = 1 To 27
    $Show = $Show & $Ohne[$ToolTip]
    Next
    ToolTip("Zeile: " & $Zeile & @CRLF & "Spalte: " & $Spalte & @CRLF & @CRLF & $show)
    $Zahlen[$Zeile][$Spalte] = $Zahl
    $show = ""
    EndIf
    Dim $Ohne[28]
    WEnd
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    For $Zeile = 1 To 9
    For $Spalte = 1 To 9
    $Write = $Write & $Zahlen[$Zeile][$Spalte]
    Next
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $FOW = FileOpen(@ScriptDir & "\Ausgabe.txt", 1)
    FileWrite($FOW, $Write)
    FileClose($FOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Generate($Array)
    $OK = False
    Global $Durchlaufen = 0
    $To = UBound($Array)-1

    Do
    $Random = Random(1, 9, 1)
    $OK = True
    For $Check = 1 To $To
    If $Random = $Array[$Check] Then
    $OK = False
    EndIf
    Next
    $Durchlaufen = $Durchlaufen+1
    If $Durchlaufen = 100 Then
    ExitLoop
    EndIf
    Until $OK = True
    If $Durchlaufen = 100 Then
    Global $Err = True
    Else
    Return $Random
    EndIf
    EndFunc ;==> Generate

    [/autoit] [autoit][/autoit] [autoit]

    Func OhneQuadrat($WoZeile, $WoSpalte)

    Switch $WoZeile

    Case 1 To 3

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(1, 3, 1, 3)
    Case 4 To 6
    $Return = GetQu(1, 3, 4, 6)
    Case 7 To 9
    $Return = GetQu(1, 3, 7, 9)
    EndSwitch

    Case 4 To 6

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(4, 6, 1, 3)
    Case 4 To 6
    $Return = GetQu(4, 6, 4, 6)
    Case 7 To 9
    $Return = GetQu(4, 6, 7, 9)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    Case 7 To 9

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(7, 9, 1, 3)
    Case 4 To 6
    $Return = GetQu(7, 9, 4, 6)
    Case 7 To 9
    $Return = GetQu(7, 9, 7, 9)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    Return $Return
    EndFunc ;==> OhneQuadrat

    [/autoit] [autoit][/autoit] [autoit]

    Func OhneZeile($x)
    Local $Return[10]
    For $y = 1 To 9
    $Return[$y] = $Zahlen[$x][$y]
    Next
    Return $Return
    EndFunc ;==> OhneZeile

    [/autoit] [autoit][/autoit] [autoit]

    Func OhneSpalte($y)
    Local $Return[10]
    For $x = 1 To 9
    $Return[$x] = $Zahlen[$x][$y]
    Next
    Return $Return
    EndFunc ;==> OhneSpalte

    [/autoit] [autoit][/autoit] [autoit]

    Func GetQu($Von_x, $Zu_x, $Von_y, $Zu_y)

    Local $Nummer = 1
    Local $Ohne[10]

    For $FillZeile = $Von_x To $Zu_x
    For $FillSpalte = $Von_y To $Zu_y
    $Ohne[$Nummer] = $Zahlen[$FillZeile][$FillSpalte]
    $Nummer = $Nummer+1
    Next
    Next
    Return $Ohne
    EndFunc ;==> qfill

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Zusammen($x, $y, $q)
    Local $Return[28]
    Local $Nummer = 1
    For $zusammen = 1 To 9
    $Return[$zusammen] = $x[$Nummer]
    $Nummer = $Nummer+1
    Next
    $Nummer = 1
    For $zusammen = 10 To 18
    $Return[$zusammen] = $y[$Nummer]
    $Nummer = $Nummer+1
    Next
    $Nummer = 1
    For $zusammen = 19 To 27
    $Return[$zusammen] = $q[$Nummer]
    $Nummer = $Nummer+1
    Next
    Return $Return
    EndFunc ;==> Zusammen

    [/autoit]
    • Offizieller Beitrag

    Ich habe mal die While-Schleifen korrigiert und ToolTip durch ConsoleWrite ersetzt:

    Spoiler anzeigen
    [autoit]

    Global $Zahlen[10][10]
    Global $Err = False
    Global $Return

    Dim $Ohne[28]
    Dim $OhneQuadrat[10]
    Dim $OhneZeile[10]
    Dim $OhneSpalte[10]
    Dim $Show
    Dim $Write
    Dim $Zeile = 0
    Dim $Spalte = 0
    ;__________________________________________________________

    $Zeile = 1
    While $Zeile < 10
    $Spalte = 1
    While $Spalte < 10

    $OhneQuadrat = OhneQuadrat($Zeile, $Spalte)
    $OhneZeile = OhneZeile($Zeile)
    $OhneSpalte = OhneSpalte($Spalte)

    $Ohne = zusammen($OhneZeile, $OhneSpalte, $OhneQuadrat)

    $Zahl = Generate($Ohne)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Err = ' & $Err & @crlf) ;### Debug Console
    If $Err = True Then
    $Zeile = 1
    $Spalte = 1
    Global $Zahlen[10][10]
    $Err = False
    Else
    $Zahlen[$Zeile][$Spalte] = $Zahl
    For $ToolTip = 1 To 27
    $show = $show & $Ohne[$ToolTip]
    Next
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Zeile = ' & $Zeile & ' $Spalte = ' & $Spalte & ' > ' & $show & @crlf) ;### Debug Console
    ;~ ToolTip("Zeile: " & $Zeile & @CRLF & "Spalte: " & $Spalte & @CRLF & @CRLF & $show)
    $Zahlen[$Zeile][$Spalte] = $Zahl
    $show = ""
    EndIf
    Dim $Ohne[28]
    $Spalte += 1
    WEnd
    $Zeile += 1
    WEnd

    For $Zeile = 1 To 9
    For $Spalte = 1 To 9
    $Write = $Write & $Zahlen[$Zeile][$Spalte]
    Next
    Next

    $FOW = FileOpen(@ScriptDir & "\Ausgabe.txt", 1)
    FileWrite($FOW, $Write)
    FileClose($FOW)


    Func Generate($Array)
    $OK = False
    Global $Durchlaufen = 0
    $To = UBound($Array)-1

    Do
    $Random = Random(1, 9, 1)
    $OK = True
    For $Check = 1 To $To
    If $Random = $Array[$Check] Then
    $OK = False
    EndIf
    Next
    $Durchlaufen = $Durchlaufen+1
    If $Durchlaufen = 100 Then
    ExitLoop
    EndIf
    Until $OK = True
    If $Durchlaufen = 100 Then
    Global $Err = True
    Else
    Return $Random
    EndIf
    EndFunc ;==> Generate

    Func OhneQuadrat($WoZeile, $WoSpalte)

    Switch $WoZeile

    Case 1 To 3

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(1, 3, 1, 3)
    Case 4 To 6
    $Return = GetQu(1, 3, 4, 6)
    Case 7 To 9
    $Return = GetQu(1, 3, 7, 9)
    EndSwitch

    Case 4 To 6

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(4, 6, 1, 3)
    Case 4 To 6
    $Return = GetQu(4, 6, 4, 6)
    Case 7 To 9
    $Return = GetQu(4, 6, 7, 9)
    EndSwitch

    Case 7 To 9

    Switch $WoSpalte

    Case 1 To 3
    $Return = GetQu(7, 9, 1, 3)
    Case 4 To 6
    $Return = GetQu(7, 9, 4, 6)
    Case 7 To 9
    $Return = GetQu(7, 9, 7, 9)
    EndSwitch

    EndSwitch
    Return $Return
    EndFunc ;==> OhneQuadrat

    Func OhneZeile($x)
    Local $Return[10]
    For $y = 1 To 9
    $Return[$y] = $Zahlen[$x][$y]
    Next
    Return $Return
    EndFunc ;==> OhneZeile

    Func OhneSpalte($y)
    Local $Return[10]
    For $x = 1 To 9
    $Return[$x] = $Zahlen[$x][$y]
    Next
    Return $Return
    EndFunc ;==> OhneSpalte

    Func GetQu($Von_x, $Zu_x, $Von_y, $Zu_y)

    Local $Nummer = 1
    Local $Ohne[10]

    For $FillZeile = $Von_x To $Zu_x
    For $FillSpalte = $Von_y To $Zu_y
    $Ohne[$Nummer] = $Zahlen[$FillZeile][$FillSpalte]
    $Nummer = $Nummer+1
    Next
    Next
    Return $Ohne
    EndFunc ;==> qfill



    Func Zusammen($x, $y, $q)
    Local $Return[28]
    Local $Nummer = 1
    For $zusammen = 1 To 9
    $Return[$zusammen] = $x[$Nummer]
    $Nummer = $Nummer+1
    Next
    $Nummer = 1
    For $zusammen = 10 To 18
    $Return[$zusammen] = $y[$Nummer]
    $Nummer = $Nummer+1
    Next
    $Nummer = 1
    For $zusammen = 19 To 27
    $Return[$zusammen] = $q[$Nummer]
    $Nummer = $Nummer+1
    Next
    Return $Return
    EndFunc ;==> Zusammen

    [/autoit]