Google Trends - Spiel

  • Für mein Programm Surprise habe ich gestern ein Spiel geschrieben, welches die Daten von Google Trends verwendet. Man bekommt verschiedene Begriffe und muss sie in die Reihenfolge bringen, wie sie wohl am häufigsten gegooglet werden. Dann werden die richtigen Daten von Google Trends abgerufen und je richtiger man die Begriffe sortiert hat desto mehr Punkte gibt es.

    Programm
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <Array.au3>

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

    ;Maximal 6 Begriffe pro Gruppe
    Global $Words[15] = ["Aldi,Lidl|DE|A", _
    "Walmart,Aldi,Lidl,Carrefour|W|A", _
    "Tisch,Stuhl,Bett|DE|12", _
    "Mercedes,Volkswagen,Toyota,Porsche,General Motors|W|12", _
    "Google,Yahoo,Bing|W|A", _
    "Samsung,Apple,Sony,LG|W|A", _
    "der Nutella,das Nutella,die Nutella|DE|A", _
    "9gag,4chan,reddit,webfail|W|A", _
    "Germany,France,USA,Spain|W|A", _
    "drogen kaufen,virus erstellen,bank ausrauben|DE|A", _
    "Berlin,München,Köln,Hamburg|DE|A", _
    "Hose,Pullover,Hemd,Shirt|DE|A", _
    "Füller,Bleistift,Kugelschreiber|DE|A", _
    "2002,2003,2004,2005|W|12", _
    "Apfel,Birne,Orange,Banane|DE|A"]
    Global $Label[1], $Button[1][2], $History[1], $Current[1], $LabelBar[1]

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

    $GUIWordStart = 80
    $GUIWordDiff = 25

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

    $Form1 = GUICreate("Was ist trendiger? (Daten von Google Trends)", 386, 295)
    $Label1 = GUICtrlCreateLabel("Ordne die Begriffe nach der Anzahl der Suchen bei Google absteigend sortiert:", 8, 8, 373, 17)
    $Label2 = GUICtrlCreateLabel("", 8, 32, 300, 17)
    GUICtrlSetFont(-1, 8.5, 800)
    $Label4 = GUICtrlCreateLabel("Oft gesucht", 16, 56, 59, 17)
    GUICtrlSetColor(-1, 0xAAAAAA)
    $Label5 = GUICtrlCreateLabel("Selten gesucht", 16, 104, 75, 17)
    GUICtrlSetColor(-1, 0xAAAAAA)
    $Button1 = GUICtrlCreateButton("Überprüfen", 8, 128, 100, 25, $BS_DEFPUSHBUTTON)
    GUICtrlSetState(-1, $GUI_FOCUS)
    $Label6 = GUICtrlCreateLabel("Punkte: 0" & @CRLF & "Runde 1/5", 296, 32, 81, 33, $SS_RIGHT)
    $Button2 = GUICtrlCreateButton("Abbrechen", 304, 264, 75, 25)
    GUISetState(@SW_SHOW)

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

    $NewRound = True
    $Round = 0
    $Points = 0
    $MaxPoints = 0
    $Games = 0

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

    While 1
    If $NewRound = True Then ;Neue Wörter laden
    If $Round = 0 And UBound($History)-1+5 > UBound($Words) Then
    MsgBox(16, "Fehler", "Du kannst leider nicht noch mal spielen, da es leider nicht mehr genügend Wortgruppen gibt, die noch nicht vorkamen.")
    $NewRound = False
    ContinueLoop
    EndIf
    If UBound($Words) <= UBound($History) - 1 Then
    MsgBox(16, "Fehler", "Es gibt keine Wörter mehr, die noch nicht vorkamen")
    Exit
    EndIf

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

    $Round += 1
    GUICtrlSetData($Label6, "Punkte: " & $Points & @CRLF & "Runde: " & $Round & "/5")
    GUICtrlSetState($Button1, $GUI_DISABLE)

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

    ;Zufällige Wortgruppe die man noch nicht hatte
    While 1
    $Random = Random(0, UBound($Words) - 1, 1)
    If UBound($History) > 1 Then
    For $i = 1 To UBound($History) - 1
    If $Random = Int($History[$i]) Then
    ContinueLoop 2
    EndIf
    Next
    EndIf
    ExitLoop
    WEnd
    _ArrayAdd($History, $Random)
    $WordGroup = $Words[$Random]
    $Parameter = StringSplit($WordGroup, "|")
    $Word = StringSplit($Parameter[1], ",", 2)
    _ArrayShuffle($Word)
    ;GUI aktualisieren
    ReDim $Label[UBound($Word)]
    ReDim $Button[UBound($Word)][2]
    For $i = 0 To UBound($Word)-1
    $Label[$i] = GUICtrlCreateLabel($Word[$i], 8, $GUIWordStart + $i * $GUIWordDiff, 80, 17)
    $Button[$i][0] = GUICtrlCreateButton("Rauf", 90, ($GUIWordStart + $i * $GUIWordDiff) - 3, 30, 20)
    If $i = 0 Then GUICtrlSetState(-1, $GUI_DISABLE)
    $Button[$i][1] = GUICtrlCreateButton("Runter", 120, ($GUIWordStart + $i * $GUIWordDiff) - 3, 40, 20)
    If $i = UBound($Word)-1 Then GUICtrlSetState(-1, $GUI_DISABLE)
    Next
    GUICtrlSetPos($Label5, 16, $GUIWordStart + ($i-1) * $GUIWordDiff + 24)
    GUICtrlSetPos($Button1, 16, $GUIWordStart + ($i-1) * $GUIWordDiff + 48)
    $Location = "Weltweit"
    If $Parameter[2] = "DE" Then $Location = "Deutschland"
    $Time = "Seit 2004"
    If $Parameter[3] = "12" Then $Time = "In den letzten 12 Monaten"
    GUICtrlSetData($Label2, $Location & " - " & $Time)
    ;Aktuelle Anordnung speichern
    ReDim $Current[UBound($Word)]
    For $i = 0 To UBound($Word) - 1
    $Current[$i] = $i
    Next
    ;Richtige Werte von Google Trends ermitteln
    $Geo = ""
    If $Parameter[2] = "DE" Then $Geo = "&geo=DE"
    $Date = ""
    If $Parameter[3] = "12" Then $Date = "&date=today 12-m"
    $Q = ""
    For $i = 0 To UBound($Word)-1
    $Q &= URLEncode(StringLower($Word[$i])) & "%2C"
    Next
    $Q = StringTrimRight($q, 3)
    $TrendsData = BinaryToString(InetRead("http://www.google.com/trends/trendsReport?hl=de&q="&$Q&$Geo&$Date&"&cmpt=q&content=1", 1))
    $Averages = StringRegExp($TrendsData, ',\["Durchschnitt",(.*?)\]\]', 3)
    If @error Then
    MsgBox(16, "Fehler", "Google Trends-Daten konnten nicht erfasst werden :(")
    Exit
    EndIf
    $Average = StringSplit($Averages[0], ",", 2)

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

    $NewRound = False
    $Results = False
    GUICtrlSetState($Button1, $GUI_ENABLE)
    EndIf

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

    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE,$Button2
    Exit
    Case $Button1 ;Überprüfen / Nächste Runde
    If $Results = False Then
    ;Balken anzeigen
    ReDim $LabelBar[UBound($Word)]
    $Max = _ArrayMax($Average, 1)
    $PointsNow = 0
    $Last = $Max
    For $i = 0 To UBound($Word)-1
    If $i = 0 Then
    If Int($Average[$Current[$i]]) = $Last Then $PointsNow += 1
    Else
    If Int($Average[$Current[$i]]) <= $Last Then $PointsNow += 1
    EndIf
    $Last = Int($Average[$Current[$i]])
    $Percent = Round(100 / $Max * $Average[$Current[$i]])
    $LabelBar[$i] = GUICtrlCreateLabel($Percent & "%", 165, $GUIWordStart + $i * $GUIWordDiff, $Percent * 2 + 1, 13)
    GUICtrlSetBkColor(-1, 0x4444ff)
    GUICtrlSetColor(-1, 0xffffff)
    Next
    $Points += $PointsNow
    $Label3 = GUICtrlCreateLabel("Punkte in dieser Runde: " & $PointsNow, 125, $GUIWordStart + ($i-1) * $GUIWordDiff + 53)
    GUICtrlSetData($Label6, "Punkte: " & $Points & @CRLF & "Runde: " & $Round & "/5")
    If $Round < 5 Then
    GUICtrlSetData($Button1, "Nächte Runde")
    Else
    GUICtrlSetData($Button1, "Nochmal spielen")
    If $Points > $MaxPoints Then $MaxPoints = $Points
    Sleep(1000)
    MsgBox(64, "Herzlichen Glückwunsch", "Herzlichen Glückwunsch, du hast " & $Points & " Punkte erreicht!")
    EndIf
    $Results = True
    Else
    For $i = 0 To UBound($Word) - 1
    GUICtrlDelete($Label[$i])
    GUICtrlDelete($LabelBar[$i])
    GUICtrlDelete($Button[$i][0])
    GUICtrlDelete($Button[$i][1])
    Next
    GUICtrlDelete($Label3)
    GUICtrlSetData($Button1, "Überprüfen")
    $NewRound = True
    If $Round >= 5 Then
    $Round = 0
    $Points = 0
    $Games += 1
    EndIf
    EndIf
    EndSwitch

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

    For $i = 0 To UBound($Word) - 1 ;Reihenfolge ändern
    If $nMsg = $Button[$i][0] Then
    $Tmp = $Current[$i-1]
    $Current[$i-1] = $Current[$i]
    $Current[$i] = $Tmp
    GUICtrlSetData($Label[$i-1], $Word[$Current[$i-1]])
    GUICtrlSetData($Label[$i], $Word[$Current[$i]])
    ElseIf $nMsg = $Button[$i][1] Then
    $Tmp = $Current[$i+1]
    $Current[$i+1] = $Current[$i]
    $Current[$i] = $Tmp
    GUICtrlSetData($Label[$i+1], $Word[$Current[$i+1]])
    GUICtrlSetData($Label[$i], $Word[$Current[$i]])
    EndIf
    Next
    WEnd

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

    Func _ArrayShuffle(ByRef $aArray)
    $n = UBound($aArray) - 1
    While $n > 1
    $k = Random(0, $n - 1, 1)
    $tmp = $aArray[$n]
    $aArray[$n] = $aArray[$k]
    $aArray[$k] = $tmp
    $n -= 1
    WEnd
    Return True
    EndFunc ;==>_ArrayShuffle

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

    Func URLEncode($urlText)
    $urlText = StringReplace($urlText, "ä", "%C3%A4")
    $urlText = StringReplace($urlText, "ö", "%C3%B6")
    $urlText = StringReplace($urlText, "ü", "%C3%BC")
    $urlText = StringReplace($urlText, "ß", "%C3%9F")
    Return $urlText
    EndFunc

    [/autoit]


    Viel Spaß!

    Leider friert das Fenster immer kurz ein während die richtigen Daten abgerufen werden.
    Ich habe bislang nur 15 Wortgruppen, d.h. man kann das Spiel 3 Mal spielen wenn sich die Wörter nicht wiederholen sollen. Da mir die Ideen ausgehen dürft ihr gerne noch mehr Wortgruppen vorschlagen, am besten gleich im richtigen Format, also

    Code
    "Begriff1,Begriff2,...,BegriffN|W|A", _

    Begriffe durch ein Komma trennen, Groß- /Kleinschreibung/Leerzeichen innerhalb des Begriffes sind egal, W steht für Weltweit und DE für Deutschland, A für den gesamten Zeitraum (seit 2004) und 12 für die letzten 12 Monate. Beispiele stehen ja im Skript. Möglichst immer zwischen 3 und 6 Begriffen. Vielen Dank ;)