Sudoku-Löser

  • Ich hab mir mal die Zeit genommen (ok, es waren nur 2h :D ), einen Sudoku-Löser zu schreiben.
    N paar Schönheitsfehler sind drin und es klappt nicht ganz bei allen Sudokus, aber sonst läuft eigentlich alles prima :) .

    Spoiler anzeigen
    [autoit]

    Global $hinputs[9][9]
    GUICreate("Sudoku", 180, 200);GUI erstellen
    For $guizaehleins = 0 To 8
    For $guizaehlzwei = 0 To 8
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20, $guizaehleins * 20, 20,20); 9x9 Inputs erstellen
    Next
    Next
    $hloesenbutton = GUICtrlCreateButton("Lösen!",0,180,180, 20); Lösen-Button erstellen
    GUISetState()

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

    While 1
    sleep(20)
    $MSG = GUIGetMsg()
    If $MSG = -3 Then
    Exit;Beim Drücken auf das Kreuz: Schließen
    ElseIf $MSG = $hLoesenbutton Then
    _Loesen();Beim Drücken auf den Lösen-Button: Lösen
    EndIf
    WEnd

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

    Func _Loesen()
    For $einundachzigmal = 0 To 81;Nach 81 Durchläufen muss das Sudoku fertig sein, wenn es lösbar ist
    For $loesy = 0 To 8;hier geht das Script alle 9 y-Werte durch, die das Feld haben kann, in das eine Zahl geschrieben werden soll
    For $Loesx = 0 To 8;hier geht das Script alle 9 x-Werte durch, die das Feld haben kann, in das eine Zahl geschrieben werden soll
    $inputstate = GUICtrlRead($hinputs[$loesx][$loesy]);Wenn das Feld bereits voll ist, soll nichts gemacht werden
    If $inputstate = "" Then;Wenn das Feld bereits voll ist, soll nichts gemacht werden
    Local $moeglich[9] = [1,1,1,1,1,1,1,1,1];Hier wird gespeichert, ob die 1, die 2 ... in dieses Feld geschrieben werden könnte
    For $einsneun = 1 To 9;Hier geht das Script die Zahlen von 1 - 9 durch und prüft, ob diese in das Feld geschrieben werden können
    For $andery = 0 To 8;Dazu werden alle Felder der gleichen Spalte...
    $otherinputstate = GUICtrlRead($hinputs[$loesx][$andery])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    For $anderx = 0 To 8;, die der gleichen Zeile...
    $otherinputstate = GUICtrlRead($hinputs[$anderx][$loesy])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    For $andery2 = 0 To 2; und die des gleichen 3x3-Feldes überprüft, ob sie gleich der durch $einsneun festgelegten Zahl sind, wenn ja, kann diese Zahl nicht in das Feld geschrieben werden.
    For $anderx2 = 0 To 2
    $otherinputstate = GUICtrlRead($hinputs[Floor($loesx / 3) * 3 + $anderx2][Floor($loesy / 3) * 3 + $andery2])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    Next
    Next
    If $moeglich[0] = 1 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],1);Wenn
    If $moeglich[0] = 0 And $moeglich[1] = 1 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],2);nur
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 1 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],3);eine
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 1 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],4);Zahl
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 1 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],5);möglich
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 1 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],6);ist,
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 1 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],7);muss
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 1 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],8);diese
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 1 Then GUICtrlSetData($hinputs[$loesx][$loesy],9);die richtige sein und wird in das Feld geschrieben.
    EndIf
    Next
    Next
    Next
    EndFunc

    [/autoit]


    Hab mich bemüht, das Ganze schön zu "bekommentieren" und die Variablennamen verständlich zu benennen, sry, falls mir da ein Fehler unterlaufen sein sollte.
    :D Ich hab übrigens nicht überprüft, ob das der einzige Sudoku-Löser ist, falls nein, hab ich aber nicht abgeguckt :whistling: .

  • Das Problem hab ich gleich behoben...
    EDIT: Faddisch, ich wollt, dass die Variablen Sinn ergeben, da hab ich wohl vergessen, diese auszutauschen.

  • Also ich kanns grad nicht testen, weil ich grad kein Sudoku zur Hand hab, aber ich hätte nicht gedacht, dass das so einfach ist, ein Bekannter hat seine Informatik Facharbeit über Sudoku geschrieben und saß da ewig dran.

    Aber der Code sieht gut aus, schön eingerückt, wie wir das haben wollen ;) Die variablen sind auch schlüssig, finde ich jedenfalls.

    Ich werds mal testen wenn ich ein ungelöstes Sudoku finde ;)

    Edit: Also hier klappt schonmal eins ;) http://sudoku.zeit.de/sudoku/kunden/die_zeit/


    DFPWare

  • Mein Sudoku-Löser prüft einfach in jedem Feld, ob die Zahlen 1-9 möglich wären, indem er sie mit denen in der gleichen Reihe, Spalte und in jedem 3x3-Feld prüft. Ist einmal nur eine möglich, schreibt er die rein, weshalb in anderen Feldern auch nur noch eine möglich ist.

  • huhu

    Ich habe mal etwas mit if gespielt für die Optik...
    Aber irgendwie stimmt was in der Lösung nicht... musste nochmal nachgucken...
    hab gerade nicht so viel Zeit..

    Spoiler anzeigen
    [autoit]

    Global $hinputs[9][9]
    GUICreate("Sudoku", 190, 212);GUI erstellen

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

    ; ab hier geändernt .... Chris
    GUISetBkColor ( 0x555555 )
    For $guizaehleins = 0 To 8
    For $guizaehlzwei = 0 To 8
    If $guizaehlzwei > 5 Or $guizaehleins > 5 Then
    If $guizaehleins > 5 And $guizaehlzwei > 5 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 +5 +5 , $guizaehleins * 20 +5 +5, 20,20)
    ElseIf $guizaehleins > 2 And $guizaehlzwei > 2 Then
    If $guizaehleins > 2 And $guizaehlzwei > 5 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 + 5 +5, $guizaehleins * 20 +5, 20,20)
    EndIf
    If $guizaehleins > 5 And $guizaehlzwei > 2 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 + 5 , $guizaehleins * 20 +5+5, 20,20)
    EndIf
    EndIf
    If $guizaehleins < 3 And $guizaehlzwei > 4 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 +5+5, $guizaehleins * 20, 20,20)
    EndIf
    If $guizaehleins > 4 And $guizaehlzwei < 3 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20, $guizaehleins * 20+5+5, 20,20)
    EndIf
    Elseif $guizaehlzwei > 2 Then
    If $guizaehleins > 2 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 + 5, $guizaehleins * 20 + 5, 20,20)
    Else
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 + 5, $guizaehleins * 20, 20,20)
    EndIf
    Else
    If $guizaehleins > 2 Then
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 , $guizaehleins * 20 + 5, 20,20)
    Else
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20, $guizaehleins * 20, 20,20)
    EndIf
    EndIf
    Next
    Next
    $hloesenbutton = GUICtrlCreateButton("Lösen!",0,192,190, 20); Lösen-Button erstellen
    ; bis hier geändernt .... Chris

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

    GUISetState()
    While 1
    sleep(20)
    $MSG = GUIGetMsg()
    If $MSG = -3 Then
    Exit;Beim Drücken auf das Kreuz: Schließen
    ElseIf $MSG = $hLoesenbutton Then
    _Loesen();Beim Drücken auf den Lösen-Button: Lösen
    EndIf
    WEnd

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

    Func _Loesen()
    For $einundachzigmal = 0 To 81;Nach 81 Durchläufen muss das Sudoku fertig sein, wenn es lösbar ist
    For $loesy = 0 To 8;hier geht das Script alle 9 y-Werte durch, die das Feld haben kann, in das eine Zahl geschrieben werden soll
    For $Loesx = 0 To 8;hier geht das Script alle 9 x-Werte durch, die das Feld haben kann, in das eine Zahl geschrieben werden soll
    $inputstate = GUICtrlRead($hinputs[$loesx][$loesy]);Wenn das Feld bereits voll ist, soll nichts gemacht werden
    If $inputstate = "" Then;Wenn das Feld bereits voll ist, soll nichts gemacht werden
    Local $moeglich[9] = [1,1,1,1,1,1,1,1,1];Hier wird gespeichert, ob die 1, die 2 ... in dieses Feld geschrieben werden könnte
    For $einsneun = 1 To 9;Hier geht das Script die Zahlen von 1 - 9 durch und prüft, ob diese in das Feld geschrieben werden können
    For $andery = 0 To 8;Dazu werden alle Felder der gleichen Spalte...
    $otherinputstate = GUICtrlRead($hinputs[$loesx][$andery])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    For $anderx = 0 To 8;, die der gleichen Zeile...
    $otherinputstate = GUICtrlRead($hinputs[$anderx][$loesy])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    For $andery2 = 0 To 2; und die des gleichen 3x3-Feldes überprüft, ob sie gleich der durch $einsneun festgelegten Zahl sind, wenn ja, kann diese Zahl nicht in das Feld geschrieben werden.
    For $anderx2 = 0 To 2
    $otherinputstate = GUICtrlRead($hinputs[Floor($loesx / 3) * 3 + $anderx2][Floor($loesy / 3) * 3 + $andery2])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    Next
    Next
    If $moeglich[0] = 1 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],1);Wenn
    If $moeglich[0] = 0 And $moeglich[1] = 1 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],2);nur
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 1 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],3);eine
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 1 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],4);Zahl
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 1 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],5);möglich
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 1 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],6);ist,
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 1 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],7);muss
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 1 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],8);diese
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 1 Then GUICtrlSetData($hinputs[$loesx][$loesy],9);die richtige sein und wird in das Feld geschrieben.
    EndIf
    Next
    Next
    Next
    EndFunc

    [/autoit]

    MFG chris :D

  • Chris:
    Gute Idee, das mit dem Hintergrund, ich hätt Striche reingemacht.
    Aber Fehler konnt ich bis jetzt keine Entdecken. Alle Zahlen, die eingefügt werden, sind richtig, wenns auch nich immer alle sind, aber ich kanns ja mal überprüfen.

  • Überprüft: Egal, ob alle Zahlen eingefügt werden, oder net, die, die drinstehn sind richtig.
    Welches Sudoku hast du verwendet? Dann kann ichs überprüfen.
    Oder liegt der Fehler in deiner Verbesserung? Die hab ich nämlich nicht verbessert.
    Weiß jemand, wie man die Zeilen 51 - 59 abkürzen kann?
    Ich schau mal, ob ich die neue If-Passage abkurzen kann.

  • Hallo

    Nette Idee, aber funktioniert leider nicht!

    Code
    |x|x|x|x|x|x|x|x|x|
    |x|3|8|x|x|x|2|1|x|
    |x|2|x|5|x|4|x|6|x|
    |x|x|9|x|4|x|8|x|x|
    |x|x|x|1|3|2|x|x|x|
    |x|x|4|x|9|x|6|x|x|
    |x|5|x|8|x|9|x|2|x|
    |x|9|6|x|x|x|3|4|x|
    |x|x|x|x|x|x|x|x|x|

    Gruss Fabian

    Einmal editiert, zuletzt von Fabian (30. April 2011 um 22:50)

  • ich weiß ja nicht, ob's klappt, aber ich zweifel stark daran, dass komplexe sudokus mit skripten, die so wenige zeilen haben, gelöst werden können..

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • Ich hab mal vor etwa nem halben Jahr mir auch darüber Gedanken gemacht. Da ich keinen Rechner zur Hand hatte habe ich über 3 Din-A4 Code geschrieben, jeddoch find ich dies grad nicht. Dabei ging ich etwa so vor,hab alle Möglichkeiten für jedes Feld berechnet, und danach wurde stur alle Möglichkeiten durchprobiert.
    Das dauer vll ein wenig, aber es löst eigentlich alle Sudokus. Hab auch einige Zenarien durchgespielt und es funktionierte!

  • @Fabian:
    Bei manchen Sudokus muss man probieren, welche Zahlen möglich sind und sich dann überlegen, welche anderen Zahlen dadurch feststehen. Das ist Raten und das wollt ich eig. nicht im Script. Aber ich kann es ja mal versuchen (wird n bissl dauern, die kann ich nich ma RL :D ).

  • chrisatack:
    Die Striche lassen sich viiiiel einfacher einfügen:

    [autoit]

    GUICreate("Sudoku", 186, 206);GUI erstellen
    GUISetBkColor ( 0x555555 )
    For $guizaehleins = 0 To 8
    For $guizaehlzwei = 0 To 8
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 + Floor($guizaehlzwei / 3) * 3, $guizaehleins * 20 + Floor($guizaehleins / 3) * 3, 20,20); 9x9 Inputs erstellen
    Next
    Next
    $hloesenbutton = GUICtrlCreateButton("Lösen!",0,186,186, 20); Lösen-Button erstellen

    [/autoit]
  • Hi.
    Hab es jetzt nur bei einem Sudoku ausprobiert, aber es hat geklappt. Nur ein Verbesserungsvorschlag von mir (ist aber nicht dringend nötig ;) :(

    ich würde am Zeile 16 von:

    [autoit]

    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20, $guizaehleins * 20, 20,20)

    [/autoit]

    zu :

    [autoit]

    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20, $guizaehleins * 20, 20,20, BitOr($ES_CENTER, $ES_NUMBER))

    [/autoit]

    verändern. Dann werden die Buchstaben zentriert (optisch etwas schöner :) ) und man kann nur Nummern eingeben, damit ein User nicht auf dumme Ideen kommt. Musst dann natürlich die EditConstants einfügen.
    Wenn ich nun in Zukunft mal bei einem Sudoku nicht weiter komme, dann weiß ich ja wie ichs lösen kann. :thumbup:

  • Das Zentrieren ist eine gute Idee, auf die Optik hab ich anfangs keinen so großen Wert gelegt. Weißt du auch, wie man maximal eine Ziffer eingeben kann und danach hüpft die Eingabe ein Feld weiter?
    Dass (noch) nicht alle Sudokus gelöst werden könne, weiß ich. Wenn ich mal wieder Zeit aufbringen kann, werde ich versuchen, das Script zu verbessern. Noch weiß ich erst, dass man das Sudoku abspeichern muss, bevor man rät, damit man, wenns falsch ist, alle Fehler wieder ausbessern kann.
    Das sollte dann mal so aussehen:
    -Speichern
    -Die erste mögliche Zahl ins erste leere Feld schreiben
    -Schlussfolgern, welche Felder nun welchen Wert annehmen müssen
    -Solange raten oder Schlussfolgern, bis voll oder unmöglich weiterzumachen
    -Wenn voll, überprüfen, ob richtig
    -Wenn unmöglich, gespeicherte Werte erneut eingeben und mit Nächster Zahl/nächstem Feld wieitermachen

    Wer also Lust UND Zeit hat...

    Hier übrigens der aktuelle Code:

    Spoiler anzeigen
    [autoit]

    Global $hinputs[9][9]
    GUICreate("Sudoku", 186, 206);GUI erstellen
    GUISetBkColor ( 0x555555 )
    For $guizaehleins = 0 To 8
    For $guizaehlzwei = 0 To 8
    $hinputs[$guizaehlzwei][$guizaehleins] = GUICtrlCreateInput("",$guizaehlzwei * 20 + Floor($guizaehlzwei / 3) * 3, $guizaehleins * 20 + Floor($guizaehleins / 3) * 3, 20,20, BitOr(1, 8192)); 9x9 Inputs erstellen
    Next
    Next
    $hloesenbutton = GUICtrlCreateButton("Lösen!",0,186,186, 20); Lösen-Button erstellen
    GUISetState()

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

    $MSGBoxMSG = MsgBox(4,"Sudoku aus .SUDOKU laden", "Möchten sie ein Sudoku laden, das in einer .SUDOKU-Datei gespeichert wurde?")
    If @error Then Exit
    If $MSGBoxMSG = 6 Then
    Global $inifile = FileOpenDialog(".SUDOKU öffnen", @ScriptDir, "Sudoku-Dateien (*.SUDOKU)")
    _SUDOKUopen()
    ElseIf $MSGBoxMSG = 7 Then
    Global $inifile = _NewTempFile(@scriptdir,"",".SUDOKU")
    EndIf
    ;.SUDOKU-Datei öffnen

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

    While 1
    sleep(20)
    $MSG = GUIGetMsg()
    If $MSG = -3 Then
    Exit;Beim Drücken auf das Kreuz: Schließen
    ElseIf $MSG = $hLoesenbutton Then
    _Loesen();Beim Drücken auf den Lösen-Button: Lösen
    EndIf
    WEnd

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

    Func _Loesen()
    For $einundachzigmal = 0 To 81;Nach 81 Durchläufen muss das Sudoku fertig sein, wenn es lösbar ist
    For $loesy = 0 To 8;hier geht das Script alle 9 y-Werte durch, die das Feld haben kann, in das eine Zahl geschrieben werden soll
    For $Loesx = 0 To 8;hier geht das Script alle 9 x-Werte durch, die das Feld haben kann, in das eine Zahl geschrieben werden soll
    $inputstate = GUICtrlRead($hinputs[$loesx][$loesy]);Wenn das Feld bereits voll ist, soll nichts gemacht werden
    If $inputstate = "" Then;Wenn das Feld bereits voll ist, soll nichts gemacht werden
    Local $moeglich[9] = [1,1,1,1,1,1,1,1,1];Hier wird gespeichert, ob die 1, die 2 ... in dieses Feld geschrieben werden könnte
    For $einsneun = 1 To 9;Hier geht das Script die Zahlen von 1 - 9 durch und prüft, ob diese in das Feld geschrieben werden können
    For $andery = 0 To 8;Dazu werden alle Felder der gleichen Spalte...
    $otherinputstate = GUICtrlRead($hinputs[$loesx][$andery])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    For $anderx = 0 To 8;, die der gleichen Zeile...
    $otherinputstate = GUICtrlRead($hinputs[$anderx][$loesy])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    For $andery2 = 0 To 2; und die des gleichen 3x3-Feldes überprüft, ob sie gleich der durch $einsneun festgelegten Zahl sind, wenn ja, kann diese Zahl nicht in das Feld geschrieben werden.
    For $anderx2 = 0 To 2
    $otherinputstate = GUICtrlRead($hinputs[Floor($loesx / 3) * 3 + $anderx2][Floor($loesy / 3) * 3 + $andery2])
    If $einsneun = $otherinputstate Then
    $moeglich[$einsneun - 1] = 0
    Endif
    Next
    Next
    Next
    If $moeglich[0] = 1 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],1);Wenn
    If $moeglich[0] = 0 And $moeglich[1] = 1 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],2);nur
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 1 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],3);eine
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 1 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],4);Zahl
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 1 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],5);möglich
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 1 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],6);ist,
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 1 And $moeglich[7] = 0 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],7);muss
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 1 And $moeglich[8] = 0 Then GUICtrlSetData($hinputs[$loesx][$loesy],8);diese
    If $moeglich[0] = 0 And $moeglich[1] = 0 And $moeglich[2] = 0 And $moeglich[3] = 0 And $moeglich[4] = 0 And $moeglich[5] = 0 And $moeglich[6] = 0 And $moeglich[7] = 0 And $moeglich[8] = 1 Then GUICtrlSetData($hinputs[$loesx][$loesy],9);die richtige sein und wird in das Feld geschrieben.
    EndIf
    Next
    Next
    Next
    ;Hier beginnt das Raten :)
    ;Aktuellen Zustand in .SUDOKU "speichern"
    For $iniwriteY = 0 To 8
    For $iniwriteX = 0 To 8
    IniWrite($inifile, $iniwriteY + 1, $iniwriteX + 1, GUICtrlRead($hinputs[$iniwriteX][$iniwriteY]))
    Next
    Next
    ;HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS, HIER FEHLTS
    EndFunc

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

    Func _NewTempFile($s_DirectoryName, $s_FilePrefix , $s_FileExtension , $i_RandomLength = 7)
    ; add trailing \ for directory name
    If StringRight($s_DirectoryName, 1) <> "\" Then $s_DirectoryName = $s_DirectoryName & "\"
    ;
    Local $s_TempName
    Do
    $s_TempName = ""
    While StringLen($s_TempName) < $i_RandomLength
    $s_TempName = $s_TempName & Chr(Random(97, 122, 1))
    WEnd
    $s_TempName = $s_DirectoryName & $s_FilePrefix & $s_TempName & $s_FileExtension
    Until Not FileExists($s_TempName)

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

    Return $s_TempName
    EndFunc

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

    Func _SUDOKUopen()
    For $inputswriteY = 0 To 8
    For $inputswriteX = 0 To 8
    GUICtrlSetData($hinputs[$inputswriteX][$inputswriteY],0)
    Next
    Next
    For $inputswriteY = 0 To 8
    For $inputswriteX = 0 To 8
    GUICtrlSetData($hinputs[$inputswriteX][$inputswriteY],IniRead($inifile,$inputswriteY + 1,$inputswriteX + 1,""))
    Next
    Next
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von Macimac (4. Mai 2011 um 18:13)