- Offizieller Beitrag
So, das Script ist fertig.
Der ScrabbleHelper hilft bei der Suche nach Wörter, die man beim Scrabble legen kann, mit dem Wörterbuch von Thunderbird (über 590.000 Wörter).
Nach Eingabe der Buchstaben werden alle Wörter angezeigt, die man damit legen kann. Ebenso rechnet das Script den Punktwert aus und zeigt ihn an. Am Ende der Suche kann man das Ergebnis sortieren lassen, indem man auf "Punkte" klickt.
Angezeigt werden nur Wörter mit mehr als 3 Buchstaben, da es sich bei Wörtern mit weniger Buchstaben sowie meist um Abkürzungen handelt.
EDIT: Ich habe jetzt mal die besprochenen Optimierungen vorgenommen. Die Wörterbücher müssen jetzt runtergeladen und das ZIP-Archiv ins Scriptverzeichnis entpackt werden.
Die Wörterbücher können hier (Wörterbücher) runterladen werden.
EDIT 2: Jetzt auch mit Googlesuche. Einfach auf das Wort im Listview klicken und der IE wird mit der Googlesuche gestartet.
EDIT 3: Jetzt kann man auch einen Blankostein einsetzen.
Spoiler anzeigen
Opt("GUIOnEventMode", 1)
#include <GUIConstants.au3>
#include <Array.au3>
#include <file.au3>
#include <GuiListView.au3>
#include <IE.au3>
Dim $aWoerter[30][70000]
Dim $aEintrag[1]; wird später mit ReDim geändert
Dim $aPunkte[7][2]
Dim $h
$aPunkte[0][0] = "adeinrstu"
$aPunkte[0][1] = 1
$aPunkte[1][0] = "ghlo"
$aPunkte[1][1] = 2
$aPunkte[2][0] = "bmwz"
$aPunkte[2][1] = 3
$aPunkte[3][0] = "cfkp"
$aPunkte[3][1] = 4
$aPunkte[4][0] = "jväü"
$aPunkte[4][1] = 6
$aPunkte[5][0] = "xö"
$aPunkte[5][1] = 8
$aPunkte[6][0] = "qy"
$aPunkte[6][1] = 10
Global $Out
[/autoit] [autoit][/autoit] [autoit]DateiTest()
[/autoit] [autoit][/autoit] [autoit]$Fenster = GUICreate("ScrabbleHelper", 630, 460,-1,-1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Beenden")
GUICtrlCreateLabel("Meine Buchstaben: ", 10, 12, 100, 18)
[/autoit] [autoit][/autoit] [autoit]$Buchstaben = GUICtrlCreateInput("", 110, 10, 200, 18)
[/autoit] [autoit][/autoit] [autoit]$Joker = GUICtrlCreateCheckbox("Blankostein vorhanden", 320, 10, 130, 18)
[/autoit] [autoit][/autoit] [autoit]$Start = GUICtrlCreateButton("Start", 460, 10, 50, 18)
GUICtrlSetOnEvent(-1, "Wortsuche")
$Zaehler = GUICtrlCreateLabel("", 520, 12, 100, 18, $ES_RIGHT)
[/autoit] [autoit][/autoit] [autoit]$Listview = GuiCtrlCreateListView("Folgende Wörter wurden gefunden|Punkte", 10 ,40 ,610 ,410, $LVS_SORTDESCENDING)
GUICtrlSetOnEvent(-1, "Sort")
_GUICtrlListViewSetColumnWidth($Listview, 0, 480)
_GUICtrlListViewSetColumnWidth($Listview, 1, 100)
Dim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($Listview)]
[/autoit] [autoit][/autoit] [autoit]GUISetState(@SW_SHOW); Fenster sichtbar machen
[/autoit] [autoit][/autoit] [autoit]While 1
Sleep(100)
WEnd
Func Beenden()
$abr = MsgBox(36, "ScrabbleHelper", "Programm beenden?")
If $abr = 6 then Exit; Benutzer hat 'Ja' angeklickt, also Programm beenden
EndFunc
Func DateiTest()
ProgressOn("ScrabbleHelper", "Lade Wörterbücher...")
For $i = 0 To 28
ProgressSet(Int(100/29*$i), Int(100/29*$i) & " Prozent")
$filename = "dic/" & StringRight("0" & $i, 2) & ".dic"
If Not FileExists($filename) Then
ProgressOff()
MsgBox(16,"ScrabbleHelper","Wörterbuch-Datei: " & Chr(34) & $filename & Chr(34) & " fehlt! Bitte downloaden und ins Script-Verzeichnis entpacken." & @CRLF & "Das Programm wird beendet!")
Exit
EndIf
_FileReadToArray($filename, $h)
For $j = 0 To $h[0]
$aWoerter[$i][$j] = $h[$j]
Next
Next
ProgressOff()
EndFunc
Func WortSuche()
$Input = StringUpper(GUICtrlRead($Buchstaben)); User-Buchstaben in Grossbuchstaben wandeln
If $Input = "" Then Return(1)
GUICtrlSetState($Start, $GUI_DISABLE)
GUICtrlSetData($Zaehler, "Suche...")
If $Out > 0 Then; wenn bereits Einträge im Listview enthalten sind
For $i = 0 To $Out - 1
GUICtrlDelete($aEintrag[$i]); Einträge löschen
Next
$Out = 0; Zähler auf Null setzen
EndIf
$TJ = (GUICtrlRead($Joker) <> 4) * 1; $TJ = 1, wenn Blankostein vorhanden, sonst 0
$aInput = StringSplit($Input, ""); die eingegebenen User-Buchstaben trennen und in ein Array speichern
For $Woerterbuch = 0 To 28
GUICtrlSetData($Zaehler, "Suche... " & $Woerterbuch & "/28")
For $Anz = 1 To $aWoerter[$Woerterbuch][0]
$Temp = $aWoerter[$Woerterbuch][$Anz]; Aktuelles Wort in eine temporäre Variable
If StringLen($Temp) <= ($aInput[0] + $TJ) Then; prüfen, ob Wortlänge kleiner/gleich Anzahl der User-Buchstaben
If StringInStr($Input, StringLeft($Temp, 1)) > 0 Or $TJ = 1 Then; prüfen, ob der Anfangsbuchstabe in den User-Buchstaben vorkommt
$HTemp = StringUpper($Temp); Wort in Grossbuchstaben wandeln
For $i = 1 To $aInput[0]
$HTemp = StringReplace($HTemp, $aInput[$i], "", 1); Die User-Buchstaben aus dem Wort entfernen
Next
$Len = StringLen($HTemp)
$Blanko = 0
If ($Len = 0) Or (($Len = 1) And ($TJ = 1)) Then; wenn alle Buchstaben entfernt wurden (oder ein Blankostein vorhanden), dann kann das Wort gelegt werden
$p = 0; Variable für Punkte auf Null setzen
$aTemp = StringSplit($Temp, ""); Wort in Buchstaben aufsplitten
For $i = 1 To $aTemp[0]; alle Buchstaben testen
If ($TJ = 1) And ($HTemp = $aTemp[$i]) And ($Blanko = 0) Then; Für den Blankostein gibt es keine Punkte, also überspringen
$Blanko = 1; sorgt dafür, dass der Blankobuchstabe nur einen Buchstaben ersetzt
Else
For $j = 0 To 6; alle Punktelisten durchgehen
If StringInStr($aPunkte[$j][0], $aTemp[$i]) > 0 Then; Ist der Buchstabe in der Punkteliste enthalten?
$p += $aPunkte[$j][1]; dann die Punkte aus der Liste addieren
EndIf
Next
EndIf
Next
$aEintrag[$Out] = GUICtrlCreateListViewItem($Temp & "|" & $p, $Listview); neuen Eintrag anlegen
GUICtrlSetOnEvent(-1, "GoogleSuche")
$Out += 1; Zähler erhöhen
ReDim $aEintrag[$Out+1]; Array neu dimensionieren
EndIf
Else
ExitLoop; wenn der Anfangsbuchstabe nicht in den User-Buchstaben vorkam, dann Schleife überspringen (Tempo-Optimierung)
EndIf
Else
ExitLoop; wenn Wort mehr Buchstaben hat als der User, dann Schleife überspringen (Tempo-Optimierung)
EndIf
Next
Next
GUICtrlSetData($Zaehler, "Fertig!")
GUICtrlSetState($Start, $GUI_ENABLE)
EndFunc
Func Sort()
_GUICtrlListViewSort($Listview, $B_DESCENDING, GUICtrlGetState($Listview))
EndFunc
Func GoogleSuche()
$search = GUICtrlRead(@GUI_CtrlId)
$search = StringLeft($search, StringInStr($search, "|")-1); Endung entfernen
_IECreate("http://www.google.de/search?q=" & $search)
EndFunc
Vielleicht findet ja noch jemand Möglichkeiten zur Geschwindigkeits-Optimierung.
MfG. Oscar