Jump to content

Maze Generator


playjacob
 Share

Recommended Posts

This is my maze generator. It creates a maze useing the Recursive backtracker witch i found here: http://en.wikipedia.org/wiki/Maze_generation_algorithm#Recursive_backtracker

It'll save the finished maze in the a folder with the name Mazes in @scriptdir as Maze (Seed).bmp where Seed is the seed of the maze and size is the size.

It usees the Bitmap Libray by evelertoaster find it here:

Thanks to MvGulik for cleaning the code.

Here's a picture of a finished 25*25 maze:

Posted Image

The green dot is the start and the red dot is the end.

It can also solve the maze. Here's the solution for the above 25*25 maze.

Posted Image

So here's the code:

;~ #AutoIt3Wrapper_Au3Check_Stop_OnWarning=y
;~ #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7

;Thanks to MvGulik (http://www.autoitscript.com/forum/user/14111-mvgulik/)  for cleaning up the code. And for RND_SeedTimed function

#region Decleres and includes
;Add the needed includes
#include <Array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include "BMP3.au3" ; Downloaded from http://www.autoitscript.com/forum/topic/27362-bitmap-library/

#endregion Decleres and includes


#Region ### START Koda GUI section ### Form=***
$Gui = GUICreate("Maze Generator", 673, 728, 299, 77)
$GenerateButton = GUICtrlCreateButton("Generate!", 528, 8, 137, 49)
GUICtrlSetFont(-1, 17, 400, 0, "MS Sans Serif")
$SizeXLabel = GUICtrlCreateLabel("X:", 8, 24, 19, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$SizeYLabel = GUICtrlCreateLabel("Y:", 112, 24, 19, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$SolveCheck = GUICtrlCreateCheckbox("Solve maze?", 384, 24, 137, 20)
GUICtrlSetFont(-1, 15, 400, 0, "MS Sans Serif")
$MazeYInput = GUICtrlCreateInput("", 136, 24, 57, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER))
$MazeXInput = GUICtrlCreateInput("", 32, 24, 57, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_NUMBER))
$SizeLabel = GUICtrlCreateLabel("Size:", 80, 0, 39, 24)
GUICtrlSetFont(-1, 13, 400, 0, "MS Sans Serif")
$SeedLabel = GUICtrlCreateLabel("Seed:", 216, 24, 46, 24)
GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
$SeedInput = GUICtrlCreateInput("", 264, 24, 97, 21)
GUICtrlSetLimit(-1, 10)
GUICtrlSetTip(-1, "Leave blank for a random seed.")
$MazeTempPic = GUICtrlCreateGraphic(5,72, 663, 651)
GUICtrlSetBkColor(-1, 0x000000)
$MazeShowPic = GUICtrlCreatePic("", 5, 72, 663, 651)  ;this is where the maze will be shown
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $GenerateButton
            Generate(Int(GUICtrlRead($MazeXInput)), Int(GUICtrlRead($MazeYInput)), GUICtrlRead($SeedInput), Int(GUICtrlRead($SolveCheck)))
    EndSwitch
WEnd

Func Generate($iMazeX, $iMazeY, $sSeed, $iSolve)
    ProgressOn("Generating maze", "Generating maze. Please Wait", "", -1, -1 , 16)
    $iSeed = UseSeed($sSeed)
    If $sSeed = "" Then $sSeed = String($iSeed)
    ProgressSet(1, "1 Percent.")
    Local $sBaseName = 'MazesMaze [' & String($iMazeX) & ', ' & String($iMazeY) & '] (' & $sSeed & ')'  ; Now saves mazes in a separate folder
    DirCreate(@ScriptDir&"Mazes")
    Local $aiSize[2] = [$iMazeX, $iMazeY] ;$aiSize[0] Equals Number of Rows in each colum and $aiSize[1] equals number of Colums
    Local $aCells = _;This is where the maze will be stored ; It will store witch walls are intact
            Generate_Maze($aiSize, $iSolve) ; 25.5% of progress or 51% if not being solved
    Draw_Maze_Image($aiSize, $aCells, $sBaseName, $iSolve) ; 24.5% of progress or 48% if not being so)ved
    ;Show image if maze should not be solved
    If $iSolve = 49 Then GUICtrlSetImage($MazeShowPic, @ScriptDir & "" & $sBaseName & ".bmp")

    If $iSolve <> 49 Then
        Local $aCurrentPath = Solve_Maze($aiSize, $aCells) ; 25.5% of progress
        Solve_Maze_ImgDraw($aiSize, $aCurrentPath, $sBaseName) ; 23.5% of progress
        GUICtrlSetImage($MazeShowPic, @ScriptDir & "" & $sBaseName & "_Solved.bmp")
    EndIf
    ProgressOff()
EndFunc

Func Generate_Maze(Const ByRef $aiSize, ByRef $iSolve)
    Local Const $iTotalCells = $aiSize[0] * $aiSize[1]
    Local $iMoveToCell ; What cell to move to
    Local $aCellstack[$iTotalCells][2];This stores with sequnce the cell got generated in. used for backtracing. First dimension is Row. Second is Colum
    Local $iCurrentCellStackNumber = 0 ; Current subscript number to write to in $aCellstack
    Local $aCurrentCellStack[2] ; USed as a temp storage of a bit of cellstack. First dimension is Row. Second is Colum
    Local $iUnvisitedCells = $iTotalCells ; Number of cell that are unvisited
    Local $sNeighbours = ''
    Local $sNeighbourOk
    Local $iRndDirection
    Local $aCurrentCellRowColum
    $iSolve -= 1
    If $iSolve = 3 Then $iSolve = 25.5

    ;; setup cell array.
    Local $aCells[$iTotalCells];This is where the maze will be stored ; It will store witch walls are intact
    Local $iCurrentCell = Random(0, $iTotalCells - 1, 1) ;; set random start point/cell

    ;Make all walls be intact by filling the cells array with 1111
    array_filler($aCells, '1111')
    Local $aVisitedCells[$iTotalCells]
    array_filler($aVisitedCells, False)
    While 1
        ;Mark as visited and add to the cell stack
        $aCurrentCellRowColum = AddToCellStack($iCurrentCell, $iCurrentCellStackNumber, $aCellstack, $aiSize) ;; $iCurrentCell not used in function.
        ;Check to see if it sould stop createing the maze
        If $iUnvisitedCells <> 0 Then
            ;Check to see if the current cell has any neighbours there are unvisited
            $sNeighbours = _Neighbours($aCurrentCellRowColum, $iCurrentCell, $aVisitedCells, $aiSize)
            If $sNeighbours <> "0000" Then
                ;Choose a random unvisited Neighbour
                Do
                    $iRndDirection = Random(0, 3, 1)
                    $sNeighbourOk = StringMid($sNeighbours, $iRndDirection + 1, 1)
                Until $sNeighbourOk = "1"
                Switch $iRndDirection ;Witch side to move to
                    Case 0 ; Move Up
                        $iMoveToCell = $iCurrentCell - $aiSize[1]
                    Case 1 ; Move Right
                        $iMoveToCell = $iCurrentCell + 1
                    Case 2 ; Move Down
                        $iMoveToCell = $iCurrentCell + $aiSize[1]
                    Case 3 ; Move Left
                        $iMoveToCell = $iCurrentCell - 1
                EndSwitch
                BustWall($iCurrentCell, $iMoveToCell, $iRndDirection, $aCells)
                $iCurrentCell = $iMoveToCell
                ;Make the current cell visited
                $aVisitedCells[$iCurrentCell] = True
                $iUnvisitedCells -= 1
            Else
                $aCurrentCellStack[0] = $aCellstack[$iCurrentCellStackNumber - 2][0] ; Get row of last item in cellstack
                $aCurrentCellStack[1] = $aCellstack[$iCurrentCellStackNumber - 2][1] ; Get colum of last item in cellstack
                $iCurrentCell = _GetCellPos($aiSize, $aCurrentCellStack) ; Combine row and colum to get pos
                $iCurrentCellStackNumber -= 2 ; This will ensure that the used cell from the cellstack will be overwritten
            EndIf
        Else
            ExitLoop
        EndIf

        ;Update the progress
        ProgressSet(Int(Map($iUnvisitedCells, $iTotalCells, 0, 0, 25.5) + 1 + $iSolve), String(Int(Map($iUnvisitedCells, $iTotalCells, 0, 0, 25.5) + 1 + $iSolve))&" Percent.")
    WEnd
    ProgressSet(Int(25.5 + $iSolve), String(Int(25.5 + $iSolve))&" Percent.") ; Update progress
    Return $aCells
EndFunc   ;==>Generate_Maze

Func Draw_Maze_Image(Const ByRef $aiSize, ByRef Const $aCells, ByRef Const $sFilename, ByRef $iSolve)
    Local Const $iTotalCells = $aiSize[0] * $aiSize[1]
    Local $aImageRowColum
    Local $tBMP = _BMPCreate($aiSize[1] * 9, $aiSize[0] * 9) ;Define the size of the maze (in bmp)
    If $iSolve = 25.5 Then $iSolve = 25.5 + 23.5

    ;Draw the maze with no walls
    For $i = 0 To $iTotalCells - 1
        $aImageRowColum = _GetCellPos($aiSize, $i)
        Draw3By3($tBMP, $aImageRowColum[0] * 9, $aImageRowColum[1] * 9)
        Draw3By3($tBMP, 6 + $aImageRowColum[0] * 9, $aImageRowColum[1] * 9)
        Draw3By3($tBMP, $aImageRowColum[0] * 9, 6 + $aImageRowColum[1] * 9)
        Draw3By3($tBMP, 6 + $aImageRowColum[0] * 9, 6 + $aImageRowColum[1] * 9)
        ProgressSet(Int(Map($i, 0, $iTotalCells-1, 0, 10) + 26.5 + $iSolve), String(Int(Map($i, 0, $iTotalCells-1, 0, 10) + 26.5 + $iSolve))&" Percent."); Update progress
    Next

    ;Then Draw the wall on the cells
    For $i = 0 To $iTotalCells - 1
        $aImageRowColum = _GetCellPos($aiSize, $i)
        If StringMid($aCells[$i], 1, 1) = "1" Then
            Draw3By3($tBMP, 3 + $aImageRowColum[1] * 9, $aImageRowColum[0] * 9)
        EndIf
        If StringMid($aCells[$i], 2, 1) = "1" Then
            Draw3By3($tBMP, 6 + $aImageRowColum[1] * 9, 3 + $aImageRowColum[0] * 9)
        EndIf
        If StringMid($aCells[$i], 3, 1) = "1" Then
            Draw3By3($tBMP, 3 + $aImageRowColum[1] * 9, 6 + $aImageRowColum[0] * 9)
        EndIf
        If StringMid($aCells[$i], 4, 1) = "1" Then
            Draw3By3($tBMP, $aImageRowColum[1] * 9, 3 + $aImageRowColum[0] * 9)
        EndIf
        ProgressSet(Int(Map($i, 0, $iTotalCells-1, 0, 10) + 36.5 + $iSolve), String(Int(Map($i, 0, $iTotalCells-1, 0, 10) + 36.5 + $iSolve))&" Percent."); Update progress
    Next

    ;Draw start and exit.
    ;Start will be green and exit will be red
    Draw3By3($tBMP, 3, 3, '00FF00') ; Draw a green cube in the first cell(Top Left Corner)
    $aImageRowColum = _GetCellPos($aiSize, $iTotalCells - 1);Get row and colum of the last cell in the maze
    Draw3By3($tBMP, 3 + + $aImageRowColum[1] * 9, 3 + $aImageRowColum[0] * 9, 'FF0000') ; Draw a red cube in the last cell (Buttom right corner)

    ;And finaly save the bmp
    _BMPWrite($tBMP, @ScriptDir & "" & $sFilename & ".bmp")
    ProgressSet(Int(51 + $iSolve), String(Int(51 + $iSolve))&" Percent.") ; Update progress
EndFunc   ;==>Draw_Maze_Image


Func Solve_Maze(Const ByRef $aiSize, ByRef $aCells)
    Local Const $iTotalCells = $aiSize[0] * $aiSize[1]
    Local $aCurrentPath[$iTotalCells+1000] ; Will store the current solved path

    Local $aSolveVisitedCells[$iTotalCells] ;This will store if the solver has been to a cell yet or not
    Local $iCurrentPathSubscriptNumber = -1 ; Current subscript number to write to in $aCurrentPath
    Local $iCurrentCell = 0

    AddToCurrentPath($iCurrentCell, $iCurrentPathSubscriptNumber, $aCurrentPath) ; Add the cell the the path
    $aSolveVisitedCells[$iCurrentCell] = 1;Mark cell as visited

    ;Loop until the path has been found
    Local $CanGoOrNot
    Local $aYX[2] ; Store Y and X in an array ; used in solveing the maze
    While 1
        ;Find a direction to go
        For $iDirection = 0 To 3
            ;;If $iDirection = 4 Then ExitLoop
            $aYX = _GetCellPos($aiSize, $iCurrentCell); Convert it to rows and colums
            $CanGoOrNot = CanGo($aYX[0], $aYX[1], $iDirection, $aCells, $aSolveVisitedCells, $aiSize) ; Check if it can go there
            If $CanGoOrNot = 1 Then ExitLoop
        Next
        If $iDirection <> 4 Then
            Switch $iDirection
                Case 0 ; Up
                    $iCurrentCell -= $aiSize[0]
                Case 1 ; Right
                    $iCurrentCell += 1
                Case 2 ; Down
                    $iCurrentCell += $aiSize[0]
                Case 3 ; Left
                    $iCurrentCell -= 1
            EndSwitch
            AddToCurrentPath($iCurrentCell, $iCurrentPathSubscriptNumber, $aCurrentPath) ; Add the cell the the path
            $aSolveVisitedCells[$iCurrentCell] = True;Mark cell as visited
        Else
            If $iCurrentPathSubscriptNumber > 0 Then
                $iCurrentCell = $aCurrentPath[$iCurrentPathSubscriptNumber - 1]

                $iCurrentPathSubscriptNumber -= 1
                ;Else
                ; $iCurrentPathSubscriptNumber -= 1
            EndIf
        EndIf
        If $iCurrentCell = $iTotalCells - 1 Then ExitLoop
    WEnd

    ProgressSet(Int(76.5), "75 Percent"); Update progress

    Return $aCurrentPath
EndFunc   ;==>Solve_Maze

Func Solve_Maze_ImgDraw(Const ByRef $aiSize, ByRef $aCurrentPath, Const ByRef $sFilename)
    Local Const $iTotalCells = $aiSize[0] * $aiSize[1]

    ;This function will use functions from the Drawing Functions region
    ;Open The Generated maze as a bmp handle
    Local $tBMP = _BMPOpen(@ScriptDir & "" & $sFilename & ".bmp")

    Local $aCurrentRowAndColum

    ;Go thoug all the cells one by one
    For $i = 0 To UBound($aCurrentPath) - 1
        If $aCurrentPath[$i] = $iTotalCells - 1 Then ExitLoop
        If $aCurrentPath[$i] <> "" Then

            $aCurrentRowAndColum = _GetCellPos($aiSize, $aCurrentPath[$i])
            Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 3, 9 * $aCurrentRowAndColum[0] + 3, 'FFFF00')
            If $aCurrentPath[$i] - $aiSize[0] = $aCurrentPath[$i + 1] Then ; Up
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 3, 9 * $aCurrentRowAndColum[0], 'FFFF00')
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 3, 9 * $aCurrentRowAndColum[0] - 3, 'FFFF00')
            ElseIf $aCurrentPath[$i] + 1 = $aCurrentPath[$i + 1] Then ;Right
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 6, 9 * $aCurrentRowAndColum[0] + 3, 'FFFF00')
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 9, 9 * $aCurrentRowAndColum[0] + 3, 'FFFF00')
            ElseIf $aCurrentPath[$i] + $aiSize[0] = $aCurrentPath[$i + 1] Then ; Down
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 3, 9 * $aCurrentRowAndColum[0] + 6, 'FFFF00')
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] + 3, 9 * $aCurrentRowAndColum[0] + 9, 'FFFF00')
            ElseIf $aCurrentPath[$i] - 1 = $aCurrentPath[$i + 1] Then ;LEft
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1], 9 * $aCurrentRowAndColum[0] + 3, 'FFFF00')
                Draw3By3($tBMP, 9 * $aCurrentRowAndColum[1] - 3, 9 * $aCurrentRowAndColum[0] + 3, 'FFFF00')
            EndIf
        EndIf

        ProgressSet(Int(Map($i, 0, UBound($aCurrentPath) - 1, 0, 22.5) + 76.5), String(Int(Map($i, 0, UBound($aCurrentPath) - 1, 0, 22.5) + 76.5))&" Percent") ; Update progress
    Next

    ;reDraw start and exit.
    ;Start will be green and exit will be red
    Draw3By3($tBMP, 3, 3, '00FF00') ; Draw a green cube in the first cell(Top Left Corner)
    Local $aImageRowColum = _GetCellPos($aiSize, $iTotalCells - 1);Get row and colum of the last cell in the maze
    Draw3By3($tBMP, 3 + + $aImageRowColum[1] * 9, 3 + $aImageRowColum[0] * 9, 'FF0000') ; Draw a red cube in the last cell (Buttom right corner)

    ;And finaly save th bmp as Maze.bmp
    _BMPWrite($tBMP, @ScriptDir & "" & $sFilename & "_Solved.bmp")

    ProgressSet(100, "100 Percent") ; Update progress
EndFunc   ;==>Solve_Maze_ImgDraw




#region Maze generation functions
Func BustWall($Cell1, $Cell2, $iDirection, ByRef $aCells) ; This function will remove the walls in two adjacent cells. Direction is from first cell to second. Direction can be from 0 - 3. 0 = Up, 1 = Right, 2 = Down, 3 = Left
    $aCells[$Cell1] = StringReplace($aCells[$Cell1], $iDirection + 1, "0", 1, 2) ; Bust the wall between cell1 and cell2 in cell1
    FlipDirection_br($iDirection)
    $aCells[$Cell2] = StringReplace($aCells[$Cell2], $iDirection + 1, "0", 1, 2) ; Bust the wall between cell1 and cell2 in cell2
EndFunc   ;==>BustWall

Func AddToCellStack($iCurrentCell, ByRef $iCurrentCellStackNumber, ByRef $aCellstack, Const ByRef $aiSize); This function will add the $Cell to the $aCellstack at the subscript of $CurretCellStackNumber
    ;Convert to Rows and colums
    Local $aCurrentCellRowColum = _GetCellPos($aiSize, $iCurrentCell)
    ;Add cell to the cell stack
    $aCellstack[$iCurrentCellStackNumber][0] = $aCurrentCellRowColum[0]
    $aCellstack[$iCurrentCellStackNumber][1] = $aCurrentCellRowColum[1]
    ;Add one to $iCurrentCellStackNumber
    $iCurrentCellStackNumber += 1
    Return $aCurrentCellRowColum
EndFunc   ;==>AddToCellStack

Func _Neighbours(Const ByRef $aCurrentCellRowColum, $Cell, ByRef Const $aVisitedCells, Const ByRef $aiSize) ; Check for Neighbours and store them in a string an 1 means that the neighbour has not been visited and an 0 means the neighbour has been visited it also checks for the edge of the maze.
    Local $NeighbourRowColum, $sNeighbours = ''
    Local Const $iTotalCells = $aiSize[0] * $aiSize[1]

    ;Check Clockwise
    ;Check Above cell
    If ($Cell - $aiSize[1] >= 0) And ($aVisitedCells[$Cell - $aiSize[1]] = False) Then
        $sNeighbours &= "1"
    Else
        $sNeighbours &= "0"
    EndIf
    ;Check Right Cell
    $NeighbourRowColum = _GetCellPos($aiSize, $Cell + 1)
    If ($aCurrentCellRowColum[0] >= $NeighbourRowColum[0]) And ($Cell + 1 < $iTotalCells) And ($aVisitedCells[$Cell + 1] = False) Then
        $sNeighbours &= "1"
    Else
        $sNeighbours &= "0"
    EndIf
    ;Check Buttom Cell
    If ($Cell + $aiSize[1] < $iTotalCells) And ($aVisitedCells[$Cell + $aiSize[1]] = False) Then
        $sNeighbours &= "1"
    Else
        $sNeighbours &= "0"
    EndIf
    ;Check Left Cell
    $NeighbourRowColum = _GetCellPos($aiSize, $Cell - 1)
    If ($aCurrentCellRowColum[0] <= $NeighbourRowColum[0]) And ($Cell - 1 >= 0) And ($aVisitedCells[$Cell - 1] = False) Then
        $sNeighbours &= "1"
    Else
        $sNeighbours &= "0"
    EndIf
    Return $sNeighbours
EndFunc   ;==>_Neighbours
#endregion Maze generation functions

#region Drawing Functions
Func Draw3By3(ByRef $tBMP, $x, $y, $Colur = '000000') ; This function will draw a 3*3 Cube at a given x and y on the $tBMP
    _PixelWrite($tBMP, $x, $y, $Colur)
    _PixelWrite($tBMP, $x + 1, $y, $Colur)
    _PixelWrite($tBMP, $x + 2, $y, $Colur)
    _PixelWrite($tBMP, $x, $y + 1, $Colur)
    _PixelWrite($tBMP, $x + 1, $y + 1, $Colur)
    _PixelWrite($tBMP, $x + 2, $y + 1, $Colur)
    _PixelWrite($tBMP, $x, $y + 2, $Colur)
    _PixelWrite($tBMP, $x + 1, $y + 2, $Colur)
    _PixelWrite($tBMP, $x + 2, $y + 2, $Colur)
EndFunc   ;==>Draw3By3
#endregion Drawing Functions

#region Maze solveing Functions
Func CanGo($y, $x, ByRef Const $iDirection, ByRef Const $aCells, ByRef Const $aSolveVisitedCells, Const ByRef $aiSize);Returns 1 if the direction can the traveled and if not it will return 0. $Y = Row, $x = Colum, $iDirection = Direction
    Local $aYX[2] = [$y, $x]
    If StringMid($aCells[_GetCellPos($aiSize, $aYX)], $iDirection + 1, 1) = "0" Then
        Switch $iDirection
            Case 0 ; Up
                $aYX[0] -= 1
            Case 1 ; Right
                $aYX[1] += 1
            Case 2 ; Down
                $aYX[0] += 1
            Case 3 ; Left
                $aYX[1] -= 1
        EndSwitch
        If ($aSolveVisitedCells[_GetCellPos($aiSize, $aYX)] <> True) Then Return 1 ; IF cell has not been seen before by the solver
    EndIf
    Return 0
EndFunc   ;==>CanGo

Func AddToCurrentPath(ByRef Const $Cell, ByRef $iCurrentPathSubscriptNumber, ByRef $aCurrentPath)
    $iCurrentPathSubscriptNumber += 1
    $aCurrentPath[$iCurrentPathSubscriptNumber] = $Cell
EndFunc   ;==>AddToCurrentPath
#endregion Maze solveing Functions

#region Seed Functions
Func UseSeed($sRawSeed)
    Local Const $INT31u = Int('0x0080000000') ;; (2^31), int64. (2147483648)
    Local Const $INT32u = Int('0x0100000000') ;; (2^32), int64. (4294967296)
    If $sRawSeed = "" Then Return SetError(0, 1, RND_SeedTimed())
    If StringLen($sRawSeed) > 10 Then Return SetError(1, 0, -1)
    $s = StringSplit($sRawSeed, "")
    $iSeed = 0
    For $i = 1 To $s[0]
        $iSeed += (Asc($s[$i])*31^($s[0]-$i))
    Next
    $iSeed = Int(Mod(Int($iSeed), $INT32u) - ($INT31u), 1)
    SRandom($iSeed)
    Return SetError(0, 0, $iSeed)
EndFunc

Func RND_SeedTimed($iSeed = Default) ;; Set seed base on current timer value. Returns used seed value.
    Local Const $INT31u = Int('0x0080000000') ;; (2^31), int64. (2147483648)
    Local Const $INT32u = Int('0x0100000000') ;; (2^32), int64. (4294967296)
    If Not IsNumber($iSeed) Then
        $iSeed = Int(Mod(Int(TimerInit()), $INT32u) - ($INT31u), 1) ;; wraps to [-2^31 and 2^31-1]. (has value shift)
    EndIf
    SRandom($iSeed)
    Return SetError(@error, @extended, $iSeed)
EndFunc   ;==>RND_SeedTimed
#endregion Seed Functions

#region Global Functions
Func _GetCellPos(Const ByRef $aiSize, $vFind) ; This function will make a row and a colum into a Pos to be used with $aCells or $aCellstack, Or it will Make a Pos into an array with row and colum
    If IsArray($vFind) Then
        Local $CellPos = $vFind[0] * $aiSize[1] + $vFind[1]
        Return $CellPos
    Else
        Local $aCellRowColum[2] ; Will be used in the _GetCellPos function to temp.. store an array
        $aCellRowColum[0] = Int($vFind / $aiSize[1])
        $aCellRowColum[1] = $vFind - ($aCellRowColum[0] * $aiSize[1])
        Return $aCellRowColum
    EndIf
EndFunc   ;==>_GetCellPos

Func FlipDirection_br(ByRef $iDirection) ; Flips the direction
    If $iDirection > 1 Then
        $iDirection -= 2
    Else
        $iDirection += 2
    EndIf
EndFunc   ;==>FlipDirection_br

Func FlipDirection($iDirection) ; Flips the direction
    If $iDirection > 1 Then Return $iDirection - 2
    Return $iDirection + 2
EndFunc   ;==>FlipDirection

Func array_filler(ByRef $aArray, $vFiller) ; Fills $aArray with $vFiller
    For $i = 0 To UBound($aArray) - 1
        $aArray[$i] = $vFiller
    Next
EndFunc   ;==>array_filler

Func Map($iValue, $iFromLow, $iFromHigh, $iToLow, $iToHigh)
    Return ($iValue - $iFromLow) * ($iToHigh - $iToLow) / ($iFromHigh - $iFromLow) + $iTolow
EndFunc

#endregion Global Functions

Also be VERY carefull when generating very big mazes, my computer crashed when i was trying to generate a 500*500 maze. -FIXED

Please post comments and/or any bug or problems.

Sorry for any bad spelling that there may be.

Edited by playjacob
Link to comment
Share on other sites

  • Replies 46
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Wow, pretty cool. Now can it solve the maze too?

[center]AutoIT + Finger Print Reader/Scanner = COOL STUFF -> Check Out Topic![/center][center][font=Arial Black]Check out ConsultingJoe.com[/font][/center][center]My Scripts~~~~~~~~~~~~~~Web Protocol Managing - Simple WiFi Scanner - AutoTunes - Remote PC Control V2 - Audio SpectrascopePie Chart UDF - At&t's TTS - Custom Progress Bar - Windows Media Player Embed[/center]

Link to comment
Share on other sites

There is only one other route to the original exit in your picture, the other leads to a different exit.

For the record it is not the same as the route I found, I've not ran the script I just followed it

and can't be bothered hi-lighting it .

AutoIt Absolute Beginners    Require a serial    Pause Script    Video Tutorials by Morthawt   ipify 

Monkey's are, like, natures humans.

Link to comment
Share on other sites

@johnOne i found another route that you spoke, it became even more interesting with two routes.

post-69288-0-61249900-1341019677_thumb.p

Link to comment
Share on other sites

Posted Image it goes from the original green dot, to the

original red dot.

I found the route that you spoke

post-69288-0-96724600-1341049851_thumb.p

Link to comment
Share on other sites

Getting out is easy, the hard part is getting to the middle.

What do you mean? It's not harder to get to the middle.

I'm wondering if there are supposed to be more than one way to solve it.

There's not but it makes it cooler if there's more but i'll have to get the solveing to find all the paths

I also found two others.

post-69288-0-66671400-1341007252_thumb.p

There's is only ONE start and ONE end point to the maze the other ones are just dead ends.
Link to comment
Share on other sites

Link to comment
Share on other sites

@ playjacob now I understand, congratulations one more time by your script.

post-69288-0-75811800-1341058898_thumb.j

You're right as far as the entry and the exit goes, but in this example there's actualy two paths.

Not totaly sure how or why it made two but it did.

Link to comment
Share on other sites

Erm ... right, broke something again while trying to reformat the OP's code. ... back to debugging >_<

Anyway, here's something that might be of some use in relation to slapping a ID on a particular maze. (needs maze size dimensions to of course to complete the reproducibility.)

;; use
dim $iUsedSeed = RND_SeedTimed() ;; return used random seed value. [int32]
;; or
dim $iUsedSeed = RND_SeedTimed(1234567890) ;; uses given seed. (Should be a Int32-range value. CQ: Anything else is untested.)

;; UDF code
Global Const $INT31u = Int('0x0080000000') ;; (2^31), int64(2147483648)
Global Const $INT32u = Int('0x0100000000') ;; (2^32), int64(4294967296)
Func RND_SeedTimed($iSeed=Default) ;; Set seed base on current timer value. Returns used seed value.
    if Not IsNumber($iSeed) Then
        $iSeed = int(Mod(Int(TimerInit()), $INT32u) - ($INT31u),1) ;; wraps to [-2^31 and 2^31-1]. (has value shift)
    EndIf
    SRandom($iSeed)
    Return $iSeed
EndFunc
Edited by MvGulik

"Straight_and_Crooked_Thinking" : A "classic guide to ferreting out untruths, half-truths, and other distortions of facts in political and social discussions."
"The Secrets of Quantum Physics" : New and excellent 2 part documentary on Quantum Physics by Jim Al-Khalili. (Dec 2014)

"Believing what you know ain't so" ...

Knock Knock ...
 

Link to comment
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
 Share

×
×
  • Create New...