Ich hab mir mal die Zeit genommen (ok, es waren nur 2h ), 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
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()
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
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
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.
Ich hab übrigens nicht überprüft, ob das der einzige Sudoku-Löser ist, falls nein, hab ich aber nicht abgeguckt .