Hi, habe für Opera 10.6 in den Workaround neue Features eingebaut, s. erstes Post.
Beiträge von Andy
-
-
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$Color2 = _RGBToGL("0xFFFFFF")
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($Color2 & @CRLF)
$Color2 = _RGBToGL("0x7700FF")
ConsoleWrite($Color2 & @CRLF)Func _RGBToGL($Color)
[/autoit] [autoit][/autoit] [autoit]
$nColor = StringTrimLeft($Color, 2)$aColor = StringSplit($nColor, "")
[/autoit] [autoit][/autoit] [autoit]
$R = $aColor[1] & $aColor[2]
$G = $aColor[3] & $aColor[4]
$B = $aColor[5] & $aColor[6]$Para1 = dec($R)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Para1 = ' & $Para1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$Para2 = dec ($G)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Para2 = ' & $Para2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$Para3 = dec($B)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Para3 = ' & $Para3 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug ConsoleReturn ($Para1 / 255) & "|" & ($Para2 / 255) & "|" & ($Para3 / 255)
[/autoit] [autoit][/autoit] [autoit]
EndFuncFunc _GLToRGB($Para1, $Para2, $Para3)
[/autoit] [autoit][/autoit] [autoit]
$R = StringTrimLeft(Hex(255 * $Para1), 6)
$G = StringTrimLeft(Hex(255 * $Para2), 6)
$B = StringTrimLeft(Hex(255 * $Para3), 6)
Return "0x" & $R & $G & $B
EndFuncFunc _HexToDecimal($iHex)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
If StringLeft($iHex, 2) = "0x" Then $iHex = StringMid($iHex, 3)
If StringIsXDigit($iHex) = 0 Then
SetError(1)
MsgBox(0,"Error","Wrong input, try again ...")
Return ""
EndIf
Local $ret="", $hx_count=0, $hx_array = StringSplit($iHex, ""), $Ii, $hx_tmp
For $Ii = $hx_array[0] To 1 Step -1
$hx_tmp = StringInStr($iHex, $hx_array[$Ii]) - 1
$ret += $hx_tmp * 16 ^ $hx_count
$hx_count += 1
Next
Return $ret
EndFunc ;==>_HexToDec();GLtoRGB:
[/autoit] [autoit][/autoit] [autoit];Parameter * 255
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;Das in Hex wandeln
;6 Stellen von links kappen
;R G B zusammenfügen
;0x dranhängen;RGBtoGL:
[/autoit] [autoit][/autoit] [autoit];0x kappen
[/autoit]
;R G B trennen
;6Stellen dranfügen
;Das in Dezimal wandeln
; Durch 255 teilen -
@Flype, du disqualifizierst dich selbst durch
Zitatkann mir nicht bittte bitte einer einfach die lösung posten anstatt immer
"les dir das hier mal durch"Mal krass gesagt ist das hier kein Club der darauf wartet deinen Kram auf die Reihe zu bekommen! Und "einfach die Lösung posten" geht auch nur dann, wenn man genug und vor allem die richtigen Informationen bekommt.
Ich verwette meinen Hintern darauf, daß du weder den Client und den Server lt. meinem Link auf deinem Rechner bzw. im Netzwerk laufen hattest, noch RICHTIG GELESEN HAST!
Wenn ich sehe, was du in deinem Router eingetragen hast, ist das völlig klar!
Hättest du gelesen, wüßtest du zumindest, das der Client kein forwarding braucht.Zitateigentlich kann ich mir nicht vorstellen das es für die erfahren autoitler
schwer ist mir zu sagen was am script falsch ist oder was ich falsch machewas du falsch machst? Du liest nicht....Links wurden gepostet.
Nochmal, niemand von uns kann deinen Router konfigurieren, und niemand von uns kennt dein Netzwerk.Aber um hier nicht als Buhmann dazustehen, der nur alles mies macht, was hälst du mal davon, Routermodell und Handbuchauszug zu posten?
Was ich an deinem Screenshot überhaupt nicht kapiere....wo sind die Ports fürs forwarding bzw. NAT bzgl. HTTP eingetragen?
Denn irgendwie muß dein Router ja wissen, an welchen internen Rechner er die HTTP-Pakete senden soll. Genau dort kannst du auch deinen Server eintragen.
Weiterhin könnte es sein, daß z.B. alles ausser HTTP geblockt wird, eine Regel in der Router- Firewall....da kannst du "hintendran" dann erlauben was du willst, bis dorthin kommt dein Paket garnicht.... -
-
Da du zzt. keinerlei Strategien anwendest, werden die allermeisten Sudokus natürlich nicht gelöst. Beim Backtracken viel Erfolg!
Du kannst ja mal berichten, in welcher Zeit die "bösen" (s.o.) Sudokus gelöst wurden...mein BT hat sich bei zweien "totgelaufen", bzw ich habe nach einer bestimmten Zeit abgebrochen. -
Fehlermeldungen, @Error-Abfragen, Debug-Msgbox bzw. -Consolewrite-Infos, Traceline-Infos?
Wieso sollen wir uns Arbeit machen, wenn du selbst in der Lage bist festzustellen, wo der Fehler liegt? Das war eine ernst gemeinte Frage! -
SEuBo,
du erwarest definitiv zu viel...jetzt sollen die Leute auch noch kapieren was ihnen hier in den Hintern geblasen wird...unverschämt von dir!
Und auch noch selbstständig eine Zeile des Scripts tauschen...wo kommen wir denn da hin, wenn das jeder hier so machen würde?
*Ironiemodus OFF*Nach den gelesenen Kommentaren zu den in den letzten Tagen geposteten Lösungen hab ich mich entschlossen, vorerst irgendwelchen "Neulingen" garnicht mehr zu Antworten. Solltest du auch machen, dann hast du mehr Zeit zu schlafen

-
omfg...
[autoit]#include <Array.au3>
[/autoit][autoit][/autoit][autoit]
$t="Hey*ho*ho2"$SUCHSTRING="ho"
[/autoit][autoit][/autoit][autoit]$array = StringSplit(StringReplace($t, '*'&$SUCHSTRING&'*', '*'), '*',3)
[/autoit]
_ArrayDisplay($array) -
...und wieder wurde einem erfolgreich der Arm aus der Sonne gelegt.....
[autoit]
...damit nicht über das 1. item im array gejammert wird...#include <Array.au3>
[/autoit]
$t="Hey*ho*ho2"
$array = StringSplit(StringReplace($t, '*ho*', '*'), '*',3)
_ArrayDisplay($array) -
Welcher?
Im Script in Post #5 ist ein Sudoku eingetragen. Das wird auch gelöst.... -
@Burak
mit setzen des Filepointers kann man auch im Schreibmodus lesen, s. Skript oben.
Das mit der Geschwindigkeit hattest du ja erwähnt.... -
Zitat
gibt es eine möglichkeit das zu beschleunigen denn auf die Art braucht er ne weile da Die MdlDyna.inc 35198 Zeilen hat
Inelukis Version ist beim mehrfachen Eintragen nur deswegen so langsam, weil er permanent die Datei öffnet und schließt und jedes mal sämtliche Zeilen abklappert...
Öffne deine Datei, schreibe alle Daten (Bsp. s. SeuBo) und dann schreib die Datei.Spoiler anzeigen
[autoit]$dateiinhalt = '"item" 4' & @CRLF & _
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
'{' & @CRLF & _
'ALLE ITEMEINTRÄGE HIER' & @CRLF & _
'}' & @CRLF & _
'"mvr" 5' & @CRLF & _
'{' & @CRLF & _
'ALLE MONSTEREINTRÄGE HIER' & @CRLF & _
'}' & @CRLF
$a = FileWrite("test.txt", $dateiinhalt) ;datei zum Testen anlegen$hfile = FileOpen("test.txt", 1) ;datei zum schreiben öffnen
[/autoit] [autoit][/autoit] [autoit]
$n = FileSetPos($hfile, 0, 0) ;filepointer setzen, so kann man auch im schreibmodus lesen$dateiinhalt = FileRead($hfile)
[/autoit] [autoit][/autoit] [autoit];for / to schleife alle items
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$item = ""
For $i = 1 To 4
$item &= "Itemeintrag Nr. " & $i & " eingefügt" & @CRLF
Next$mvr = "}" & @CRLF & '"mvr"'
[/autoit] [autoit][/autoit] [autoit]
$dateiinhalt = StringReplace($dateiinhalt, $mvr, $item & $mvr, 0, 1) ;casesensitiv ist wesentlich schnellerFileWrite($hfile, $dateiinhalt)
[/autoit]
;next
FileClose($hfile)
ShellExecuteWait("test.txt")
FileDelete("test.txt") ;testdatei löschen -
ein Sudoku besteht aus 9 Zeilen a 9 Ziffern. Wenn man alle Zeilen nacheinander schreibt, entsteht....ein String mit 81 Zeichen.
Anstatt der 0 kann man auch . oder _ oder * einsetzen. Die gängigen Löser (ich empfehle mal einen Blick auf http://www.sudokuwiki.org/sudoku.htm) fressen so ziemlich alles.... -
Ok, kreisförmig "um das erste Rechteck" ist eine gute Hausnummer^^
Als ersten Ansatz würde ich die Rechtecke sortieren, das größte zuerst. Wenn die Rechtecke nacheinander erstellt werden sollen, ist das aber auch nicht schlimm.
Ich habe folgendes umgesetzt:
-Rechteck erstellen mit zufälliger Breite und Höhe
-vom Mittelpunkt (man könnte auch den Schwerpunkt aller Rechtecke nehmen) das Rechteck in Richtung Fenster-Rand bewegen, wenn es ein anderes Rechteck berührt, weiterbewegen.
-Berührt es keines der anderen Rechtecke, dann ist eine potentielle Position erreicht.
-Abstand bestimmen zum Mittelpunkt. Ist dieser Abstand minimal, dann Position merken.
-Sind alle möglichen Positionen rund um die anderen Rechtecke abgearbeitet, Rechteck an die Position mit dem minimalen Abstand zum Mittelpunkt zeichnen.
-Neues Rechteck erstellen uswusfhab das mit controls gebastelt, so wars einfacher^^ ist aber auch langsamer.
Optimierbar ist die Schrittweite der Linienfunktion, z.B. nur jedes 2. oder 3. Pixel und der Kollisions-check
Weiterhin würde ich den Schwerpunkt aller vorhandenen Rechtecke als neuen Startpunkt festlegen, die Rechtecke sollten so noch etwas näher zusammenrücken....Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Array.au3>
#include <StructureConstants.au3>
Dim $rechteck[100]
Dim $a[4] ;$a = controlgetpos($hgui,"",$rechteck[$id])Global $SPsx = 400 ;koordinaten Gesamt-Schwerpunkt
[/autoit] [autoit][/autoit] [autoit]
Global $SPsy = 400
Global $xmin, $ymin ;koordinaten des aktuellen rechtecks
Global $abstand_min = 2 ^ 12 ;minimaler abstand$hgui = GUICreate("Rechtecke anordnen", 800, 800, 100, 1)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()
$rechteck[0] = GUICtrlCreateGraphic(0, 0, 800, 800)For $i = 1 To 40 ;anzahl der Rechtecke
[/autoit] [autoit][/autoit] [autoit]
$a[2] = Random(1, 7, 1) * 20 ;breite
$a[3] = Random(1, 7, 1) * 20 ;höhe
$rechteck[$i] = GUICtrlCreateGraphic(20, 20, $a[2], $a[3])
GUICtrlSetBkColor(-1, Random(1, 255 * 255 * 255, 1))
GUICtrlSetColor(-1, Random(1, 255, 1))$abstand_min = 2 ^ 12 ;zzt minimaler abstand des aktuellen Rechtecks zum Mittelpunkt
[/autoit] [autoit][/autoit] [autoit]
For $x = 100 To 700 Step 20;oberer Rand von links nach rechts
$y = 100
line($SPsx, $SPsy, $x, $y, $i) ;auf der Linie entlang das Rechteck bewegen
If $abstand_min = 0 Then ;gilt nur für das allererste Rechteck
GUICtrlSetPos($rechteck[1], $xmin, $ymin)
ContinueLoop 2 ;im mittelpunkt plazieren, nächstes Rechteck erstellen
EndIf
Next
For $y = 100 To 700 Step 20;rechter Rand von oben nach unten
$x = 700
line($SPsx, $SPsy, $x, $y, $i)
Next
For $x = 700 To 100 Step -20;oberer Rand
$y = 700
line($SPsx, $SPsy, $x, $y, $i)
Next
For $y = 700 To 100 Step -20;oberer Rand
$x = 100
line($SPsx, $SPsy, $x, $y, $i)
NextGUICtrlSetPos($rechteck[$i], $xmin, $ymin)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Next
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Until GUIGetMsg() = -3Func Line($x1, $y1, $x2, $y2, $rechteck) ;y=mx+b = geradengleichung =linienfunktion linie von x1|y1 nach x2|y2 zeichnen
[/autoit] [autoit][/autoit] [autoit]
If $x2 = $x1 Then ;senkrechte linie
Local $Step = 1
If $y2 < $y1 Then $Step = -1
For $yy = $y1 To $y2 Step $Step
If _checkueberlappung($x1, $yy, $rechteck) = 0 Then Return
Next
Return
EndIfIf $y2 = $y1 Then ;waagrechte linie
[/autoit] [autoit][/autoit] [autoit]
$Step = 1
If $x2 < $x1 Then
$Step = -1
EndIf
For $xx = $x1 To $x2 Step $Step
If _checkueberlappung($xx, $y1, $rechteck) = 0 Then Return
Next
Return
Else
Local $m = ($y2 - $y1) / ($x2 - $x1)
EndIfLocal $b = $y1 - $m * $x1
[/autoit] [autoit][/autoit] [autoit]If Abs($m) <= 1 Then
[/autoit] [autoit][/autoit] [autoit]
$Step = -1
If $x1 < $x2 Then $Step = 1For $xx = $x1 To $x2 Step $Step
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $yy = Round($m * $xx + $b)
If _checkueberlappung($xx, $yy, $rechteck) = 0 Then Return
Next
Else
$Step = -1
If $y1 < $y2 Then $Step = 1
For $yy = $y1 To $y2 Step $Step
Local $xx = Round(($yy - $b) / $m)
If _checkueberlappung($xx, $yy, $rechteck) = 0 Then Return
Next
EndIf
EndFunc ;==>LineFunc _checkueberlappung($sxi, $syi, $id) ;kollision ermitteln
[/autoit] [autoit][/autoit] [autoit]
$x1i = $sxi - ($a[2] / 2) ;aktuelles rechteck oben links
$y1i = $syi - ($a[3] / 2)
$x2i = $x1i + $a[2] ;unten rechts
$y2i = $y1i + $a[3]
GUICtrlSetPos($rechteck[$id], $x1i, $y1i) ;ausklammern....For $m = 1 To $i - 1 ;alle vorhandenen Rechtecke prüfen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$b = ControlGetPos($hgui, "", $rechteck[$m]) ;position des rechtecks ermitteln
$x1m = $b[0] ;oben links
$y1m = $b[1]
$x2m = $b[0] + $b[2] ;unten rechts
$y2m = $b[1] + $b[3]
If _RectCollision($x1m, $y1m, $x2m, $y2m, $x1i, $y1i, $x2i, $y2i) Then ;wenn kollision, dann return 1
;MsgBox(0, "Kollision mit: ", $m)
Return 1
EndIf
Next
;MsgBox(0, "keine kollision!", $sxi&" "&$syi)
$abstand = Sqrt(($sxi - $SPsx) ^ 2 + ($syi - $SPsy) ^ 2) ;abstand vom Gesamt-Schwerpunkt
If $abstand <= $abstand_min Then ;kleinster abstand zum Gesamt-Schwerpunkt gefunden
;MsgBox(0, "Kleinster abstand", $abstand)
$abstand_min = $abstand
$xmin = $x1i ;x-koordinate merken
$ymin = $y1i ;y-koordinate merken
EndIf
Return 0 ;keine kollision, return 0
EndFunc ;==>_checkueberlappungFunc _RectCollision($Rect1X1, $Rect1Y1, $Rect1X2, $Rect1Y2, $Rect2X1, $Rect2Y1, $Rect2X2, $Rect2Y2)
[/autoit]
; Prog@ndy
Local Const $tagRECT = "long;long;long;long"
Local $1 = DllStructCreate($tagRECT)
Local $2 = DllStructCreate($tagRECT)
Local $3 = DllStructCreate($tagRECT)
DllStructSetData($1, 1, $Rect1X1)
DllStructSetData($1, 2, $Rect1Y1)
DllStructSetData($1, 3, $Rect1X2)
DllStructSetData($1, 4, $Rect1Y2)
DllStructSetData($2, 1, $Rect2X1)
DllStructSetData($2, 2, $Rect2Y1)
DllStructSetData($2, 3, $Rect2X2)
DllStructSetData($2, 4, $Rect2Y2)
Local $r = DllCall("User32.dll", "int", "IntersectRect", "ptr", DllStructGetPtr($3), "ptr", DllStructGetPtr($1), "ptr", DllStructGetPtr($2))
If @error Then Return SetError(1, 0, 0)
Return $r[0] <> 0
EndFunc ;==>_RectCollisionBild hänge ich noch an....[Blockierte Grafik: http://www.abload.de/img/forum7bw3.jpg]
-
Wenn du "Futter" brauchst, im schon angesprochenen Thread sollte auch eine Liste von ca 36.000 Sudokus enthalten sein, darunter auch sehr viele 17er. Ich hatte die mal spaßeshalber mit meinem Solver abgeackert, um "böse" Sudokus zu finden.
20xBöse: (jedenfalls bei "normalen" Strategien)Spoiler anzeigen
160000000000300050040002000007000020000104000000060007002005000000080006000000001
000000120000803000000009000401060000000007003002000000000020040030000008095000000
000900130000540000000060000080001020005000004006000000030007000004000005000000009
500080200740000000000000000002050000000600007800000040060700000001000500000304000
602050000000003040000000000430008000010000200000000700500270000000000081000600000
602050000000004030000000000430008000010000200000000700500270000000000081000600000
602700000000800130000000090400000700030090000000010000500400600010000020000000000
700080000000000104000000200000102000200000030000400500051030000000006070040000000
000701600500080000000000000000600701208090000400000000000020050070300000000000080
002100400083000000000000000500400700600020000010000000000008063100700000000000080
000800001900000500000000000410050000003000080000000700000108040020300000500000600
051000000000300080000070000020501006800000040000700000000000201300040000000000500
000020007405000000001000000000401000003000008060002000000500210070030000000000040
000420050070000000000080000030006007002090080000000001000007006805000000000001000
010065000000100080000000032070004001000020000008000000000007004806000000003000000
500004090020001000000030000031000008000005000008000000600700050004080000000000001
030080000000002005000000001000705030040000700000001000502000000000040080001006000
....7.94..7..9...53....5.7..874..1..463.8.........7.8.8..7.....7......28.5.268...
38.6.......9.......2..3.51......5....3..1..6....4......17.5..8.......9.......7.32
6...4...3.1.....7...5...8.....5.2...3...9...2...1.3.....8...9...7.....5.2...3...4das 8. sollte man mal "von Hand" probieren^^
-
Hi,
gib mal ne Hausnummer, nach welchen Kriterien sich die Rechtecke verteilen sollen.
Möglichst kleiner Abstand der Rechtecke zueinander in einem Umkreis, oder in einer Ellypse oder auch (das ist dann ein MiniMax-Problem) der minimale "Abfall" bei Zuschnitt aus einer x*y-großen Platte.....da gibts reichlich Möglichkeiten, viele Rechtecke anzuordnen^^ -
Wenn du ein Sudoku, dass nur aus leeren Feldern besteht, mit deinem Programm lösen kannst, dann sollte dieses Script alle anderen Sudokus auch lösen.
Nur ist die "Brute-Force"-Lösung nicht immer die schnellste. Daher die diversen Strategien...ZitatKönntest du bitte mal das Sodoku posten, was du benutzt hast?
In meinem vorherigen Post ist sowohl das Sudoku, als auch die Lösung. Weitere in dem Link s.o. -
Du könntest auf dem WLAN-Rechner remote ein "netstat -a" laufen lassen und die Ausgabe auswerten. Somit bekommst du wenigstens raus, ob noch eine Verbindung zu anderen Rechnern bzw Internet besteht.
Falls ja, ist man immer noch nicht weiter, denn bei fehlendem Traffic könnte es entweder sein, daß der User z.B. Forenbeiträge oder längere Artikel liest, oder vor dem Fernseher im Sessel rumliegt und vergessen hat, im WLAN-Rechner den Browser auszuschalten....
Du könntest ja per "net send " (Nachrichtendienst muss aktiviert sein!) dem WLAN-User eine Frage stellen. Antwortet er nicht, kannst du den Router ausschalten^^ -
...gib mal Sudoku in der Sufu ein, im µ-It März 2009 gab es sehr schöne Solver
Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GDIPlus.au3>
;=======================>
#region GUI$start = "000670900360005028805002100020506004009407000700100583070054261000703000084090050" ;normaler start
[/autoit] [autoit][/autoit] [autoit]
$start1= "410670900360005028805002100020536004009407610700100583070054261000703000084090050" ;weitere zahlen der lösung eingesetzt
$loesung="412678935367915428895342176128536794539487612746129583973854261251763849684291357";lösung
$hGUI = GUIcreate("Sodoku", 300, 370)
Local $aInputs[9][9]
For $x = 0 To 8
For $y = 0 To 8
$left = ($x + 1) * 30
$top = ($y + 1) * 30
$nummer=stringmid($start1,$y*9+$x+1,1)
if $nummer="0" then $nummer=""
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $nummer = ' & $nummer & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$aInputs[$x][$y] = GUICtrlCreateInput($nummer, $left, $top, 20, 20)
Next
Next
$idStartBut = GUIctrlcreatebutton("Start", 100, 320, 100)
;load_old_sodoku($aInputs)
GUIsetstate()
;====================>Mit GDI+ die Striche draufmalen
draw_lines()
;======>
While 1
$nMsg = GUIgetmsg()
Switch $nMsg
Case -3 ;GUI_EVENT_CLOSE
Exit
Case $idStartBut
$aSodoku = get_array_of_sodoku($aInputs)
save_Sodoku_Ini($aSodoku)
MakeSodoku($aSodoku, $aInputs)
EndSwitch
Sleep(20)
WEndFunc load_old_sodoku($aInputs)
[/autoit] [autoit][/autoit] [autoit]
If NOT FileExists("last_sodoku.ini") Then return -1
For $x = 0 To 8
For $y = 0 To 8
GUICtrlSetData($aInputs[$x][$y], Iniread("last_sodoku.ini", "section", $x&"|"&$y, ""))
Next
Next
return 0
endfuncFunc save_Sodoku_Ini($aSodoku)
[/autoit] [autoit][/autoit] [autoit]
For $x = 0 To 8
For $y = 0 To 8
If $aSodoku[$x][$y] <> 0 Then
Iniwrite("last_sodoku.ini", "section", $x&"|"&$y, $aSodoku[$x][$y])
Else
Iniwrite("last_sodoku.ini", "section", $x&"|"&$y, "")
endif
Next
Next
EndFuncFunc get_array_of_sodoku($aInputs)
[/autoit] [autoit][/autoit] [autoit]
Local $aSodoku[10][10]
For $x = 0 To 8 ;die nicht-existierende Reihe mit 0en auffüllen
$aSodoku[$x][9] = 0
Next
For $x = 0 To 8
For $y = 0 To 8
$aSodoku[$x][$y] = GUIctrlread($aInputs[$x][$y])
If $aSodoku[$x][$y] = "" Then $aSodoku[$x][$y] = 0
Next
Next
return $aSodoku
EndFuncFunc draw_lines()
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Startup()
$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hPen = _GDIPlus_PenCreate(0xFF000000, 3)
_GDIPlus_GraphicsDrawLine($hGraphics, 115, 20, 115, 300, $hPen) ;senkrecht
_GDIPlus_GraphicsDrawLine($hGraphics, 205, 20, 205, 300, $hPen) ;senkrecht
_GDIPlus_GraphicsDrawLine($hGraphics, 20, 115, 295, 115, $hPen) ;waagrecht
_GDIPlus_GraphicsDrawLine($hGraphics, 20, 205, 295, 205, $hPen) ;waagrecht
_GDIPlus_Shutdown()
EndFuncFunc array_drehen2D($array)
[/autoit] [autoit][/autoit] [autoit]
$er = $array
For $i = 0 To Ubound($array) -1
For $i2 = 0 To Ubound($array, 2) -1
$er[$i][$i2] = $array[$i2][$i]
Next
Next
return $er
EndFunc ;==>by Zeitriss#endregion GUI
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func MakeSodoku($aFeld, $aInputs)
[/autoit] [autoit][/autoit] [autoit]
Local $aMerk[9][9] ;zum merken, welche Zahlen dort hin passen
While 1
$Ziffervoll = true
For $x = 0 To 8 ;==>Alle Ziffern setzen
For $y = 0 To 8
If $aFeld[$x][$y] = 0 Then
$Ziffervoll = False
$aMerk[$x][$y] = getpossibleNrs($aFeld, $x, $y)
Else
$aMerk[$x][$y] = ""
EndIf
Next
Next
If $Ziffervoll Then exitloop
;===>Alle Ziffern setzen, die eindeutig sind
For $x = 0 To 8 ;==>Alle Ziffern setzen
For $y = 0 To 8
If Stringlen($aMerk[$x][$y]) = 1 Then
$aFeld[$x][$y] = $aMerk[$x][$y]
$aMerk[$x][$y] = ""
EndIf
Next
Next
Sleep(5)
WEnd
;===========================>Berechnung ist beendet
;=======>Jetzt werden die Kontrollfelder ausgefüllt
For $x = 0 To 8
For $y = 0 To 8
GUIctrlsetdata($aInputs[$x][$y], $aFeld[$x][$y])
Next
Next
EndFuncFunc getpossibleNrs($aFeld, $iX_coord, $iY_coord)
[/autoit]
$sCase = "123456789"
;========>Senkrechte
For $y = 0 To 8
If $aFeld[$iX_coord][$y] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX_coord][$y], "")
Next
;=========>Waagrechte
For $x = 0 To 8
If $aFeld[$x][$iY_coord] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$x][$iY_coord], "")
Next
;==============>Daten des 9er-Feldes bestimmen
If $iX_coord < 3 Then ;die Yer
$iX = 1
elseif $iX_coord > 5 Then
$iX = 7
elseif $iX_coord < 6 and $iX_coord > 2 Then
$iX = 4
EndIf
;=>
If $iY_coord < 3 Then ;die Yer
$iY = 1
elseif $iY_coord > 5 Then
$iY = 7
elseif $iY_coord < 6 and $iY_coord > 2 Then
$iY = 4
EndIf
;=========>9er-Feld
If $iX > 0 Then
If $aFeld[$iX-1][$iY] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX-1][$iY], "")
EndIf
If $iX < 9 Then
If $aFeld[$iX+1][$iY] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX+1][$iY], "")
EndIf
If $iX > 0 and $iY > 0 Then
If $aFeld[$iX-1][$iY-1] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX-1][$iY-1], "")
EndIf
If $iX < 9 and $iY > 0 Then
If $aFeld[$iX+1][$iY-1] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX+1][$iY-1], "")
EndIf
If $iY > 0 Then
If $aFeld[$iX][$iY-1] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX][$iY-1], "")
EndIf
If $iX < 9 and $iY < 9 Then
If $aFeld[$iX+1][$iY+1] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX+1][$iY+1], "")
EndIf
If $iX > 0 and $iY < 9 Then
If $aFeld[$iX-1][$iY+1] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX-1][$iY+1], "")
EndIf
If $iY < 9 Then
If $aFeld[$iX][$iY+1] <> 0 Then $sCase = Stringreplace($sCase, $aFeld[$iX][$iY+1], "")
EndIf
;=============>
return $sCase
EndFunc
Habe dein Script mal "vorbelegt" mit einem leichten Sudoku. Es wurde erst gelöst, nachdem ich weitere Zahlen eingesetzt hatte.
µit - März hier findest du z.B. einen Solver, bei dem Script muß man die Zeile 158 auskommentieren, um etwas zu "sehen". Das Script mit der Gui und dem farbig dargestellten Lösungsweg der Strategien hab ich irgendwo vergraben... -
Glücklichen Herzwunsch auch von mir!