Jump to content
Sign in to follow this  
Topher

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]

Share this post


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 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2020-02-09 - Version 1.4.1.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki, WebDriver - Wiki

 

Share this post


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]

Share this post


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]

Share this post


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 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2020-02-09 - Version 1.4.1.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki, WebDriver - Wiki

 

Share this post


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.

Share this post


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

Share this post


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]

Share this post


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 2019-10-24 - Version 1.4.14.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2020-02-09 - Version 1.4.1.0) - Download - General Help & Support - Example Scripts - Wiki
Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki
ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts
PowerPoint (2017-06-06 - Version 0.0.5.0) - Download - General Help & Support
Excel - Example Scripts - Wiki
Word - Wiki
Task Scheduler (NEW 2019-12-03 - Version 1.5.1.0) - Download - General Help & Support - Wiki

Tutorials:
ADO - Wiki, WebDriver - Wiki

 

Share this post


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

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
Sign in to follow this  

  • Similar Content

    • By n0ktar
      is it possible to make a wall chams in rainbow six siege using autoit scripts? tell me please and how . 
    • By spikespaz
      The rule against game automation is misguided and unhelpful for the following reasons.
       
      I am a developer, using AutoIt to automate testing for a game that I am developing. Singleplayer games can be mundane and sometimes cheating can be overlooked. Multiplayer games usually have anticheat against repetitive robotic actions anyways. People want to override the control schemes of games with bad customization. Eg. Axiom Verge, Fortnite (Crouching). Game automation is not always bad. If the user feels the need to automate a singleplayer game for boring or mundane tasks, that is their choice. Similarly, if I wish to use scripts to automate testing, that is my choice.
      Game automation can be a problem for online multiplayer games, giving players a competitive advantage. This could be countered by common sense; ask OP what game they are automating, and is it an online game? What is this script for, and what does it seem to do?

      Please revise the rule as it seems very unnecessary and harmful to people seeking help with innocent attempts at game automation.
    • 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
    • By Mannyfresh31
      This is a game that I'm developing for Slot machines I just finished translating it to English my original version is in Spanish so if I miss spelled or translated something wrongly please accept my apologies I just releasing the Compile version this time just the .exe file Because I'm saving the code for myself since the software was originally written for my business or if someone wants it they have to pay but not you you getting it for free here at Autoit .
      once you run the software for first time is going to ask you for a license and it wont work without it you can get an Access code (license) by request just PM me and provide the code that the software will give when you press the cancel button three times.
      anyways once you're in the game the following hotkeys are set for interacting with it
      "q" for slot one or one credit
      "d" for slot two or five credits
      "1" or "2" or "3" or "4" or "5" to play simple, double, threeple, etc.  once you have credits of course
      "p" to stop the numbers once you're playing
      "c" for configurations or settings
      "i" for printing the receipt
      "s" for exit
      "t" for trading points for credits
       
      Link to download the game https://drive.google.com/open?id=1x22AM80fjrDjTwwAp_TqbdWyTabawoQX
       
      and here are some videos so you can see what the game is about
       
       
       
       
       
       
       
       
    • By Slaventii_M
      Hi everybody!
      I've been studying Autoit not so long ago and today I want to share my game with you.
      Please check it out and tell me your opinion.
      Files in the archive:
      BG.jpg
      Mole.png
      Mole_Dead.png
      Shoot.wav
      Cursor.cur
      Game_Icon.iso
      Mole Shooter.au3
      Mole Shooter.exe
      Screenshots:
      Screenshot 1
      Screanshot 2
      Screanshot 3
      Files:
      Mole Shooter.rar
      Created and tested:
      Windows XP SP3 Game Edition (x86)
      Autoit Version: 3.3.10.2
×
×
  • Create New...