• 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
    [autoit]


    Opt("GUIOnEventMode", 1)

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

    #include <GUIConstants.au3>
    #include <Array.au3>
    #include <file.au3>
    #include <GuiListView.au3>
    #include <IE.au3>

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

    Dim $aWoerter[30][70000]
    Dim $aEintrag[1]; wird später mit ReDim geändert
    Dim $aPunkte[7][2]
    Dim $h

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

    $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

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

    Global $Out

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

    DateiTest()

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

    $Fenster = GUICreate("ScrabbleHelper", 630, 460,-1,-1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Beenden")

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

    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")

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

    $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")

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

    _GUICtrlListViewSetColumnWidth($Listview, 0, 480)
    _GUICtrlListViewSetColumnWidth($Listview, 1, 100)

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

    Dim $B_DESCENDING[_GUICtrlListViewGetSubItemsCount($Listview)]

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

    GUISetState(@SW_SHOW); Fenster sichtbar machen

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

    While 1
    Sleep(100)
    WEnd

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

    Func Beenden()
    $abr = MsgBox(36, "ScrabbleHelper", "Programm beenden?")
    If $abr = 6 then Exit; Benutzer hat 'Ja' angeklickt, also Programm beenden
    EndFunc

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

    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

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

    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

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

    Func Sort()
    _GUICtrlListViewSort($Listview, $B_DESCENDING, GUICtrlGetState($Listview))
    EndFunc

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

    Func GoogleSuche()
    $search = GUICtrlRead(@GUI_CtrlId)
    $search = StringLeft($search, StringInStr($search, "|")-1); Endung entfernen
    _IECreate("http://www.google.de/search?q=" & $search)
    EndFunc

    [/autoit]

    Vielleicht findet ja noch jemand Möglichkeiten zur Geschwindigkeits-Optimierung.

    MfG. Oscar

  • was es verschnellert:

    1) Die Anzeige der Suche entfernen. Sone graphische angabe ( zb 10/20000)
    dass jede millisekunde um xxxx erhöht wird bremst das Script extrem!
    Habs getestet, das sind enorme Geschwindigkeitsverbesserungen!

    2) Vorschläge: 1) Google link!
    Oft kommt es vor, dass man Wörter nicht kennt, die es aber gibt! :)
    also zb ganz rechts bei jedem wort einen link hinzufügen , der google öffnet und nach dem Wort sucht! :D

    • Offizieller Beitrag

    Hi,

    wie wäre es wenn du erstmal die Datei erstmal aufbereitest.

    Sortieren nach Länge.

    Dann brauchst du nicht immer gegen alle sondern nur gegen alle mit der richtigen Länge prüfen.

    Dann machst du einen regex ob die Buchstaben im Wort sind wenn ja dann anzeigen.

    So long,

    Mega

    • Offizieller Beitrag

    Hallo!

    @ Xenobiologist: Das Aufbereiten des Wörterbuchs ist mir auch schon in den Sinn gekommen. Ich werde mal alle Wörter rauslöschen, die weniger als 4 Buchstaben haben und die Wörter, die einen Bindestrich enthalten. Außerdem will ich das große Wörterbuch in 28 (eins für jeden Buchstaben) trennen und (Dein Vorschlag) die Wörter innerhalb jeder Datei nach Länge sortieren, das sollte beim suchen schon viel bringen.

    Mit regex steh ich irgendwie auf dem Kriegsfuß. Klappt das, wenn ich z.B. "ab" eingebe, dass regex mir nicht "abba" als Möglichkeit ausgibt?

    @huggy: Das mit der Anzeige ist mir schon klar. Nur wenn ein Programm so lange läuft und nix passiert, hab ich immer Angst, dass es hängt. ;)
    Aber mit obigen Änderungen werde ich wohl auch die Anzeige anpassen.
    Und die Idee mit dem Google-Link werde ich auch mal in Angriff nehmen.

    Vielen Dank euch Beiden.

    MfG. Oscar

  • warum machst du nicht einfach _IECreateEmbedded und suchst bei wikipedia nach den wörtern, habe mal schnell ein kleines skript gebastelt:

    Spoiler anzeigen
    [autoit]

    #include<IE.au3>
    Local $WikiSearch
    $oWikiSearch=_IECreate("http://www.wikipedia.de/",0,0)
    _IELoadWait($oWikiSearch)
    $oWikiSearchForm=_IEFormGetObjByName($oWikiSearch,"frmSearch")
    $oWikiSearchFormElement_Input=_IEFormElementGetObjByName($oWikiSearchForm,"txtSearch")
    _IEFormElementSetValue($oWikiSearchFormElement_Input,$DeinSuchwort)
    _IEFormSubmit($oWikiSearchForm)
    _IELoadWait($oWikiSearch)
    $WikiSource=_IEDocReadHTML ($oWikiSearch)
    If StringInStr($WikiSource,"Für deine Suchanfrage")<>0 Then
    $WikiSearch[1]=StringInStr($WikiSource,"Relevanz:",0,1)
    $WikiSearch[2]=StringLeft($WikiSource,$WikiSearch[1])
    $WikiSearch[3]=StringInStr($WikiSearch[2],'href="',0,-1)+5

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

    $WikiSearch[4]=StringTrimLeft($WikiSearch[2],StringLen($WikiSearch[2])-$WikiSearch[3])
    $WikiSearch[5]=StringInStr($WikiSearch[4],'"')
    $WikiSearch[6]=StringLeft($WikiSearch[4],$WikiSearch[5]-1)
    $WikiLink="http://de.wikipedia.org"&$WikiSearch[6]
    _IENavigate ($oWikiSearch, $WikiLink)
    EndIf
    $oIE.visible = 1

    [/autoit]


    Habe nichts geteste und das ganze im Forum geschrieben, also nicht wundern, wenn ein paar fehler drin sind....
    wahrscheinlich muss man noch bei dr if-abfrage was abändern...
    sollte soweit aber i.O sein

  • Warum sollte wikipedia besser sein als ein Wörterbuch? Zumal die Performance mit Sicherheit auch nicht die beste ist und das Ganze nicht mal an einem Rechner ohne Internetverbindung funktioniert (bei Scrabble-Spielen z.B. mit Notebook). Einfach die Abfragen aus dem Wörterbuch performanter machen und gut.

    • Offizieller Beitrag

    Hallo!

    teh_hahn: Die Performance ist mittlerweile recht gut, durch die vorgenommenen Änderungen. Mit dieser Geschwindigkeit bin ich schon zufrieden, wenn man bedenkt, dass es sich um eine Skriptsprache handelt.

    @JoEtHeKiLlEr: Eine Wikipedia-Abfrage halte ich für überflüssig, da bei der Googlesuche sowieso meist schon ein Wikipedia-Eintrag dabei ist.

    MfG. Oscar

  • Jetzt fehlt nur noch der Blanko-Stein, der für jeden Buchstaben steht. Ich habe da mal einfach das Leerzeichen genommen und die Suche geändert:
    Wenn ein Blankostein verwendet wird, müssen jedoch alle Wörterbücher durchsucht werden.

    Spoiler anzeigen
    [autoit]

    Func WortSuche()
    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
    $Input = StringUpper(GUICtrlRead($Buchstaben)); User-Buchstaben in Grossbuchstaben wandeln
    If $Input = "" Then Return
    $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]
    $blank = 0; Blankosteine zurücksetzen
    $BChars = "" ; Blankobuchstaben zurücksetzen
    $Temp = $aWoerter[$Woerterbuch][$Anz]; Aktuelles Wort in eine temporäre Variable
    If StringLen($Temp) <= $aInput[0] Then; prüfen, ob Wortlänge kleiner/gleich Anzahl der User-Buchstaben
    If StringInStr($Input, StringLeft($Temp, 1)) > 0 Or StringInStr($Input, " ") > 0 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
    If $aInput[$i] = " " Then $blank += 1
    Next
    If StringLen($HTemp) <= $blank Then
    $BChars = $HTemp
    $HTemp = ""
    EndIf
    If $HTemp = "" Then; wenn alle Buchstaben entfernt wurden, 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
    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
    Next
    $aTemp = StringSplit($BChars, ""); Blankobuchstaben in Buchstaben aufsplitten
    For $i = 1 To $aTemp[0]; alle Blankobuchstaben testen
    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 Blanko-Punkte aus der Liste subtrahieren
    EndIf
    Next
    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!")
    EndFunc

    [/autoit]

    2 Mal editiert, zuletzt von progandy (9. September 2007 um 18:43)

  • Hallo,

    reaktiviere den Thread wieder.

    Hab hier und bei Google gesucht aber nix passendes gefunden.

    Ich suche die Wörterbuch Datei, der Link oben geht nicht.

    Versuche ein Diktat-Programm für 1. Klasse zu schreiben, bei dem die bereits erlernten Buchstaben berücksichtigt werden und daraus sinnvolle Wörter gebildet werden.

    Aktuell sind es nicht viel Buchstaben und Worte, sodass ich ggf. Wörter in eine Datei schreiben kann, wollte mir die Arbeit jedoch sparen.

    Hab "igerman98" gefunden aber der muss unter Linux?? erstellt werden. Das übersteigt meine Möglichkeiten.

    Bin für Vorschläge offen, eine reine *.TxT wäre super ;)

    Gruß

  • Ich suche die Wörterbuch Datei, der Link oben geht nicht.

    Ohje, der Thread ist ja schon Jahre her. Die Datei muss ich irgendwann mal versehentlich vom Server gelöscht haben.

    Ich habe sie jetzt wieder hochgeladen. Der Link in Post #1 funktioniert nun wieder.

    Bin für Vorschläge offen, eine reine *.TxT wäre super

    Die Dateien im ZIP-Archiv haben zwar eine ".dic" Endung, sind aber reine Textdateien.