Jump to content

Recommended Posts

After watching this movie (https://www.youtube.com/watch?v=cPiDHXtM0VA) I wanted to try the test to see how much i could compete with that chimpanzee so i created this script.
well, actually passing that test is a lot harder than it sounds. With the difficulty set to seven numbers and a display time of one second, I can only remember 2 or 3 numbers ... (what a disappointment)
I can only do better if I reduce the slider to 5 numbers and increase the storage time to 2 seconds (the easyest level), a very poor performance. That chimpanzee is great.
The script offers you a sequence of 10 random quizzes. At the end it gives you the percentage of your "level". The chimpanzee resolves on average 8 out of 10 (80%), so you can compare your performance to that of the chimpanzee.
How to play:

  1. Run the script. At the beginning there are 2 sliders at the bottom of the screen where you can set the difficulty level by varying the memorization time and the amount of numbers to memorize as you like. After setting the difficulty, click the circle on the bottom left to get started.
  2. after the first move the sliders are no longer displayed until the next game, (the game lasts 10 attempts, there is a progress bar at the bottom of the screen to see where you are)
  3. between one test and the other of the ten, click on the circle to move on to the next test

have fun.

#include <GUIConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <WinAPIMisc.au3>

; HotKeySet("{ESC}", "_EndOfGame")
Global $iNumbersToGuess = 7, $iExpositionTime = 1000, $iMatches = 10, $iMatchesWon
Global $aNumbers[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Global $aButtons[10], $aControls[5]

Global $iWinWidth = @DesktopWidth / 2, $iWinHeight = @DesktopHeight / 2, $iButtonXSide = Int($iWinWidth / UBound($aNumbers)), $iButtonYSide = Int($iWinHeight / UBound($aNumbers)), $sWinTitle = "Beat the Chimp"
Global $aX[Int($iWinWidth / $iButtonXSide)], $aY[Int($iWinHeight / $iButtonYSide)], $iNdx = 0, $aPoints[3], $score, $GUIGetMsg, $iDockHeight = 50, $iProgrssHeight = 5
For $i = 0 To (Int($iWinWidth / $iButtonXSide) - 1) * $iButtonXSide Step $iButtonXSide
    $aX[$iNdx] = $i
    $iNdx += 1
$iNdx = 0
For $i = 0 To (Int($iWinHeight / $iButtonYSide) - 1) * $iButtonYSide Step $iButtonYSide
    $aY[$iNdx] = $i
    $iNdx += 1
Global Const $iDockLeftBorder = 200, $iForeColor = 0xFFFFFF, $iBackColor = 0x000000
Global $hGUI = GUICreate($sWinTitle, $iWinWidth, $iWinHeight + $iDockHeight + $iProgrssHeight, @DesktopWidth / 4, @DesktopHeight / 5)
GUISetBkColor($iBackColor, $hGUI)

; the circle to continue playing
$aControls[0] = GUICtrlCreateLabel(ChrW(0x25EF), 0, $iWinHeight + 1, 100, $iDockHeight, 0x01)
; GUICtrlSetTip(-1, "Click the circle," & @CRLF & "then click the squares" & @CRLF & "in numeric order.")
GUICtrlSetFont(-1, 24, 900)
GUICtrlSetColor(-1, $iForeColor)
GUICtrlSetBkColor(-1, $iBackColor)

; slider for the amount of numbers to guess
$aControls[2] = GUICtrlCreateSlider($iDockLeftBorder, $iWinHeight, $iWinWidth - $iDockLeftBorder, Int($iDockHeight / 2))
GUICtrlSetLimit(-1, 10, 5) ; 5 steps 5 (easy) to 10 (hard)
GUICtrlSetData(-1, $iNumbersToGuess)
; label for the amount of quizzes
$aControls[1] = GUICtrlCreateLabel("Numbers   : " & GUICtrlRead($aControls[2]), 100, $iWinHeight + 1, 100)
GUICtrlSetColor(-1, $iForeColor)

; slider for the exposition time
$aControls[4] = GUICtrlCreateSlider($iDockLeftBorder, $iWinHeight + (Int($iDockHeight / 2)), $iWinWidth - $iDockLeftBorder, $iDockHeight / 2)
GUICtrlSetLimit(-1, 8, 1) ; 8 steps (0f 250ms each)
GUICtrlSetData(-1, $iExpositionTime / 250)
; label for the exposition time
$aControls[3] = GUICtrlCreateLabel("ms to show : " & GUICtrlRead($aControls[4]) * 250, 100, $iWinHeight + 1 + (Int($iDockHeight / 2)), 100)
GUICtrlSetColor(-1, $iForeColor)

; progress bar of the match
Global $idProgressbar = GUICtrlCreateProgress(0, $iWinHeight + $iDockHeight, $iWinWidth, $iProgrssHeight)

; Create buttons
For $i = 0 To 9
    $aButtons[$i] = GUICtrlCreateLabel($i + 1, $iWinWidth + 5, $iWinHeight + $iDockHeight + $iProgrssHeight + 5, $iButtonXSide, $iButtonYSide, 0x01)
    GUICtrlSetFont($aButtons[$i], 24)
    GUICtrlSetColor($aButtons[$i], $iForeColor)
    GUICtrlSetBkColor($aButtons[$i], $iBackColor)

; --- Main loop ---
Do ; New game
    $iMatchesWon = 0
    GUICtrlSetData($idProgressbar, 0)
    For $iRound = 1 To $iMatches ; the game lasts $iMatches rounds
        $iNdx = 0 ; reset pointer (index to the next correct answer)
        _HideControls(__get_IDs_by_indexes($aButtons, $aNumbers)) ; remove the numbers from the screen
        ; show the dock and wait (only in the first round are also shown the sliders)
        _ShowControls($iRound = 1 ? $aControls : $aControls[0])  ; display the dock's control(s)
        While 1
            Switch GUIGetMsg()
                Case $aControls[0] ; The circle (play a new quiz)
                Case $aControls[2] ; slider to choose how many numbers to guess
                    $iNumbersToGuess = GUICtrlRead($aControls[2])
                    GUICtrlSetData($aControls[1], "Numbers    : " & $iNumbersToGuess)
                Case $aControls[4] ; slider to choose how long (milliseconds) to show the numbers
                    $iExpositionTime = GUICtrlRead($aControls[4]) * 250 ; 8 steps of 250 milliseconds each
                    GUICtrlSetData($aControls[3], "ms to show : " & $iExpositionTime)
                Case $GUI_EVENT_CLOSE

        _HideControls($aControls) ; hide the dock
        Sleep(750) ; wait a bit
        $aQuiz = _GenerateQuiz($iNumbersToGuess) ; generate random elements to guess
        _SpreadControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; scatter the numbers on the GUI
        _ShowControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; display the numbers

        Sleep($iExpositionTime) ; leave numbers visible for a short time
        _MaskControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; mask the numbers
        GUICtrlSetData($idProgressbar, Round($iRound / $iMatches * 100))
        ; _ShowControls(__get_IDs_by_indexes($aButtons, $aQuiz)) ; <------------- keep numbers visible FOR DEBUG PURPOSE ONLY!
        While 1 ; wait for a move
            $GUIGetMsg = GUIGetMsg()
            If $GUIGetMsg = $GUI_EVENT_CLOSE Then _EndOfGame()
            ; scan all quiz buttons to check if one was pressed
            For $i = 0 To UBound($aQuiz) - 1 ; $aButtons) - 1
                If $GUIGetMsg = $aButtons[$aQuiz[$i] - 1] Then
                    If $i = $iNdx Then
                        ; --------------------------
                        ;  actions for a right move
                        ; --------------------------
                        ; hide the guessed number
                        _HideControls($aButtons[$aQuiz[$i] - 1])
                        ; ---------------------------------
                        ;  check if this round is complete
                        ; ---------------------------------
                        If $iNdx = (UBound($aQuiz) - 1) Then
                            _WinAPI_PlaySound("SystemExclamation", Null, BitOR($SND_ALIAS, $SND_ASYNC))
                            $iMatchesWon += 1
                            ExitLoop 2
                        ; play a short ok sound
                        ; _WinAPI_PlaySound("FaxBeep", Null, BitOR($SND_ALIAS, $SND_ASYNC)) ; "SystemAsterisk"
                        $iNdx += 1 ; set index to next correct answer
                        ; --------------------------
                        ;  actions for a wrong move
                        ; --------------------------
                        ; show all the right sequence
                        _ShowControls(__get_IDs_by_indexes($aButtons, $aQuiz))
                        _WinAPI_PlaySound("DeviceFail", Null, BitOR($SND_ALIAS, $SND_ASYNC))
                        ; give a little time to the user to control it
                        ; go to next step
                        ExitLoop 2
        WEnd ; loop till end of match
        $score = Round($iMatchesWon / $iMatches * 100, 2) ; percentage
            Case $score < 80
                $sResult = "The chimp beat you!"
            Case $score > 80
                $sResult = "You beat the chimp!"
            Case $score = 80
                $sResult = "You tied the chimp."
    Next ; next round
    ; game over?
        "Game over", _
        "You got " & $score & "% correct." & @CRLF & _
        "Ayumu averages 80% correct." & @CRLF & $sResult & @CRLF & @CRLF & _
        "do you want to try again?") <> 6

Func _SpreadControls($aTemp)
    ; place the required numbers scattered on the GUI
    SRandom(@YEAR + @MON + @MDAY + @HOUR + @MIN + @SEC)
    ; first, place all buttons out of GUI
    For $i = 0 To UBound($aButtons) - 1
        GUICtrlSetPos($aButtons[$i], $iWinWidth + 5, $iWinHeight + $iDockHeight + $iProgrssHeight + 5)
        GUICtrlSetState($aButtons[$i], $GUI_DISABLE)
    ; Then place only the numbers of this quiz in visible area
    For $i = 0 To UBound($aTemp) - 1
        GUICtrlSetPos($aTemp[$i], $aX[$i], $aY[$i])
        GUICtrlSetState($aTemp[$i], $GUI_ENABLE)
EndFunc   ;==>_SpreadControls

Func _GenerateQuiz($iNumElements)
    ; generate an array of required random numbers
    SRandom(@YEAR + @MON + @MDAY + @HOUR + @MIN + @SEC)
    Local $aTemp[$iNumElements]
    For $i = 0 To $iNumElements - 1
        $aTemp[$i] = $aNumbers[$i]
    Return $aTemp
EndFunc   ;==>_GenerateQuiz

Func _ShowControls($aTemp)
    ; render controls visible (and enabled)
    $aTemp = _EnforceArray($aTemp)
    For $i = 0 To UBound($aTemp) - 1
        GUICtrlSetState($aTemp[$i], $GUI_SHOW)
        GUICtrlSetColor($aTemp[$i], $iForeColor)
        GUICtrlSetBkColor($aTemp[$i], $iBackColor)
EndFunc   ;==>_ShowControls

Func _MaskControls($aTemp)
    ; mask the controls
    $aTemp = _EnforceArray($aTemp)
    For $i = 0 To UBound($aTemp) - 1
        GUICtrlSetColor($aTemp[$i], $iForeColor)
        GUICtrlSetBkColor($aTemp[$i], $iForeColor)
EndFunc   ;==>_MaskControls

Func _HideControls($aTemp)
    ; hide the controls (implies disable)
    $aTemp = _EnforceArray($aTemp)
    For $i = 0 To UBound($aTemp) - 1
        GUICtrlSetState($aTemp[$i], $GUI_HIDE)  ; $GUI_DISABLE)
        ; GUICtrlSetColor($aButtons[$aTemp[$i] - 1], $iBackColor)
        ; GUICtrlSetBkColor($aButtons[$aTemp[$i] - 1], $iBackColor)
EndFunc   ;==>_HideControls

Func _EnforceArray($vParam)
    ; if only one value is passed, turn it into an array of only 1 element
    If Not IsArray($vParam) Then
        Local $aTemp[1] = [$vParam]
        Return $aTemp
    Return $vParam
EndFunc   ;==>_EnforceArray

Func __get_IDs_by_indexes(ByRef $aCtrls, ByRef $aNdxs)
    ; returns the handles of the controls pointed to by the indexes
    Local $aTemp[UBound($aNdxs)]
    For $i = 0 To UBound($aNdxs) - 1
        $aTemp[$i] = $aCtrls[$aNdxs[$i] - 1]
    Return $aTemp
EndFunc   ;==>__get_IDs_by_indexes

Func _EndOfGame()
    ; _WinAPI_PlaySound ("SystemExit" , Null, $SND_ALIAS)
EndFunc   ;==>_EndOfGame

P.S. At this link (https://web.archive.org/web/20131006161544/http://games.lumosity.com/chimp.html) there is a Flash version of this game.

Edited by Chimp
added link of a flash version

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post

Link to post
Share on other sites

Ayumu is exceptionnally good at it. We have zero chance of surviving the 210ms hurdle a few times.

This wonderful site allows debugging and testing regular expressions (many flavors available). An absolute must have in your bookmarks.
Another excellent RegExp tutorial. Don't forget downloading your copy of up-to-date pcretest.exe and pcregrep.exe here
RegExp tutorial: enough to get started
PCRE v8.33 regexp documentation latest available release and currently implemented in AutoIt beta.

SQLitespeed is another feature-rich premier SQLite manager (includes import/export). Well worth a try.
SQLite Expert (freeware Personal Edition or payware Pro version) is a very useful SQLite database manager.
An excellent eBook covering almost every aspect of SQLite3: a must-read for anyone doing serious work.
SQL tutorial (covers "generic" SQL, but most of it applies to SQLite as well)
A work-in-progress SQLite3 tutorial. Don't miss other LxyzTHW pages!
SQLite official website with full documentation (may be newer than the SQLite library that comes standard with AutoIt)

Share this post

Link to post
Share on other sites
22 hours ago, jchd said:

Ayumu is exceptionnally good at it. We have zero chance of surviving the 210ms hurdle a few times.

...I don't even survive 2000ms with ten numbers... :wacko:

19 hours ago, UEZ said:

No chance against a photographic memory even if it is a chimp. 


Stay healthy. 😷

I have noticed it! :muttley:

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post

Link to post
Share on other sites

Fun game, but 5 numbers with 1000 ms is too easy.

Scripts & functions Organize Includes Let Scite organize the include files

Yahtzee The game "Yahtzee" (Kniffel, DiceLion)

LoginWrapper Secure scripts by adding a query (authentication)

_RunOnlyOnThis UDF Make sure that a script can only be executed on ... (Windows / HD / ...)

Internet-Café Server/Client Application Open CD, Start Browser, Lock remote client, etc.

MultipleFuncsWithOneHotkey Start different funcs by hitting one hotkey different times

Share this post

Link to post
Share on other sites
On 9/8/2020 at 2:34 PM, Xenobiologist said:

Fun game, but 5 numbers with 1000 ms is too easy.

good performance!, but the ultimate goal is 10 numbers in 250 milliseconds... :P

Seriously, I would like to ask a speech therapist (? Or some other specialist?) if this type of test can be useful to check if a person have dyslexia problems?
Is there any doctor reading this post?
.... just out of curiosity.

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By gwinter
      Just something I made to auto-collect Gil from FFCC and to test out a new templating system for AutoIt. The templating system is a work in progress, but it is meant to be a companion to AutoIT, which automates creation of GUI, buttons, scripts, templates, etc. It also has built-in chat and group-collaboration, an asset management system and online library for resources.
    • By n0ktar
      is it possible to make a wall chams in rainbow six siege using autoit scripts? tell me please and how . 
    • By ManualIT
      Guys, i need help on creating a script that restarts a program once it starts using more than 1GB of memory.
      No idea how to start on the script, i don't know which functions i should use for process memory reading.
      My mind is in total blank at the moment, so i need a kick start
    • By Pricehacker
      Im wondering if it is possible to 'empty' the variable value to save memory, for example i often use variable as a onetime use thing and would prefer to 'forget' it after is is used
      Maybe it is just as easy as to setting $vVar = Null, but i wanted to make sure that this is the case
    • By CarlD
      Is there a reliable way to ensure that data assigned to variables in a script is overwritten or deleted when the script exits? I have scripts that encrypt/decrypt data and would like to ensure, if possible, that the encryption keys and decrypted data do not stay in memory after the script exits. Thanks.
  • Create New...