' Parallel executions of Tremaux's algorithm
' Stevan Tosic
' 26/05/2020
' 03/06/2020 (multi turtle added)
' Turtle is replaced as Tryhest proposed in KRX737 (turtleMove and initTurtleUI here)
mazeTable[1][1] = "XXXXOXXXXXX"
mazeTable[1][2] = "X X O"
mazeTable[1][3] = "X XXXXX X X"
mazeTable[1][4] = "X X "
mazeTable[1][5] = "XXX X X X X"
mazeTable[1][6] = "O X X"
mazeTable[1][7] = "X XXXXXXX X"
mazeTable[1][8] = "X X X OX"
mazeTable[1][9] = "X X X X XXX"
mazeTable[1][10] = "X X X X"
mazeTable[1][11] = "XXXXX XXXXX"
mazeTable[2][1] = "XOXXXOXXXXXX"
mazeTable[2][2] = "X XOX"
mazeTable[2][3] = "XXXOXX X X"
mazeTable[2][4] = "X X "
mazeTable[2][5] = "XXX X X X "
mazeTable[2][6] = "X X "
mazeTable[2][7] = "X XXX XX X"
mazeTable[2][8] = "X X X XX"
mazeTable[2][9] = "X X X XXX"
mazeTable[2][10] = "X X XO X"
mazeTable[2][11] = "XXXXX XXXXX"
mazeTable[3][1] = "XXXXXOXXXXX"
mazeTable[3][2] = "X X "
mazeTable[3][3] = "XXXOXX X X"
mazeTable[3][4] = "X X "
mazeTable[3][5] = "XXX X X X "
mazeTable[3][6] = "O X "
mazeTable[3][7] = "X XXXX XX X"
mazeTable[3][8] = "X X OX"
mazeTable[3][9] = "X X X XXX"
mazeTable[3][10] = "X X X X"
mazeTable[3][11] = "XXXXX XXXXX"
initVariables()
initRooms()
initTurtles()
While(isSearchAlive[1][1] = "True" Or isSearchAlive[1][2] = "True" Or isSearchAlive[2][1] = "True" Or isSearchAlive[2][2] = "True" Or isSearchAlive[3][1] = "True" Or isSearchAlive[3][2] = "True" Or isSearchAlive[3][3] = "True")
'search(room, turtleID)
LDCall.Function2("search", 1, 1)
LDCall.Function2("search", 2, 1)
LDCall.Function2("search", 3, 1)
LDCall.Function2("search", 1, 2)
LDCall.Function2("search", 2, 2)
LDCall.Function2("search", 3, 2)
LDCall.Function2("search", 3, 3)
Program.Delay(20)
EndWhile
Sub goNorth
searchState[room][turtleID] = dirNorth
dY = -1
dX = 0
edgeCondition[room][turtleID] = -(turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID]] + dY)
toFieldIfFree()
EndSub
Sub goWest
searchState[room][turtleID] = dirWest
dX = -1
dY = 0
edgeCondition[room][turtleID] = -(turtlePath[room][turtleID]["X"][stepCounter[room][turtleID]] + dX)
toFieldIfFree()
EndSub
Sub checkEdge
isEdge ="True"
If(edgeCondition[room][turtleID] < 0) Then
isEdge = "False"
EndIf
EndSub
Sub checkSearchLimit
isSearchLimit = "False"
If(stepCounter[room][turtleID] = depthSearchLimit[room][turtleID]) Then
isSearchLimit = "True"
EndIf
EndSub
Sub returnFromDeadEnd
If stepCounter[room][turtleID] > 0 Then
row = turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID]+1]
col = turtlePath[room][turtleID]["X"][stepCounter[room][turtleID]+1]
tableState[room][row][col] = charUsedField
LDCall.Function("turtleMove", -cellSize)
searchState[room][turtleID] = Stack.PopValue(stacks[room][turtleID])
Else
isSearchAlive[room][turtleID] = "False"
'TextWindow.WriteLine("Room" + room + ", turtle:" + turtleID + " end.")
EndIf
EndSub
Sub addUsedFieldToPath
turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID] + 1] = turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID]] + dY
turtlePath[room][turtleID]["X"][stepCounter[room][turtleID] + 1] = turtlePath[room][turtleID]["X"][stepCounter[room][turtleID]] + dX
EndSub
Sub checkWallUsedField
isUsedField = "False"
isWall = "False"
row = turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID]] + dY
col = turtlePath[room][turtleID]["X"][stepCounter[room][turtleID]] + dX
If(tableState[room][row][col] = charUsedField) Then
isUsedField = "True"
ElseIf(tableState[room][row][col] = charWall) Then
isWall = "True"
Else
col = turtlePath[room][turtleID]["X"][stepCounter[room][turtleID]]
row = turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID]]
tableState[room][row][col] = charUsedField
EndIf
EndSub
Sub setTargetColor
GraphicsWindow.BrushColor = colorMarkedTarget
tx = targets[room]["X"][i]
ty = targets[room]["Y"][i]
cellTable = Shapes.AddRectangle(cellSize, cellSize)
Shapes.Move(cellTable, tx * cellSize + tableOffsetX[room] * cellSize, ty * cellSize)
EndSub
Sub checkTarget
For i=1 To numTarget[room]
If(turtlePath[room][turtleID]["X"][stepCounter[room][turtleID]] = targets[room]["X"][i] And turtlePath[room][turtleID]["Y"][stepCounter[room][turtleID]] = targets[room]["Y"][i]) Then
setTargetColor()
EndIf
EndFor
EndSub
Sub writeLimitedturtlePath
TextWindow.Write(msgEnd)
For i = 1 To depthSearchLimit[room][turtleID]
TextWindow.Write(" " + turtlePath[room][turtleID]["Y"][i] + "," + turtlePath[room][turtleID]["X"][i] + " ")
EndFor
TextWindow.WriteLine("")
TextWindow.WriteLine("********")
EndSub
Sub setWallField
tableState[room][row][col] = charWall
EndSub
Sub setTarget
tableState[room][row][col] = charTarget
EndSub
Sub setFreeField
tableState[room][row][col] = charFreeField
EndSub
Sub addTargetXY
targets[room]["Y"][numTarget[room]] = row
targets[room]["X"][numTarget[room]] = col
EndSub
Sub readTable
row = 1
line = mazeTable[room][row]
numTarget[room]=0
maxCol = 0
While(row <= Array.GetItemCount(mazeTable[room]))
numColumn[room] = Text.GetLength(line)
For col=1 To numColumn[room]
char = Text.GetSubText(line,col,1)
If(char = charWall) Then
setWallField()
ElseIf(char = charTarget) Then
setTarget()
numTarget[room] = numTarget[room] + 1
addTargetXY()
Else
setFreeField()
EndIf
EndFor
If(numColumn[room] > maxCol) Then
maxCol = numColumn[room]
EndIf