Reaktionstest

  • Hallo, ich stehe vor einem Problem.

    Ich bin gerade dabei einen Reaktionstest zu scripten.
    Vorgegebene Bilder lassen sich schon Random aus einem Ordner anzeigen, meine Abfrage ist noch nicht richtig.

    Der Ablauf: Ich bekomme random ein Bild angezeigt (Kreis oder Rechteck), dann wartet das script auf eine Eingabe (taste "r" für rechteck oder taste "k" für kreis), danach macht es eine Abfrage ob die eingabe dem gesehen Bild entspricht. Danach soll das nächste Bild angezeigt werden. (Optional - das habe ich noch nicht drin - soll es eine ausgabe geben, wieviele aktuell richtig bzw falsch waren - damit wurde aber noch nicht begonnen)

    Das Problem: Ich müsste hellsehen koennen um richtig zu liegen :/
    Das wild wird angezeigt, aber die eingabe prüft schon das nächste Bild (was ich noch gar nicht sehe) und nicht das aktuelle. Ich hab schon lange dran gesessen aber ich finde den fehler nicht und bitte nun hilfe. (Grundsätzlich ist die ausgabe richtig / falsch aber korrekt.)

    Die Bilder lieg im Ordner "Bilder" - ich habe alles nochmal als anhang beigepackt.

    Dank im Voraus.

    Hier das Script:

    Spoiler anzeigen

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>

    GUICreate("reaktionstest", 500, 500)
    $files = _FileListToArray("Bilder", "*.bmp", 1)

    GUICtrlCreatePic(@ScriptDir & "\Bilder\kreis01.bmp", 60, 60, 350, 350)

    GUISetState()
    _main()


    Func _main()

    _ladebild()

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    Case HotKeySet ("{r}", "WEITER_rechteck")

    Case HotKeySet ("{k}", "WEITER_kreis")

    EndSwitch

    WEnd

    EndFunc

    func WEITER_rechteck()

    $bild = $files[$randomarr[Floor(340 / 340)]]

    Select
    Case $bild = "rechteck01.bmp" Or $bild = "rechteck02.bmp" Or $bild = "rechteck03.bmp"
    MsgBox(0,0, "Richtig")
    Case $bild = "kreis01.bmp" Or $bild = "kreis02.bmp" Or $bild = "kreis03.bmp"
    MsgBox(0,0, "Falsch")
    EndSelect

    _main()

    EndFunc


    func WEITER_kreis()

    $bild = $files[$randomarr[Floor(340 / 340)]]

    Select
    Case $bild = "kreis01.bmp" Or $bild = "kreis02.bmp" Or $bild = "kreis03.bmp"
    MsgBox(0,0, "Richtig")
    Case $bild = "rechteck01.bmp" Or $bild = "rechteck02.bmp" Or $bild = "rechteck03.bmp"
    MsgBox(0,0, "Falsch")
    EndSelect

    _main()

    EndFunc


    Func _random()

    Global $randomarr[1]

    While True
    If UBound($randomarr) = UBound($files) Then ExitLoop
    $r = Random(1, $files[0], 1)
    If _ArraySearch($randomarr, $r) = -1 Then _ArrayAdd($randomarr, $r)
    WEnd

    EndFunc

    func _ladebild()
    _random()
    GUICtrlCreatePic(@ScriptDir & "\Bilder\" & $files[$randomarr[Floor(340 / 340)]], 60, 60, 350, 350)
    EndFunc

    Einmal editiert, zuletzt von sedativade (19. September 2009 um 13:21)

  • Mal ein paar Konstruktive Kritiken:

    Die Hotkeysets würde ich am Anfang hinmachen und nicht mit nem Cas in der Schleife verpackt, dann sollte es glaub ich auch nicht einfach weiter machen. Ausserdem würde ich einfach mit nem Random z.b. jedes mal wenn eines geschafft wurde per Zufall 1 od 2 (od sowas halt) ermitteln lassen, und dann, je nachdem was raus gekommen is, das jeweilige Bild laden.

    Hier mal so wie ich das meine:

    Spoiler anzeigen
    [autoit]

    while 1
    sleep(50)
    wend

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

    func WEITER_rechteck()
    Hier deine Funktion eben, will sie jetzt nicht tippen^^
    _random()
    endfunc

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

    func WEITER_Kreis()
    auch weider deine Funktion
    _random()
    endfunc

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

    func _random()
    $wert=random(0,1,1)
    If $wert=0 then
    ein rechteck hinmalen
    else
    nen Kreis nazeigen
    endif
    endfunc

    [/autoit]

    Hoffe du kannst dir Vorstellen wie ich das meine, ich hab dir aber nicht alles gemacht, damit dir nicht fad wird^^

    Mfg

    Computers are like Airconditioning. They don´t work with open Windows.

  • Ich hatte das "random()" bzw "ladebild()" schon in der abfrage nach dem tastendruck, leider ohne erfolg.

    die random funktion habe ich mich aus anderen scripten zusammengebastelt, da ich mich noch nicht weiter mit dem random befehl auseinadergesetzt habe, kann ich deinen vorschlag leider nicht umsetzen, und irgenwo muss ich ja mitgeben, welches bild ein kreis und welches ein rechteck ist, ich denke nicht, das was mir hilft das in der randomfunktion auseinander zu kambüsern. oder ich steh gerade auf dem schlauch und weiss nicht fenau was du meinst :x

  • Hallo sedativade,

    hier die geänderte Version, musst du noch testen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>

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

    $hGUI = GUICreate("reaktionstest", 500, 500)
    $files = _FileListToArray("Bilder", "*.bmp", 1)

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

    $hbild = GUICtrlCreatePic(@ScriptDir & "\Bilder\kreis01.bmp", 60, 60, 350, 350)

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

    GUISetState()
    _main()

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

    Func _main()

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

    _ladebild()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case HotKeySet("{r}", "WEITER_rechteck")

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

    Case HotKeySet("{k}", "WEITER_kreis")

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

    EndSwitch

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

    WEnd

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

    EndFunc ;==>_main

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

    Func WEITER_rechteck()

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

    $bild = $files[$randomarr[Floor(340 / 340)]]

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

    Select
    Case $bild = "rechteck01.bmp" Or $bild = "rechteck02.bmp" Or $bild = "rechteck03.bmp"
    MsgBox(0, $bild, "Richtig", 0, $hGUI)
    Case $bild = "kreis01.bmp" Or $bild = "kreis02.bmp" Or $bild = "kreis03.bmp"
    MsgBox(0, $bild, "Falsch", 0, $hGUI)
    EndSelect
    _main()

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

    EndFunc ;==>WEITER_rechteck

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

    Func WEITER_kreis()

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

    $bild = $files[$randomarr[Floor(340 / 340)]]

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

    Select
    Case $bild = "kreis01.bmp" Or $bild = "kreis02.bmp" Or $bild = "kreis03.bmp"
    MsgBox(0, $bild, "Richtig", 0, $hGUI)
    Case $bild = "rechteck01.bmp" Or $bild = "rechteck02.bmp" Or $bild = "rechteck03.bmp"
    MsgBox(0, $bild, "Falsch", 0, $hGUI)
    EndSelect
    _main()

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

    EndFunc ;==>WEITER_kreis

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

    Func _random()

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

    Global $randomarr[1]

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

    While True
    If UBound($randomarr) = UBound($files) Then ExitLoop
    $r = Random(1, $files[0], 1)
    If _ArraySearch($randomarr, $r) = -1 Then _ArrayAdd($randomarr, $r)
    WEnd

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

    EndFunc ;==>_random

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

    Func _ladebild()
    _random()
    GUICtrlDelete($hbild)
    $hbild = GUICtrlCreatePic(@ScriptDir & "\Bilder\" & $files[$randomarr[Floor(340 / 340)]], 60, 60, 350, 350)
    EndFunc ;==>_ladebild

    [/autoit]

    und hier eine 2. Version (etwas kürzer):

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <GUIConstantsEx.au3>
    Global $Bild, $hBild = 0

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

    $hGUI = GUICreate("reaktionstest", 500, 500)

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

    $hRechteck = GUICtrlCreateButton("&Rechteck", 10, 10, 140)
    $hKreis = GUICtrlCreateButton("&Kreis", 200, 10, 140)

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

    GUISetState()
    _main()

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

    Func _main()
    _ladebild()
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $hRechteck
    If StringUpper(StringLeft($Bild, 1)) = "R" Then
    MsgBox(0, $Bild, "Richtig", 0, $hGUI)
    Else
    MsgBox(0, $Bild, "Falsch", 0, $hGUI)
    EndIf
    _ladebild()
    Case $hKreis
    If StringUpper(StringLeft($Bild, 1)) = "K" Then
    MsgBox(0, $Bild, "Richtig", 0, $hGUI)
    Else
    MsgBox(0, $Bild, "Falsch", 0, $hGUI)
    EndIf
    _ladebild()
    EndSwitch

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

    WEnd
    EndFunc ;==>_main

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

    Func _ladebild()
    Local $iMaxNr = 3
    $iName = Random(0, 1, 1)
    If $iName = 0 Then
    $Bild = "Rechteck"
    Else
    $Bild = "Kreis"
    EndIf
    $iNr = Random(1, 3, 1)
    Switch $iNr
    Case 1 To 9
    $Bild = $Bild & "0" & $iNr
    Case 10 To 99
    $Bild = $Bild & $iNr
    EndSwitch
    $Bild = $Bild & ".bmp"
    ;ConsoleWrite("LadeBild :" & $Bild & @CRLF)
    if $hbild <> 0 Then GUICtrlDelete($hBild)
    $hbild = GUICtrlCreatePic(@ScriptDir & "\Bilder\" & $Bild, 60, 60, 350, 350)
    EndFunc ;==>_ladebild

    [/autoit]

    Edit: in beiden Versionen noch die MSGBOXen verändert, so dass sie immer im Vordergrund sind. Deine Version ruft immer wieder Main auf, ist eigentlich unnötig, aber ohne klappt's nicht (könnte Probleme geben)

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (19. September 2009 um 00:05)

  • Super, vielen dank.
    das "GUICtrlDelete($hbild)" hatte gefehl, ich hattes auch schon drin mit "GUICtrlDelete($files[$randomarr[Floor(340 / 340)]])", und an der stelle hatte ich den kompletten pfad nicht drin *auf den kopf hau*.

    Danke dir. :)