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.

(here a related interesting video: https://www.youtube.com/watch?v=ktkjUjcZid0 )

#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
Next
$iNdx = 0
For $i = 0 To (Int($iWinHeight / $iButtonYSide) - 1) * $iButtonYSide Step $iButtonYSide
    $aY[$iNdx] = $i
    $iNdx += 1
Next
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)
Next
GUISetState(@SW_SHOW)

; --- 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)
                    ExitLoop
                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
                    _EndOfGame()
            EndSwitch
        WEnd

        _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
                        EndIf
                        ; play a short ok sound
                        ; _WinAPI_PlaySound("FaxBeep", Null, BitOR($SND_ALIAS, $SND_ASYNC)) ; "SystemAsterisk"
                        $iNdx += 1 ; set index to next correct answer
                    Else
                        ; --------------------------
                        ;  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
                        Sleep(1500)
                        ; go to next step
                        ExitLoop 2
                    EndIf
                EndIf
            Next
        WEnd ; loop till end of match
        $score = Round($iMatchesWon / $iMatches * 100, 2) ; percentage
        Select
            Case $score < 80
                $sResult = "The chimp beat you!"
            Case $score > 80
                $sResult = "You beat the chimp!"
            Case $score = 80
                $sResult = "You tied the chimp."
        EndSelect
    Next ; next round
    ; game over?
Until MsgBox($MB_YESNO + $MB_ICONINFORMATION + $MB_TASKMODAL + $MB_SETFOREGROUND, _
        "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)
    _ArrayShuffle($aX)
    _ArrayShuffle($aY)
    ; 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)
    Next
    ; 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)
    Next
EndFunc   ;==>_SpreadControls

Func _GenerateQuiz($iNumElements)
    ; generate an array of required random numbers
    SRandom(@YEAR + @MON + @MDAY + @HOUR + @MIN + @SEC)
    Local $aTemp[$iNumElements]
    _ArrayShuffle($aNumbers)
    For $i = 0 To $iNumElements - 1
        $aTemp[$i] = $aNumbers[$i]
    Next
    _ArraySort($aTemp)
    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)
    Next
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)
    Next
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)
    Next
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
    EndIf
    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]
    Next
    Return $aTemp
EndFunc   ;==>__get_IDs_by_indexes

Func _EndOfGame()
    ; _WinAPI_PlaySound ("SystemExit" , Null, $SND_ALIAS)
    GUIDelete()
    Exit
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

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

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

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)

Link to post
Share on other sites

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

 

Stay healthy. 😷

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

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:

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

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

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

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.
Thanks

Edited by Chimp

 

image.jpeg.9f1a974c98e9f77d824b358729b089b0.jpeg Chimp

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

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 RTFC
      Please answer me these questions three, ere the other side you see:
      Are you running a 64-bit machine with a 64-bit Windows operating system? Can your AutoIt scripts cope with having directive #AutoIt3Wrapper_UseX64=Y, and thus @AutoItX64=True? Are you sick and tired of seeing this error message?
      If you (like me) answered "YES" to all three questions, then the _HighMem library may ease your pain (the name commemorates a useful utility from the days when CPUs were still steam-powered). Forget about pathetic boot switches /3GB and /userva; in a full-fledged 64-bit environment, _HighMem can pre-allocate all available physical/virtual RAM you've got (or any smaller size you need), and manage individual allocations therein with four simple functions:
      _HighMem_StartUp( $nSize, $sUnit="GB" ) ; parse size of total region to pre-allocate, e.g. (10,"GB") _HighMem_Allocate( $nSize, $sUnit="B" ) ; returns $pOffset (new allocation's base address) _HighMem_Release( $pOffset ) ; existing allocations are identified by their offset (base address) _HighMem_CleanUp() ; close handles, release all pre-allocated memory Of course, existing AutoIt limitations remain in force (e.g., DllstructCreate() is still limited to 2 GB per call), but the maximum of 2-4 GB of virtual memory per Windows process can (under the right circumstances, in the proper environment) be circumvented. However, this is the first beta release, so glitches are likely, and performance may vary. In fact, it may not work at all for you (if you're running 32-bit, for example). And since this involves your own hardware, it's unlikely I would be able to reproduce your issues in my own work environment. Nevertheless, if you find obvious bugs or mistakes in the code, please do post. And if it works for you, that's also good to hear. My own motivation for developing it was to supercharge my matrix computing environment (Eigen4AutoIt), so it can handle matrices of any size that fit in machine RAM.
      The attached zip contains the library itself (HighMem.au3) and two test examples. HighMem_Test1 performs a dry run stress test of the allocation management system; it does not actually do any memory I/O. By contrast, HighMem_Test2 pre-allocates a 6 GB space, stores 3 x 2GB structs there, performs some basic I/O, and releases the allocations one by one. Obviously, for this to work you'll need at least that much free RAM to begin with (check with Task Manager -> Performance -> Memory if you're unsure). My own test environment has 16 GB of physical RAM, and runs W10Pro/64.
      EDIT: minor edits added to improve user experience (many more status messages if $_HighMem_Verbose=True)
      HighMem.v0.85.7z
      EDIT: from beta version 0.9, HighMem supports shared memory, including mutex negotiation.
       
       
       
      HighMemv0.9.2.7z
    • By Gianni
      ... Surfing the net my eye fell on a device called "Divoom".
      It reminded me of a little toy I liked to play when I went to kindergarten (more than 55 years ago... ), it was called "Chiodini colorati".
      So I made this little script to emulate it, ...maybe some kids will have fun playing with it.

      The attached zip file contains the script and also some "pixel art" files ready to be loaded.
      P.S.
      Thanks to @KaFu for it's _WinSetClientSize() function and to @InunoTaishou for it's CaptureWindow() function (references are in the script)
      #include <WinAPISysWin.au3> #include <File.au3> #include <WindowsConstants.au3> #include <GDIPlus.au3> #cs ----------------------------------------- "Chiodini colorati" (colored thumb tacks) a little toy for the kids 16x16 pixel art sheet Programmed by Gianni Addiego - Italy December 2021 #ce ----------------------------------------- _Chiodini() Func _Chiodini() Local $aColors[16] = [0xffffff, 0xFF0000, 0xFF00FF, 0xFFC0CB, 0x964B00, 0xCD853F, 0xFF6600, 0xFFCC00, _ 0xFFFF00, 0xCCFF00, 0x00FF00, 0x228B22, 0x0000FF, 0x00FFFF, 0x7F7F7F, 0x000000] Local $iColor = $aColors[0], $sFileName, $aAzioni, $bOkToSave Local $aColori, $aChiodini, $GUIGetMsg, $hShowActiveColor Local $hGui = GUICreate("Chiodini colorati") $aColori = _GuiControlPanel("Button", 1, 16, 50, 20, 0, 0, 5, 0, 0, 1, True, "Colors") For $i = 1 To UBound($aColori) - 1 GUICtrlSetBkColor($aColori[$i], $aColors[$i - 1]) Next $aChiodini = _GuiControlPanel("Label", 16, 16, 20, 20, ($aColori[0])[11], 0, 3, 3, 1, 1, True, "") ; Local $aBackColors[UBound($aChiodini)] For $i = 1 To UBound($aChiodini) - 1 GUICtrlSetBkColor($aChiodini[$i], $iColor) $aBackColors[$i] = $iColor Next $iColor = $aColors[1] $aAzioni = _GuiControlPanel("Button", 4, 1, 80, 50, ($aColori[0])[11] + 0, ($aChiodini[0])[12], 0, 0, 5, 1, True, "") GUICtrlSetData($aAzioni[1], "Clear with color") GUICtrlSetData($aAzioni[2], "Load txt File") GUICtrlSetData($aAzioni[3], "Save txt File") GUICtrlSetData($aAzioni[4], "Save JPG") $hShowActiveColor = _GuiControlPanel('Label', 1, 1, 45, 30, 8, ($aColori[0])[12], 0, 0, 0, 0, True, "Active") GUICtrlSetBkColor($hShowActiveColor[1], $iColor) _WinSetClientSize($hGui, ($aChiodini[0])[11] + ($aColori[0])[11], ($aChiodini[0])[12] + ($aAzioni[0])[12]) ; GUISetState() ; --------- ; Main loop ; --------- While True $GUIGetMsg = GUIGetMsg() ; -------------------------------------------- ; scan all buttons to check if one was pressed ; -------------------------------------------- For $i = 1 To UBound($aColori) - 1 If $GUIGetMsg = $aColori[$i] Then $iColor = $aColors[$i - 1] GUICtrlSetBkColor($hShowActiveColor[1], $iColor) ContinueLoop 2 EndIf Next For $i = 1 To UBound($aChiodini) - 1 If $GUIGetMsg = $aChiodini[$i] Then GUICtrlSetBkColor($aChiodini[$i], $iColor) $aBackColors[$i] = $iColor ContinueLoop 2 EndIf Next Switch $GUIGetMsg Case $aAzioni[1] ; ----- Clear with color For $i = 1 To UBound($aChiodini) - 1 GUICtrlSetBkColor($aChiodini[$i], $iColor) $aBackColors[$i] = $iColor Next Case $aAzioni[2] ; ----- File Load $sFileName = FileOpenDialog("File to load", @ScriptDir, "Text files (*.txt)") If FileExists($sFileName) Then _FileReadToArray($sFileName, $aBackColors, $FRTA_NOCOUNT) For $i = 1 To UBound($aBackColors) - 1 GUICtrlSetBkColor($aChiodini[$i], $aBackColors[$i]) Next Else MsgBox(64, "Info", "File not found") EndIf Case $aAzioni[3] ; ----- File Save $sFileName = FileSaveDialog("File to save", @ScriptDir, "Text files (*.txt)") $bOkToSave = True If FileExists($sFileName) Then $bOkToSave = 6 = MsgBox(4 + 48, "warning", "File already exists, do you want overwrite it?") EndIf If $bOkToSave Then _FileWriteFromArray($sFileName, $aBackColors) EndIf Case $aAzioni[4] ; ----- Save image $sFileName = FileSaveDialog("Image name to save", @ScriptDir, "Image jpg (*.jpg)") $bOkToSave = True If FileExists($sFileName) Then $bOkToSave = 6 = MsgBox(4 + 48, "warning", "File already exists, do you want overwrite it?") EndIf If $bOkToSave Then CaptureWindow($sFileName, ($aChiodini[0])[13], ($aChiodini[0])[14], ($aChiodini[0])[15], ($aChiodini[0])[16], $hGui) EndIf EndSwitch If $GUIGetMsg = -3 Then Exit ; If 6 = MsgBox(4 + 32, "?", "Do you really want to quit?") Then Exit EndIf WEnd EndFunc ;==>_Chiodini ; #FUNCTION# ==================================================================================================================== ; Name...........: _GuiControlPanel v1.1 2021/12 ; Description ...: Creates a rectangular panel with adequate size to contain the required amount of controls ; and then fills it with the same controls by placing them according to the parameters ; Syntax.........: _GuiControlPanel( $ControlType, $nrPerLine, $nrOfLines, $ctrlWidth, $ctrlHeight, $xPos = 0, $yPos = 0, $xBorder, $yBorder, $xSpace = 1, $ySpace = 1) ; Parameters ....: $ControlType - Type of controls to be generated ("Button"; "Text"; ..... ; $nrPerLine - Nr. of controls per line in the matrix ; $nrOfLines - Nr. of lines in the matrix ; $ctrlWidth - Width of each control ; $ctrlHeight - Height of each control ; $xPanelPos - x Position of panel in GUI ; $yPanelPos - y Position of panel in GUI ; $xBorder - distance from lateral panel's borders to the matrix (width of left and right margin) default = 0 ; $yBorder - distance from upper and lower panel's borders to the matrix (width of upper and lower margin) default = 0 ; $xSpace - horizontal distance between the controls ; $ySpace - vertical distance between the controls ; $Group - if you want to group the controls (true or false) ; $sGrpTitle - title of the group (ignored if above is false) ; Return values .: an 1 based 1d array containing references to each control ; element [0] contains an 1d array containing various parameters about the panel ; Author ........: Gianni Addiego (Chimp) ; Modified.......: ; Remarks .......: ; Related .......: ; Link ..........: ; Example .......: ; =============================================================================================================================== Func _GuiControlPanel($ControlType, $nrPerLine, $nrOfLines, $ctrlWidth, $ctrlHeight, $xPanelPos = 0, $yPanelPos = 0, $xBorder = 0, $yBorder = 0, $xSpace = 1, $ySpace = 1, $Group = False, $sGrpTitle = "") Local Static $sAllowedControls = "|Label|Input|Edit|Button|CheckBox|Radio|List|Combo|Pic|Icon|Graphic|" If Not StringInStr($sAllowedControls, '|' & $ControlType & '|') Then Return SetError(1, 0, "Unkown control") Local $col, $row, $left, $top, $text Local $PanelWidth = (($ctrlWidth + $xSpace) * $nrPerLine) - $xSpace + ($xBorder * 2) Local $PanelHeight = (($ctrlHeight + $ySpace) * $nrOfLines) - $ySpace + ($yBorder * 2) Local $InnerXPos = $xPanelPos, $InnerYPos = $yPanelPos, $InnerWidth = $PanelWidth, $InnerHeight = $PanelHeight If $Group Then $PanelWidth += 2 $InnerXPos += 1 If $sGrpTitle = "" Then $InnerYPos += 7 $PanelHeight += 8 GUICtrlCreateGroup("", $xPanelPos, $yPanelPos, $PanelWidth, $PanelHeight) Else $InnerYPos += 15 $PanelHeight += 18 GUICtrlCreateGroup($sGrpTitle, $xPanelPos, $yPanelPos, $PanelWidth + 2, $PanelHeight) ; + 18) EndIf EndIf ; create the controls Local $aGuiGridCtrls[$nrPerLine * $nrOfLines + 1] Local $aPanelParams[17] = [ _ $ControlType, $nrPerLine, $nrOfLines, $ctrlWidth, $ctrlHeight, _ $xPanelPos, $yPanelPos, $xBorder, $yBorder, $xSpace, $ySpace, $PanelWidth, $PanelHeight, $InnerXPos, $InnerYPos, $InnerWidth, $InnerHeight] For $i = 0 To $nrPerLine * $nrOfLines - 1 ; coordinates 1 based $col = Mod($i, $nrPerLine) + 1 ; Vertical position within the grid (row) $iVtab $row = Int($i / $nrPerLine) + 1 ; Horizontal position within the grid (column) $iHtab $left = $InnerXPos + ((($ctrlWidth + $xSpace) * $col) - $xSpace) - $ctrlWidth + $xBorder $top = $InnerYPos + ((($ctrlHeight + $ySpace) * $row) - $ySpace) - $ctrlHeight + $yBorder $text = '' ; $i + 1 ; "*" ; "." ; "(*)" $aGuiGridCtrls[$i + 1] = Execute("GUICtrlCreate" & $ControlType & "($text, $left, $top, $ctrlWidth, $ctrlHeight)") Next If $Group Then GUICtrlCreateGroup("", -99, -99, 1, 1) ; close group $aGuiGridCtrls[0] = $aPanelParams Return $aGuiGridCtrls EndFunc ;==>_GuiControlPanel ; By kafu ; https://www.autoitscript.com/forum/topic/201524-guicreate-and-wingetclientsize-mismatch/?do=findComment&comment=1446141 Func _WinSetClientSize($hWnd, $iW, $iH) Local $aWinPos = WinGetPos($hWnd) Local $sRect = DllStructCreate("int;int;int;int;") DllStructSetData($sRect, 3, $iW) DllStructSetData($sRect, 4, $iH) _WinAPI_AdjustWindowRectEx($sRect, _WinAPI_GetWindowLong($hWnd, $GWL_STYLE), _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE)) WinMove($hWnd, "", $aWinPos[0], $aWinPos[1], _ $aWinPos[2] + (DllStructGetData($sRect, 3) - $aWinPos[2]) - DllStructGetData($sRect, 1), _ $aWinPos[3] + (DllStructGetData($sRect, 4) - $aWinPos[3]) - DllStructGetData($sRect, 2)) EndFunc ;==>_WinSetClientSize ; By InunoTaishou ; https://www.autoitscript.com/forum/topic/181655-redraw-your-desktop-with-gdi/?tab=comments#comment-1304386 Func CaptureWindow($sFileName = "", $iLeft = -1, $iTop = -1, $iWidth = -1, $iHeight = -1, $hWnd = WinGetHandle("[Active]"), $bClientArea = True) If (Not IsHWnd($hWnd)) Then $hWnd = WinGetHandle($hWnd) If (@error) Then Return SetError(1, 0, False) If (BitAND(WinGetState($hWnd), 16) = 16) Then Return SetError(2, 0, False) Local $iSrcWidth = 0 Local $iSrcHeight = 0 Local $tRectWindow = _WinAPI_GetWindowRect($hWnd) ; Get the absolute width, using Abs on all of the memembers because the [1] index of the struct may be negative, supports multiple monitors Local $iAbsWidth = Abs(Abs(DllStructGetData($tRectWindow, 3)) - Abs(DllStructGetData($tRectWindow, 1))) ; Get the absolute height, using Abs on all of the memembers because the [1] index of the struct may be negative, supports multiple monitors ; Subtracts the caption bar if $bClientArea only Local $iAbsHeight = Abs(Abs(DllStructGetData($tRectWindow, 4)) - Abs(DllStructGetData($tRectWindow, 2))) - ($bClientArea ? _WinAPI_GetSystemMetrics($SM_CYCAPTION) : 0) If ($iWidth = -1 Or $iWidth = 0 Or $iWidth = Default Or $iWidth > $iAbsWidth) Then $iWidth = $iAbsWidth If ($iHeight = -1 Or $iHeight = 0 Or $iHeight = Default Or $iHeight > $iAbsHeight) Then $iHeight = $iAbsHeight $iSrcWidth = $iAbsWidth $iSrcHeight = $iAbsHeight If ($iLeft = -1 Or $iLeft = Default) Then $iLeft = 0 If ($iTop = -1 Or $iTop = Default) Then $iTop = 0 Local $hDC = _WinAPI_GetWindowDC($hWnd) Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC) Local $hDestBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight) Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hDestBitmap) Local $hSrcDC = _WinAPI_CreateCompatibleDC($hDC) Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $iSrcWidth, $iSrcHeight) Local $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBmp) _WinAPI_PrintWindow($hWnd, $hSrcDC, True) _WinAPI_BitBlt($hDestDC, 0, 0, $iWidth, $iHeight, $hSrcDC, $iLeft, $iTop, $MERGECOPY) _WinAPI_SelectObject($hDestDC, $hDestSv) _WinAPI_SelectObject($hSrcDC, $hSrcSv) _WinAPI_ReleaseDC($hWnd, $hDC) _WinAPI_DeleteDC($hDestDC) _WinAPI_DeleteDC($hSrcDC) _WinAPI_DeleteObject($hBmp) $tPoint = 0 $tRectWindow = 0 $tDesktop = 0 If ($sFileName) Then _GDIPlus_Startup() Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hDestBitmap) _GDIPlus_ImageSaveToFile($hBitmap, $sFileName) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_Shutdown() EndIf ; Return $hDestBitmap EndFunc ;==>CaptureWindow  
      Chiodini.zip
    • By Barney
      From MiniMax to Machine Learning ... Tic Tac Toe is a good game for studying AI algorithm because it's simple!
      I use Tabular Q Learning to implement this game, Every time a game finished, it will use the Q function to update
      the score of each steps it played.
      Q(S,A) = Q(S,A) + α ∗ (γ ∗ maxaQ(S′,a) − Q(S,A))
      S being the current state, A the current action, S′ the state after doing A, α being the learning rate, γ being the
      discount factor,  and maxaQ(S′,a) the highest Q value of any move in the next state S′, i.e. the Q value of the best
      move in the following state.
      It's funny to see that it plays better and better. That's why people were charmed by Machine Learning!
      Thank you!
      Download: tic_tac_toe.zip

    • By Dan_555
      Hi, this is a Nonogram Game.
      It is compiled for windows in 32bit (64bit does not work as intended!), sourcecode in v3.3.14.5, icon and the required ini file with more than 100 puzzles.
      The Game has an built-in Editor, and can generate random playfields. 
    • By Barney
      Hi guys, I just finished a Connect 4 game by using MiniMax with Alpha Beta Pruning. I haven't written a program for a long time, but writing an
      AI program is always funny! I have to learn how the algorithm works and try to optimize the code to run faster. Let's play and have fun!
       

       

      Oops, I lost the game ...
      Thanks guys!
      Download: Connect 4.zip
×
×
  • Create New...