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
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Array.au3>
;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]
$GUIWordStart = 80
$GUIWordDiff = 25
$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)
$NewRound = True
$Round = 0
$Points = 0
$MaxPoints = 0
$Games = 0
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
$Round += 1
GUICtrlSetData($Label6, "Punkte: " & $Points & @CRLF & "Runde: " & $Round & "/5")
GUICtrlSetState($Button1, $GUI_DISABLE)
;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)
$NewRound = False
$Results = False
GUICtrlSetState($Button1, $GUI_ENABLE)
EndIf
$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
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
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
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
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
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