• Dieses Programm ist eigentlich ein Bestandteil meines Programmes "Surprise!". Ich plane, in unregelmäßigen Abständen einzelne Programme von dort seperat vorzustellen, die ich besonders gut finde, um sie mit der Menschheit zu teilen oder Verbesserungsvorschläge zu bekommen.

    Mir war mal die Idee für ein Spiel eingefallen, dass man auf einer zufälligen Wikipedia-Seite startet und dann mit möglichst wenig Klicks auf verlinkte Artikel zu einem Ziel kommen muss. Also habe ich das mal umgesetzt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>

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

    Dim $Ziele[16]=["Berlin","Schleswig-Holstein","Internet","2006","DDR","ARD","Angela_Merkel","Japan","Zweiter_Weltkrieg","Bonn","Computerspiel","Kirche","2012","Los_Angeles","Film","Fernsehen"]
    $Ziel=$Ziele[Random(0,UBound($Ziele)-1,1)]

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

    $oIE=_IECreateEmbedded()
    $56Form1 = GUICreate("Wikipedia-Run", 622, 445, Default, Default, $WS_OVERLAPPEDWINDOW)
    $56Label1 = GUICtrlCreateLabel("Gelange mit so wenigen Klicks wie möglich von einem Wikipedia-Artikel mit Hilfe der Links zu einem anderen Wikipedia-Artikel. Die Suchfunktion zu benutzen ist natürlich verboten.", 8, 8, 616, 17)
    GUICtrlSetResizing(-1,$GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKTOP+$GUI_DOCKHEIGHT)
    $56Label2 = GUICtrlCreateLabel("Von:", 8, 32, 26, 17)
    GUICtrlSetResizing(-1,$GUI_DOCKALL)
    $56Label3 = GUICtrlCreateLabel("Zufällig...", 40, 32, 147, 17)
    GUICtrlSetResizing(-1,$GUI_DOCKALL)
    GUICtrlSetFont(-1, 9, 800)
    $56Label4 = GUICtrlCreateLabel("Nach:", 200, 32, 33, 17)
    GUICtrlSetResizing(-1,$GUI_DOCKALL)
    $56Label5 = GUICtrlCreateLabel("", 240, 32, 165, 17)
    GUICtrlSetResizing(-1,$GUI_DOCKALL)
    GUICtrlSetFont(-1, 9, 800)
    GUICtrlSetData(-1,StringReplace($Ziel,"_"," "))
    $56Label6 = GUICtrlCreateLabel("Klicks: 0", 8, 416, 50, 17)
    GUICtrlSetResizing(-1,64+2+$GUI_DOCKSIZE)
    GUICtrlSetFont(-1, 9, 800)
    $56Button1 = GUICtrlCreateButton("Beenden", 520, 416, 91, 25)
    GUICtrlSetResizing(-1,$GUI_DOCKBOTTOM+$GUI_DOCKRIGHT+$GUI_DOCKSIZE)
    $56Obj1=GUICtrlCreateObj($oIE,8,50,606,360)
    GUICtrlSetResizing(-1,$GUI_DOCKBORDERS)
    WinMove($56Form1,"",(@DesktopWidth*0.2)/2,(@DesktopHeight*0.2)/2,@DesktopWidth*0.8,@DesktopHeight*0.8)
    GUISetState(@SW_SHOW)

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

    _IENavigate($oIE, "http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite",1)
    $PageOpen=TimerInit()
    $Focus=True
    $LastURL=_IEPropertyGet($oIE,"locationurl")
    $PageName=StringRegExp($LastURL,"wiki\/(.*?)\Z",3)
    GUICtrlSetData($56Label3,StringReplace($PageName[0],"_"," "))
    GUICtrlSetState($56Obj1,$GUI_FOCUS)

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

    $Klicks=0
    While 1
    If $Focus=True Then
    If TimerDiff($PageOpen)>=900 Then
    GUICtrlSetState($56Obj1,$GUI_FOCUS)
    $Focus=False
    EndIf
    EndIf
    $URL=_IEPropertyGet($oIE,"locationurl")
    If $URL<>$LastURL Then
    $Klicks+=1
    GUICtrlSetData($56Label6,"Klicks: "&$Klicks)
    $PageName=StringRegExp($URL,"wiki\/(.*?)\Z",3)
    If @error Then
    MsgBox(16,"Toll gemacht... -.-","Bitte bleibe auf den Artikelseiten von Wikipedia!")
    _IENavigate($oIE, $LastURL)
    $PageOpen=TimerInit()
    $Focus=True
    GUICtrlSetState($56Obj1,$GUI_FOCUS)
    ContinueLoop
    EndIf
    If StringLower($PageName[0])=StringLower($Ziel) Then
    Sleep(1000)
    If 7 = MsgBox(68,"Wikipedia-Run","Sehr gut! Du hast es nach "&$Klicks&" Klicks geschafft, das Ziel zu erreichen." & @CRLF & @CRLF & "Nochmal spielen?") Then Exit
    ;Und nochmal
    $Ziel=$Ziele[Random(0,UBound($Ziele)-1,1)]
    GUICtrlSetData($56Label5,StringReplace($Ziel,"_"," "))
    $Klicks=-1
    GUICtrlSetData($56Label6,"Klicks: "&$Klicks)
    _IENavigate($oIE, "http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite",1)
    $PageOpen=TimerInit()
    $Focus=True
    $LastURL=_IEPropertyGet($oIE,"locationurl")
    $PageName=StringRegExp($LastURL,"wiki\/(.*?)\Z",3)
    GUICtrlSetData($56Label3,StringReplace($PageName[0],"_"," "))
    GUICtrlSetState($56Obj1,$GUI_FOCUS)
    EndIf
    $LastURL=$URL
    EndIf
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Sleep(50)
    WEnd

    [/autoit]


    Das Problem ist, dass die IE-UDF scheinbar ziemlich verbuggt ist. Schon bei geringen Änderungen im Code wird bei mir das ganze IE-Fenster weiß und außerdem laggt es sehr. Eigentlich würde ich nämlich gerne noch einbauen, dass man nicht die Suchfunktion verwenden kann und dass man nicht auf "Zufälliger Artikel" klicken kann. Also wenn jemand einen Lösungsansatz hat: Nur her damit! Auch kann ich noch gut Ideen für Ziel-Artikel gebrauchen, es ist nämlich ziemlich schwer, nicht so schwere Artikel zu finden.

    btw habe ich mittlerweile gehört, dass es so etwas mit Wikipedia-Artikeln bereits als echten Wettbewerb gibt.

  • Gefällt mir sehr gut!

    Es ist informativ, innovativ und lehrreich.
    So wusste ich z.B. noch nicht dass die US Stadt Springfield die Hauptstadt von Illinois ist :)

    Weiter so. Ne Online Rangliste wäre sicher auch super.

  • Hi Luke4321,

    diese Idee finde ich echt witzig. :D

    Was mir jedoch auffällt:

    Wenn man auf den "Beenden"-Button (unten rechts) klickt, passiert nichts.
    Das könntest du vielleicht noch ändern.... ;)

    Ansonsten echt gut!

    MfG Xenon

  • Hast du die Idee zu diesem Spiel selbst gehabt? Gefällt mir sehr gut. Von "Corna Imagna" nach Berlin in 2 Klicken und "Full Mouth Disinfection" nach Computerspiel in 7 Klicks :). Ich bin schon fast süchtig :D.
    Es wäre natürlich sehr nett, wenn die Ziele nicht vorgegeben im Code wären, sondern automatisch (wie der Startartikel) gewählt werden würden. Auch interessant wäre es, wenn die Links, die man benutzt hat mitgespeichert werden, sodass man diese Freunden oder so als Beweis geben kann.

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von AntiSpeed (28. Juni 2013 um 14:56)

  • Vielen Dank für das Feedback. Die Idee hatte ich selber, nur wie ich geschrieben hab war ich nicht der einzige mit der Idee. Das Programm hatte ich trotzdem schon bevor ich von den Anderen wusste.
    Ein globaler Highscore ist immer ein bisschen blöd wenn jeder den Quellcode lesen kann und dann irgendwelche Ergebnisse fälschen.
    Ein zufälligen Artikel als Ziel ist fast unmöglich, die Begriffe sind momentan ja relativ häufig und das ist trotzdem schon schwer genug, finde ich^^.


    Edit: 100. Post! :D

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <IE.au3>

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

    Opt('GUIOnEventMode', 1)
    $Ziel = _GetZufall()
    $oIE = _IECreateEmbedded()
    $56Form1 = GUICreate("Wikipedia-Run", 622, 445, Default, Default, $WS_OVERLAPPEDWINDOW)
    $56Label1 = GUICtrlCreateLabel("Gelange mit so wenigen Klicks wie möglich von einem Wikipedia-Artikel mit Hilfe der Links zu einem anderen Wikipedia-Artikel. Die Suchfunktion zu benutzen ist natürlich verboten.", 8, 8, 616, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    $56Label2 = GUICtrlCreateLabel("Von:", 8, 32, 26, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    $56Label3 = GUICtrlCreateLabel("Zufällig...", 40, 32, 147, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetFont(-1, 9, 800)
    $56Label4 = GUICtrlCreateLabel("Nach:", 200, 32, 33, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    $56Label5 = GUICtrlCreateLabel("", 240, 32, 165, 17)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUICtrlSetFont(-1, 9, 800)
    GUICtrlSetData(-1, StringReplace($Ziel, "_", " "))
    $56Label6 = GUICtrlCreateLabel("Klicks: 0", 8, 416, 50, 17)
    GUICtrlSetResizing(-1, 64 + 2 + $GUI_DOCKSIZE)
    GUICtrlSetFont(-1, 9, 800)
    $56Button1 = GUICtrlCreateButton("Beenden", 520, 416, 91, 25)
    GUICtrlSetResizing(-1, $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT + $GUI_DOCKSIZE)
    $56Obj1 = GUICtrlCreateObj($oIE, 8, 50, 606, 360)
    GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
    WinMove($56Form1, "", (@DesktopWidth * 0.2) / 2, (@DesktopHeight * 0.2) / 2, @DesktopWidth * 0.8, @DesktopHeight * 0.8)
    GUISetState(@SW_SHOW)
    GUISetOnEvent(-3, 'EVENT', $56Form1)
    GUICtrlSetOnEvent($56Button1, 'EVENT')
    _IENavigate($oIE, "http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite", 1)
    $PageOpen = TimerInit()
    $Focus = True
    $LastURL = _IEPropertyGet($oIE, "locationurl")
    $PageName = StringRegExp($LastURL, "wiki\/(.*?)\Z", 3)
    GUICtrlSetData($56Label3, StringReplace($PageName[0], "_", " "))
    GUICtrlSetState($56Obj1, $GUI_FOCUS)
    $Klicks = 0

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

    While Sleep(50)
    If $Focus = True Then
    If TimerDiff($PageOpen) >= 900 Then
    GUICtrlSetState($56Obj1, $GUI_FOCUS)
    $Focus = False
    EndIf
    EndIf
    $URL = _IEPropertyGet($oIE, "locationurl")
    If $URL <> $LastURL Then
    $Klicks += 1
    GUICtrlSetData($56Label6, "Klicks: " & $Klicks)
    $PageName = StringRegExp($URL, "wiki\/(.*?)\Z", 3)
    If @error Then
    MsgBox(16, "Toll gemacht... -.-", "Bitte bleibe auf den Artikelseiten von Wikipedia!")
    _IENavigate($oIE, $LastURL)
    $PageOpen = TimerInit()
    $Focus = True
    GUICtrlSetState($56Obj1, $GUI_FOCUS)
    ContinueLoop
    EndIf
    If StringLower($PageName[0]) = StringLower($Ziel) Then
    Sleep(1000)
    If 7 = MsgBox(68, "Wikipedia-Run", "Sehr gut! Du hast es nach " & $Klicks & " Klicks geschafft, das Ziel zu erreichen." & @CRLF & @CRLF & "Nochmal spielen?") Then Exit
    ;Und nochmal
    $Ziel = _GetZufall()
    GUICtrlSetData($56Label5, StringReplace($Ziel, "_", " "))
    $Klicks = -1
    GUICtrlSetData($56Label6, "Klicks: " & $Klicks)
    _IENavigate($oIE, "http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite", 1)
    $PageOpen = TimerInit()
    $Focus = True
    $LastURL = _IEPropertyGet($oIE, "locationurl")
    $PageName = StringRegExp($LastURL, "wiki\/(.*?)\Z", 3)
    GUICtrlSetData($56Label3, StringReplace($PageName[0], "_", " "))
    GUICtrlSetState($56Obj1, $GUI_FOCUS)
    EndIf
    $LastURL = $URL
    EndIf
    WEnd

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

    Func _GetZufall()
    Local $oIE = _IECreateEmbedded(), $a = GUICreate('Suchen...', 256, 256), $b = GUICtrlCreateObj($oIE, 0, 0, 256, 256)
    GUISetState()
    _IENavigate($oIE, "http://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite", 1)
    Local $Ziel = _IEPropertyGet($oIE, "locationurl")
    GUIDelete($a)
    Return _GetName($Ziel)
    EndFunc ;==>_GetZufall

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

    Func _GetName($sURL)
    Local $a = StringSplit($sURL, '/')
    Return $a[$a[0]]
    EndFunc ;==>_GetName

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

    Func EVENT()
    Switch @GUI_CtrlId
    Case -3, $56Button1
    Exit
    EndSwitch
    EndFunc ;==>EVENT

    [/autoit]

    Ein kleiner Umbau und man kann bei beliebigen Seiten landen.
    Warum das oIE so unglaublich langsam ist weiß ich nicht...

  • Dale Hohm hat eine neue Version der IE UDF gepostet. Vielleicht hilft die.

  • Das gäbe eine ganz schön grosse liste!
    Da in Computer ja nicht (jedenfalls hier) in der Lage ist nach themen zu kategorisieren oder schlüsse zu ziehen müsste man einfach mit inet_get sämtliche Links auflisten, und danach diese wieder nach Links durchsuchen, usw usw und mit dem Ziel Artikel abgleichen.

    Gleiche Methode könnte man verwenden um Ziel Artikel zu definieren.
    Zufälliger Artikel auswählen. Random 1-10 = tiefer der verlinkungen,
    Danach alle Links aus dem Text filtern und mit random einen auswählen, dies so weiter bis die anzahl erreicht ist.

    So würde man zwar immer genau so viel clicks brauchen wie die tiefe der verlinkung ist, wenn man alles richtig schafft, aber man merkt das wohl eh nicht.

    Do könnte man auch Ranglisten erstellen. Kategorien mässig, für 10 verlinkungen tief, 5 tief und 3 tief.
    Wobei es dann wirklich ziemlich glücks abhängig wäre, was für einen Artikel man erwischt.

  • 5 Klicks von "Georges Darien" nach Bonn :/
    11 Klicks von Wortgrenze nach Fernsehen, au au au :D Aber auch nur weil in jedem F* Artikel zum fernsehen das "Fernsehen" nicht gelinkt war... erst beim "Musikvideo" (wtf?!), dabei war ich schon beim "sowjetischen Fernsehen" X(
    [Blockierte Grafik: http://i.epvpimg.com/Bhu9h.png] - Bug? Musste dann DDR in der Suchleiste eingeben...
    €: Hatte schon wieder die DDR als Ziel, gleicher Bug :/

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

    2 Mal editiert, zuletzt von Xorianator (8. Oktober 2013 um 13:42)

  • [autoit]

    Func Random($nMin, $nMax, $bInt)
    Return 1
    EndFunc

    [/autoit]

    3x DDR hintereinander passiert mit (1/16)^3 = 2,44%