Sudoku Random Generator

  • Hi ich hab mir heute morgen vorgenommen ein eigenen Sudoku Generator zu basteln. Ich bin auch schon ziemlich weit gekommen für meine Verhältnisse, aber nachdem ich die ersten Regeln für den Generator eingebaut hab füllt er nicht mehr das komplette Rätsel aus.

    Ich denke er hängt bei meiner kleinen mini Random UDF aber ich bin noch nicht dahinter gekommen

    da er nach jeden neustarten des Scripts, unterschiedlich mehr oder weniger ausfüllt.

    Wäre cool wenn jemand zeit hatte mal drüber zu sehen und evtl etwas sieht das ich übersehen hab.

    Danke

    ERandom()

    Func ERandom($min,$max,$except)

    $ZZ=StringSplit($except,"")

    Do

    $W=True

    $R=Random($min,$max,1)

    For $i=1 To $ZZ[0]

    If $R=$ZZ[$i] Then

    $W=False

    ExitLoop

    EndIf

    Next

    Until $W= True

    Return $R

    EndFunc

    SudoKU

    #include <StaticConstants.au3>

    #include <Random.au3>

    Dim $Labels[10][10]

    $X=12

    $Y=12

    HotKeySet("{ESC}","e")

    Func e()

    Exit

    EndFunc

    GUICreate("SuDoKu",400,400)

    GUICtrlCreateLabel("",10,10,380,380)

    GUICtrlSetBkColor(-1,0xABABAB)

    GUICtrlCreateLabel("",136,12,2,376)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",388,10,2,380)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",12,388,376,2)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",12,10,376,2)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",10,10,2,380)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",262,12,2,376)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",12,136,376,2)

    GUICtrlSetBkColor(-1,0x000000)

    GUICtrlCreateLabel("",12,262,376,2)

    GUICtrlSetBkColor(-1,0x000000)

    For $a=1 To 9 ;runter

    For $0=1 To 9 ;rechts

    $Labels[$a][$0] = GUICtrlCreateLabel("",$X,$Y,40,40,Bitor($SS_CENTER,$SS_CENTERIMAGE))

    GUICtrlSetFont(-1,15)

    $X+=42

    Next

    $Y+=42

    $X=12

    Next

    GUISetState()

    $T=Random(1,9,1)

    For $0=1 to 9

    GUICtrlSetData($Labels[1][$0],StringRight($T,1))

    If $0=9 Then ExitLoop

    $T&=ERandom(1,9,$T)

    Next

    $T=""

    Sleep(1000)

    For $a=2 To 9


    For $0=1 To 9

    If $a>0 And $a<4 And $0>0 And $0<4 Then

    $KL=1

    ElseIf $a>0 And $a<4 And $0>3 And $0<7 Then

    $KL=2

    ElseIf $a>0 And $a<4 And $0>6 And $0<10 Then

    $KL=3

    ElseIf $a>3 And $a<7 And $0>0 And $0<4 Then

    $KL=4

    ElseIf $a>3 And $a<7 And $0>3 And $0<7 Then

    $KL=5

    ElseIf $a>3 And $a<7 And $0>6 And $0<10 Then

    $KL=6

    ElseIf $a>6 And $a<10 And $0>0 And $0<4 Then

    $KL=7

    ElseIf $a>6 And $a<10 And $0>3 And $0<7 Then

    $KL=8

    ElseIf $a>6 And $a<10 And $0>6 And $0<10 Then

    $KL=9

    EndIf

    GUICtrlSetData($Labels[$a][$0],ERandom(1,9,Read($KL,$0,$a)))

    Next

    Next

    ;While 1

    ;WEnd

    Func Read($K,$V,$H)

    $B=""

    $T=""

    $B&=StringStripWS(Kastchen($K),8)

    $B&=StringStripWS(Ver($V),8)

    $B&=StringStripWS(Hor($H),8)

    Return $B

    EndFunc

    Func Kastchen($K)

    $T=""

    If $K=1 Then

    For $a=1 To 3

    For $0 =1 To 3

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=2 Then

    For $a=1 To 3

    For $0 =3 To 6

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=3 Then

    For $a=1 To 3

    For $0 =6 To 9

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=4 Then

    For $a=3 To 6

    For $0 =1 To 3

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=5 Then

    For $a=3 To 6

    For $0 =3 To 6

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=6 Then

    For $a=3 To 6

    For $0 =6 To 9

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=7 Then

    For $a=6 To 9

    For $0 =1 To 3

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=8 Then

    For $a=6 To 9

    For $0 =3 To 6

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    ElseIf $K=9 Then

    For $a=6 To 9

    For $0 =6 To 9

    $T&=GUICtrlRead($Labels[$a][$0])

    Next

    Next

    EndIf

    Return $T

    EndFunc

    Func Ver($V)

    $T=""

    For $a=1 To 9

    $T&=GUICtrlRead($Labels[$a][$V])

    Next

    Return $T

    EndFunc

    Func Hor($H)

    $T=""

    For $0=1 To 9

    $T&=GUICtrlRead($Labels[$H][$0])

    Next

    Return $T

    EndFunc

  • Wäre cool wenn jemand zeit hatte mal drüber zu sehen

    Könntest Du dir bitte die Mühe machen, deinen Code formatiert anzugeben, z.B. :

    Gruß Musashi

    86598-musashi-c64-png

    "Am Anfang wurde das Universum erschaffen. Das machte viele Leute sehr wütend und wurde allenthalben als Schritt in die falsche Richtung angesehen."

  • Naja wie wärs mit Debuging? Hab zwar keine Lust genauer zu prüfen was schief läuft, aber mit einfachen consolewrites kann man das Problem zum einen wie von dir vermutet auf die Funktion eRandom einschränken und zum anderen auf die dort enthaltene if Bedingung, welche verhindert, dass die umschließende do...until Schleife verlassen wird. Hier mal ein Script, das nach 200 Schleifendurchläufen abbricht und dir ein paar Details in der Konsole ausgibt:

    Debug Code

    Einmal editiert, zuletzt von misterspeed (18. November 2017 um 14:50)

  • Na klar, war das erste mal für mich in ein solches Forum zu schreiben.

    Also auf ein neues...


    Script-Ablauf:

    • GUI-Erstellung mit Label und Farblichen Hintergrund (bis GUISetState() )
    • Erste Horizontale Zeile Zufällig ausfüllen mithilfe von ERandom() (bis $T="")
    • Alle anderen Zahlen ermitteln unter Einhaltung bestimmter Regeln, ich lasse dabei alle Zahlen die bereits Stehen, heißt die Zahlen die Horizontal, Vertikal, oder sich im aktuellen Kästchen zum aktuellen Label das derzeit berechnet wird auslesen, lasse sie in einer Variable als String Speichern und gebe sie an die UDF(ERandom) weiter...

      ERandom($min,$max,$except)

    ...soll einen wert zwischen $min und $max finden die aber nicht in $except enthalten sind.

  • Nachtrag... hab das mal erweitert oben. Der Fehler tritt scheinbar immer dann auf, wenn die Variable $except alle Zahlen von 1 bis 9 enthält. Macht ja auch Sinn, denn eine der 9 Zahlen muss definitiv eingetragen werden, wenn alle Zahlen ignoriert werden und nicht erlaubt sind wird er nie eine gültige Zahl finden.

  • Nachtrag... hab das mal erweitert oben. Der Fehler tritt scheinbar immer dann auf, wenn die Variable $except alle Zahlen von 1 bis 9 enthält. Macht ja auch Sinn, denn eine der 9 Zahlen muss definitiv eingetragen werden, wenn alle Zahlen ignoriert werden und nicht erlaubt sind wird er nie eine gültige Zahl finden.

    Aber ich lass doch jedes mal wenn er in die read() funktion kommt die Variable löschen ?

  • Na schau dir halt die Werte in der Scite Konsole an. Du kannst durch die Ausgaben bei jedem Funktionsaufruf sehen welchen Wert die verwendeten Variablen haben. In deinem Fall ist wie gesagt die Variable $except dafür verantwortlich, dass deine Schleife niemals verlassen wird. der Fehler entsteht also irgendwo anderst, dort wo du den "Except-String" zusammenbaust und an eRandom übergibst. Der String darf jedenfalls maximal 8 verschiedene Zahlen und niemals alle 9 enthalten. Wenn du die Ausgabe anschaust wird dir außerdem auffallen, dass der String teilweise Zahlen doppelt enthält. Warum und wieso das so ist musst du nun rausfinden.