Jump to content

Plastic Sliding Squares Puzzle v1.01


Recommended Posts

Remember when you were a kid (if you are as ancient as I) and there were these cheap plastic puzzles of sliding squares that you were suppose to get in the right order?

Well this is that ;)

Enjoy

Posted Image

Version 1.01

Cosmetic and Platform changes

Plastic Sliding Puzzle.au3

Edited by Topher

[left][hr]

$mood = "whimsy"
$mode = "confused"
$randomChaos = True
Do
Something()
Until $Tired
[/left][left]Reflex (Arcade game)[/left][left]IX (Board game)[/left][left]The Word Game (Word game)[/left][left]Plastic Sliding Squares Puzzle (Puzzle)[/left]
Link to post
Share on other sites

Wow, great game! Reminds me when I was young too.

Great implementation! Took me 168 moves - I know I'm a bit rusty ;)

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to post
Share on other sites

Thank you.

When my score passes 16 or so I've so badly messed it up that I never get it. So I am impressed.

[left][hr]

$mood = "whimsy"
$mode = "confused"
$randomChaos = True
Do
Something()
Until $Tired
[/left][left]Reflex (Arcade game)[/left][left]IX (Board game)[/left][left]The Word Game (Word game)[/left][left]Plastic Sliding Squares Puzzle (Puzzle)[/left]
Link to post
Share on other sites

As I recall there were only <edit>15</edit> slats in the square puzzles I ever solved Posted Image

In my mind it was so clearly a 5x5 grid, but in looking for a picture to turn into an icon they were all as you said 4x4.

[left][hr]

$mood = "whimsy"
$mode = "confused"
$randomChaos = True
Do
Something()
Until $Tired
[/left][left]Reflex (Arcade game)[/left][left]IX (Board game)[/left][left]The Word Game (Word game)[/left][left]Plastic Sliding Squares Puzzle (Puzzle)[/left]
Link to post
Share on other sites

I remember that I had two of these puzzles. One was 4x4 and the other was 4x6 or even 4x7.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to post
Share on other sites

Nice!

Eukalyptus made some similar with pictures.

You need a picture with 440x440 pixels.

#include <GUIConstantsEx.au3>
#include <Array.au3>
#include <File.au3>
#include <GDIPlus.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

Opt("GUIOnEventMode", 1)
Global $iTile = 0, $iSize, $hLabel[5][5], $aField[5][5][3]
Global $aFiles = _FileListToArray(@ScriptDir, "*.jpg", 1)
_ArrayCombine($aFiles, _FileListToArray(@ScriptDir, "*.bmp", 1))
_ArrayCombine($aFiles, _FileListToArray(@ScriptDir, "*.tif", 1))
_ArrayCombine($aFiles, _FileListToArray(@ScriptDir, "*.gif", 1))
_ArrayCombine($aFiles, _FileListToArray(@ScriptDir, "*.png", 1))
If Not IsArray($aFiles) Or $aFiles[0] < 1 Then
    MsgBox(0, "Error", "No pics found")
    Exit
EndIf
_GDIPlus_Startup()
Global $hImage, $iWidth, $iHeight
Global $hPenWhite = _GDIPlus_PenCreate(0x44FFFFFF, 2)
Global $hPenBlack = _GDIPlus_PenCreate(0x44000000, 2)
Global $hBrushBK = _GDIPlus_BrushCreateSolid(0xFF6C99B4)
Global $hGui = GUICreate("SchiebePuzzle", 452, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
GUISetOnEvent($GUI_EVENT_RESTORE, "_ReDraw")
GUISetBkColor(0x6C99B4)
GUICtrlCreateLabel("", 4, 4, 444, 444)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x558097)
GUICtrlCreateLabel("", 6, 6, 442, 442)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x88B8D8)
GUICtrlCreateLabel("", 6, 6, 440, 440)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetBkColor(-1, 0x6C99B4)
GUICtrlCreateLabel("Anzahl der Felder:", 10, 468, 90, 20)
Global $hInput = GUICtrlCreateInput(3, 100, 465, 30, 20, $ES_READONLY)
GUICtrlCreateUpdown(-1)
GUICtrlSetLimit(-1, 5, 2)
GUICtrlSetOnEvent(-1, "_SetTile")
GUICtrlCreateButton("Mischen", 160, 465, 80, 20)
GUICtrlSetOnEvent(-1, "_Randomize")
GUICtrlCreateButton("Neues Bild", 260, 465, 80, 20)
GUICtrlSetOnEvent(-1, "_LoadRandomImage1")
GUICtrlCreateButton("Beenden", 360, 465, 80, 20)
GUICtrlSetOnEvent(-1, "_Exit")
GUISetState()
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
GUIRegisterMsg($WM_PAINT, '_Redraw')
_LoadRandomImage()
_SetTile()

While 1
    Sleep(100)
WEnd

Func _MoveField()
    Local $iX, $iY, $iNX, $iNY, $iDir
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            If $hLabel[$i][$j] = @GUI_CtrlId Then
                $iX = $i
                $iY = $j
                ExitLoop 2
            EndIf
        Next
    Next
    If $aField[$iX][$iY][2] <> 2 Then Return
    $iNX = $iX
    $iNY = $iY
    Select
        Case $iX > 0 And $aField[$iX - 1][$iY][2] = 0
            $iNX = $iX - 1
            $iDir = 1
        Case $iX < $iTile - 1 And $aField[$iX + 1][$iY][2] = 0
            $iNX = $iX + 1
            $iDir = 2
        Case $iY > 0 And $aField[$iX][$iY - 1][2] = 0
            $iNY = $iY - 1
            $iDir = 3
        Case $iY < $iTile - 1 And $aField[$iX][$iY + 1][2] = 0
            $iNY = $iY + 1
            $iDir = 4
    EndSelect
    For $i = 0 To $iSize Step 5
        Switch $iDir
            Case 1
                _DrawField($iX, $iY, -$i, 0)
            Case 2
                _DrawField($iX, $iY, $i, 0)
            Case 3
                _DrawField($iX, $iY, 0, -$i)
            Case 4
                _DrawField($iX, $iY, 0, $i)
        EndSwitch
        Sleep(10)
    Next
    $aField[$iNX][$iNY][0] = $aField[$iX][$iY][0]
    $aField[$iNX][$iNY][1] = $aField[$iX][$iY][1]
    $aField[$iNX][$iNY][2] = $aField[$iX][$iY][2]
    $aField[$iX][$iY][2] = False
    GUICtrlSetBkColor($hLabel[$iX][$iY], 0x6C99B4)
    _DrawField($iNX, $iNY)
    _SetFreeField()
EndFunc   ;==>_MoveField
Func _LoadRandomImage1()
    _WinAPI_RedrawWindow($hGui)
    _LoadRandomImage()
    _ReDraw()
EndFunc   ;==>_LoadRandomImage1

Func _LoadRandomImage($Orig = False)
    Local $iRandom = Random(1, $aFiles[0], 1)
    If $iRandom = 0 Or $aFiles[0] = 1 Then $iRandom = 1
    If $Orig = False Then $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "" & $aFiles[$iRandom])
    $iWidth = _GDIPlus_ImageGetWidth($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage)
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            GUICtrlSetCursor($hLabel[$i][$j], 2)
            $aField[$i][$j][0] = $i * $iSize
            $aField[$i][$j][1] = $j * $iSize
            $aField[$i][$j][2] = 1
        Next
    Next
    $aField[0][0][2] = 0
    $aField[1][0][2] = 2
    $aField[0][1][2] = 2
    GUICtrlSetCursor($hLabel[1][0], 0)
    GUICtrlSetCursor($hLabel[0][1], 0)
EndFunc   ;==>_LoadRandomImage
Func _Randomize()
    GUIRegisterMsg($WM_PAINT, '')
    Local $iX = 0, $iY = 0, $iNX, $iNY, $iDir
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            If $aField[$i][$j][2] = 0 Then
                $iX = $i
                $iY = $j
                ExitLoop 2
            EndIf
        Next
    Next
    For $c = 1 To 500
        Do
            $iNX = $iX
            $iNY = $iY
            $iDir = Random(1, 4, 1)
            Select
                Case $iDir = 2 And $iX > 0
                    $iNX = $iX - 1
                Case $iDir = 1 And $iX < $iTile - 1
                    $iNX = $iX + 1
                Case $iDir = 4 And $iY > 0
                    $iNY = $iY - 1
                Case $iDir = 3 And $iY < $iTile - 1
                    $iNY = $iY + 1
            EndSelect
        Until $iX <> $iNX Or $iY <> $iNY
        $aField[$iX][$iY][0] = $aField[$iNX][$iNY][0]
        $aField[$iX][$iY][1] = $aField[$iNX][$iNY][1]
        $aField[$iX][$iY][2] = $aField[$iNX][$iNY][2]
        $aField[$iNX][$iNY][2] = False
        GUICtrlSetBkColor($hLabel[$iNX][$iNY], 0x6C99B4)
        _DrawField($iX, $iY)
        $iX = $iNX
        $iY = $iNY
    Next
    _ReDraw()
    _SetFreeField()
    GUIRegisterMsg($WM_PAINT, '_Redraw')
EndFunc   ;==>_Randomize
Func _SetFreeField()
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            GUICtrlSetCursor($hLabel[$i][$j], 2)
            If $aField[$i][$j][2] <> 0 Then $aField[$i][$j][2] = 1
        Next
    Next
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            If $aField[$i][$j][2] = False Then
                If $i > 0 Then
                    GUICtrlSetCursor($hLabel[$i - 1][$j], 0)
                    $aField[$i - 1][$j][2] = 2
                EndIf
                If $i < $iTile - 1 Then
                    GUICtrlSetCursor($hLabel[$i + 1][$j], 0)
                    $aField[$i + 1][$j][2] = 2
                EndIf
                If $j > 0 Then
                    GUICtrlSetCursor($hLabel[$i][$j - 1], 0)
                    $aField[$i][$j - 1][2] = 2
                EndIf
                If $j < $iTile - 1 Then
                    GUICtrlSetCursor($hLabel[$i][$j + 1], 0)
                    $aField[$i][$j + 1][2] = 2
                EndIf
            EndIf
        Next
    Next
EndFunc   ;==>_SetFreeField

Func _DrawField($x, $y, $iOX = 0, $iOY = 0)
    If $aField[$x][$y][2] = False Then Return
    Local $iX = $aField[$x][$y][0]
    Local $iY = $aField[$x][$y][1]
    Switch True
        Case $iOX > 0
            _GDIPlus_GraphicsFillRect($hGraphics, 6 + $x * $iSize, 6 + $y * $iSize, $iOX, $iSize, $hBrushBK)
        Case $iOX < 0
            _GDIPlus_GraphicsFillRect($hGraphics, 6 + $x * $iSize + $iSize + $iOX, 6 + $y * $iSize, -$iOX, $iSize, $hBrushBK)
        Case $iOY > 0
            _GDIPlus_GraphicsFillRect($hGraphics, 6 + $x * $iSize, 6 + $y * $iSize, $iSize, $iOY, $hBrushBK)
        Case $iOY < 0
            _GDIPlus_GraphicsFillRect($hGraphics, 6 + $x * $iSize, 6 + $y * $iSize + $iSize + $iOY, $iSize, -$iOY, $hBrushBK)
    EndSwitch
    _GDIPlus_GraphicsDrawImageRectRect($hGraphics, $hImage, $iX, $iY, $iSize, $iSize, 6 + $x * $iSize + $iOX, 6 + $y * $iSize + $iOY, $iSize, $iSize)
    _GDIPlus_GraphicsDrawLine($hGraphics, 6 + $x * $iSize + $iOX, 7 + $y * $iSize + $iOY, $iSize + 6 + $x * $iSize + $iOX, 7 + $y * $iSize + $iOY, $hPenWhite)
    _GDIPlus_GraphicsDrawLine($hGraphics, 7 + $x * $iSize + $iOX, 6 + $y * $iSize + $iOY, 7 + $x * $iSize + $iOX, $iSize + 6 + $y * $iSize + $iOY, $hPenWhite)
    _GDIPlus_GraphicsDrawLine($hGraphics, 6 + $x * $iSize + $iOX, $iSize + 5 + $y * $iSize + $iOY, $iSize + 6 + $x * $iSize + $iOX, $iSize + 5 + $y * $iSize + $iOY, $hPenBlack)
    _GDIPlus_GraphicsDrawLine($hGraphics, $iSize + 5 + $x * $iSize + $iOX, 6 + $y * $iSize + $iOY, $iSize + 5 + $x * $iSize + $iOX, $iSize + 6 + $y * $iSize + $iOY, $hPenBlack)
EndFunc   ;==>_DrawField

Func _SetTile()
    If $iTile = GUICtrlRead($hInput) Then Return
    GUIRegisterMsg($WM_PAINT, '')
    For $i = 0 To 4
        For $j = 0 To 4
            GUICtrlDelete($hLabel[$i][$j])
        Next
    Next
    $iTile = GUICtrlRead($hInput)
    $iSize = Round(440 / $iTile)
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            $hLabel[$i][$j] = GUICtrlCreateLabel("", 6 + $i * $iSize, 6 + $j * $iSize, $iSize, $iSize)
            GUICtrlSetCursor(-1, 2)
            GUICtrlSetOnEvent(-1, "_MoveField")
        Next
    Next
    _LoadRandomImage(True)
    _ReDraw()
    GUIRegisterMsg($WM_PAINT, '_Redraw')
EndFunc   ;==>_SetTile

Func _ReDraw()
    For $i = 0 To $iTile - 1
        For $j = 0 To $iTile - 1
            _DrawField($i, $j)
        Next
    Next
EndFunc   ;==>_ReDraw

Func _ArrayCombine(ByRef $aArray, $aNew)
    If Not IsArray($aNew) Then Return
    Local $iArray = UBound($aArray) - 1, $iNew = UBound($aNew) - 1
    Local $aReturn[$iArray + $iNew + 1]
    For $i = 1 To $iArray
        $aReturn[$i] = $aArray[$i]
    Next
    For $i = 1 To $iNew
        $aReturn[$i + $iArray] = $aNew[$i]
    Next
    $aReturn[0] = $iArray + $iNew
    $aArray = $aReturn
EndFunc   ;==>_ArrayCombine
Func _Exit()
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>_Exit

Programming today is a race between software engineers striving to
build bigger and better idiot-proof programs, and the Universe
trying to produce bigger and better idiots.
So far, the Universe is winning.

Link to post
Share on other sites

On my XP, I believe the $BS_BITMAP in the GUICtrlCreateButton function was hiding all the numbers on the buttons.

I continued to play with your script and swap these to commands around, Scramble() and GUISetState(): and,

added colour.

Topher, good job.

#NoTrayIcon
#cs ----------------------------------------------------------------------------
    AutoIt Version: 3.3.6.1
    Author:   Garth Bigelow
    email:     garthbigelow@gmail.com
    Script Function: Sliding Squiare Puzzle
#ce ----------------------------------------------------------------------------

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WindowsConstants.au3>

Const $version = "Plastic Sliding Squares Puzzle v1.00"

; Size of the Grid - 1
; 2 to 11
$Size = 4
;
; Speed of Sliding Movement
; 0 to ridiculously slow
$Speed = 0
;
; Number of potential moves
; needs to be rather larger as movement back and forth happens more often than you would think
; the smaller the grid the larger complexity needs to be
; the greater complexity the more challenging the puzzle
$Complexity = 30
;
; Whether empty square is the last number or not
; 0 for not
$Advanced = 0
;
; Disregard the Ini file and use the values above or not
$Ignore = False

If FileExists("PSSP.ini") = 0 Then
    IniWrite("PSSP.ini", "Config", "Grid Size", 5)
    IniWrite("PSSP.ini", "Config", "Speed", 10)
    IniWrite("PSSP.ini", "Config", "Complexity", 30)
    IniWrite("PSSP.ini", "Config", "Adanced", 0)
EndIf
If Not $Ignore Then
    $Size = IniRead("PSSP.ini", "Config", "Grid Size", 5) - 1
    $Speed = IniRead("PSSP.ini", "Config", "Speed", 10)
    $Complexity = IniRead("PSSP.ini", "Config", "Complexity", 30)
    $Advanced = IniRead("PSSP.ini", "Config", "Adanced", 0)
EndIf

Dim $hBoard[($Size + 1)][($Size + 1)]

Global $GoX, $GoY, $MoveCount = 0, $MenuSpace = 0

$hGUI = GUICreate($version, 68 * ($Size + 1) + 3, 68 * ($Size + 1) + $MenuSpace, -1, -1, -1, $WS_EX_COMPOSITED)
GUISetBkColor(0xAA4444)
If $Advanced = 0 Then
    $EmptySquare = ($Size + 1) * ($Size + 1)
Else
    $EmptySquare = Rand(($Size + 1) * ($Size + 1))
EndIf
For $x = 0 To $Size
    For $y = 0 To $Size
        $label = ($y) * ($Size + 1) + ($x + 1)

        $hBoard[$x][$y] = GUICtrlCreateButton($label, $x * 68 + 3, $y * 68 + 3 + $MenuSpace, 62, 62, $BS_FLAT)
        ;$hBoard[$x][$y] = GUICtrlCreateButton(String($label), $x * 68 + 3, $y * 68 + 3 + $MenuSpace, 62, 62, BitOR($BS_BITMAP, $BS_FLAT))
        GUICtrlSetBkColor(-1, Number("0x" & Hex(Random(0x80, 0xff, 1), 2) & Hex(Random(0x80, 0xff, 1), 2) & Hex(Random(0x80, 0xff, 1), 2)))

        If $EmptySquare = $label Then GUICtrlSetState($hBoard[$x][$y], $GUI_HIDE)
    Next
Next

Scramble()
GUISetState()

$MoveCount = 0

While True
    $msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then
        GUIDelete()
        Exit
    EndIf
    ProcessClick()
    If Over() Then
        NumToCoord($EmptySquare)
        GUICtrlSetState($hBoard[$GoX][$GoY], $GUI_SHOW)
        MsgBox(48, "Puzzle Completed", "You completed the puzzle in " & $MoveCount & " moves.")
        Exit
    EndIf
WEnd

Func ProcessClick()

    For $px = 0 To $Size
        For $py = 0 To $Size
            If $msg = $hBoard[$px][$py] Then
                If IsValidClick($px, $py) Then
                    Slide($px, $py)
                    Return
                EndIf
                Return
            EndIf
        Next
    Next
    Sleep(10)

EndFunc   ;==>ProcessClick

Func Scramble()

    $holdSpeed = $Speed
    $Speed = 0
    $a = $Complexity
    While $a > 0
        $x = Rand($Size)
        $y = Rand($Size)
        If IsValidClick($x, $y) Then
            Slide($x, $y)
            $a -= 1
        EndIf
    WEnd
    $Speed = $holdSpeed

EndFunc   ;==>Scramble

Func Slide($x, $y)

    NumToCoord($EmptySquare)
    If $x > $GoX Then SlideLeft($x, $y)
    If $x < $GoX Then SlideRight($x, $y)
    If $y > $GoY Then SlideUp($x, $y)
    If $y < $GoY Then SlideDown($x, $y)
    $MoveCount += 1

EndFunc   ;==>Slide

Func SlideDown($x, $y)

    NumToCoord($EmptySquare)
    For $line = 1 To 68
        For $b = $y To $GoY
            GUICtrlSetPos($hBoard[$x][$b], $x * 68 + 3, ($b * 68 + 3 + $MenuSpace) + $line)
        Next
        Sleep($Speed)
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoY - 1 To $y Step -1
        $hBoard[$x][$b + 1] = $hBoard[$x][$b]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc   ;==>SlideDown

Func SlideLeft($x, $y)

    NumToCoord($EmptySquare)
    For $line = 1 To 68
        For $b = $GoX To $x
            GUICtrlSetPos($hBoard[$b][$y], ($b * 68 + 3) - $line, ($y * 68 + 3 + $MenuSpace))
        Next
        Sleep($Speed)
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoX + 1 To $x
        $hBoard[$b - 1][$y] = $hBoard[$b][$y]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc   ;==>SlideLeft

Func SlideRight($x, $y)

    NumToCoord($EmptySquare)
    For $line = 1 To 68
        For $b = $x To $GoX - 1
            GUICtrlSetPos($hBoard[$b][$y], ($b * 68 + 3) + $line, ($y * 68 + 3 + $MenuSpace))
        Next
        Sleep($Speed)
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoX - 1 To $x Step -1
        $hBoard[$b + 1][$y] = $hBoard[$b][$y]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc   ;==>SlideRight

Func SlideUp($x, $y) ; checked

    NumToCoord($EmptySquare)
    For $line = 1 To 68
        For $b = $GoY To $y
            GUICtrlSetPos($hBoard[$x][$b], $x * 68 + 3, ($b * 68 + 3 + $MenuSpace) - $line)
        Next
        Sleep($Speed)
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoY + 1 To $y
        $hBoard[$x][$b - 1] = $hBoard[$x][$b]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc   ;==>SlideUp

Func IsValidClick($x, $y)

    NumToCoord($EmptySquare)
    $EmptyX = $GoX
    $EmptyY = $GoY
    NumToCoord(GUICtrlRead($hBoard[$x][$y]))
    If $EmptyX = $GoX Or $EmptyY = $GoY Then Return 1
    Return 0

EndFunc   ;==>IsValidClick

Func NumToCoord($Num)

    For $x = 0 To $Size
        For $y = 0 To $Size
            $lnum = GUICtrlRead($hBoard[$x][$y])
            If $Num = $lnum Then
                $GoX = $x
                $GoY = $y
                ExitLoop 2
            EndIf
        Next
    Next

EndFunc   ;==>NumToCoord

Func Over()

    For $x = 0 To $Size
        For $y = 0 To $Size
            If ($y) * ($Size + 1) + ($x + 1) <> GUICtrlRead($hBoard[$x][$y]) Then Return 0
        Next
    Next
    Return 1

EndFunc   ;==>Over


;
; bend random() function to my needs
;
Func Rand($pMax)

    Return Random(0, $pMax, 1)

EndFunc   ;==>Rand
Link to post
Share on other sites

On my XP, I believe the $BS_BITMAP in the GUICtrlCreateButton function was hiding all the numbers on the buttons.

I continued to play with your script and swap these to commands around, Scramble() and GUISetState(): and,

added colour.

Thanks.

I played with it a bit, opting for the black and red digits of the most common versions of the physical puzzle.

Thanks for the knowledge on $BS_BITMAP

[left][hr]

$mood = "whimsy"
$mode = "confused"
$randomChaos = True
Do
Something()
Until $Tired
[/left][left]Reflex (Arcade game)[/left][left]IX (Board game)[/left][left]The Word Game (Word game)[/left][left]Plastic Sliding Squares Puzzle (Puzzle)[/left]
Link to post
Share on other sites

Great! Looks even better - more like the one I had when I was young (so long ago ;)).

The new version seems to be even faster: I only needed 47 moves.

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2022-02-19 - Version 1.6.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki
Task Scheduler (NEW 2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki

Standard UDFs:
Excel - Example Scripts - Wiki
Word - Wiki

Tutorials:
ADO - Wiki
WebDriver - Wiki

 

Link to post
Share on other sites

Removed slide animation. Took too long.

If you have time, see if you could add frame rate independent animations.

Func SlideDown($x, $y)

    NumToCoord($EmptySquare)

    For $b = $y To $GoY
        GUICtrlSetPos($hBoard[$x][$b], $x * 68 + 3, ($b * 68 + 3 + $MenuSpace) + 68)
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoY - 1 To $y Step - 1
        $hBoard[$x][$b+1] = $hBoard[$x][$b]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc

Func SlideLeft($x, $y)

    NumToCoord($EmptySquare)

    For $b = $GoX To $x
        GUICtrlSetPos($hBoard[$b][$y], ($b * 68 + 3) - 68, ($y * 68 + 3 + $MenuSpace))
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoX + 1 To $x
        $hBoard[$b-1][$y] = $hBoard[$b][$y]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc

Func SlideRight($x, $y)

    NumToCoord($EmptySquare)

    For $b = $x To $GoX - 1
        GUICtrlSetPos($hBoard[$b][$y], ($b * 68 + 3) + 68, ($y * 68 + 3 + $MenuSpace))
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoX - 1 To $x Step - 1
        $hBoard[$b+1][$y] = $hBoard[$b][$y]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc

Func SlideUp($x, $y) ; checked

    NumToCoord($EmptySquare)

    For $b = $GoY To $y
        GUICtrlSetPos($hBoard[$x][$b], $x * 68 + 3, ($b * 68 + 3 + $MenuSpace) - 68)
    Next
    $holdHandle = $hBoard[$GoX][$GoY]
    For $b = $GoY + 1 To $y
        $hBoard[$x][$b-1] = $hBoard[$x][$b]
    Next
    $hBoard[$x][$y] = $holdHandle

EndFunc
Edited by Manadar
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 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 Gianni
      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:
      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. 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) 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.
    • 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...