该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Python3.4,Windows系统
这个project的目的是让机器人可以走任意迷宫,在机器人走迷宫之前并不知道迷宫长什么样子,要在走过迷宫之后获取迷宫墙面信息(哪面是墙,哪面是通路),迷宫墙面信息通过机器人上的传感器传回信息决定。在传感器传信息给机器人走迷宫的class(mapping class)之后,mapping class要传回机器人下一个要走的方向给机器人的controler class。现在的问题是机器人mapping时走过的cell的坐标每次都从新生成新的,即使是已经走过的cell也会从新生成新坐标。造成visitedStack overflow。也不能顺利完成深度优先算法。代码如下:
x = 0
y = 0
transferx = 0
transfery = 0
originalDir = 'north'
dfs = []
visitedStack = []
obj = object
class Map():
'''
classdocs
'''
def __init__(self):
'''
Constructor
'''
def get_next_direction(self,bearring):
global originalDir
global transferx
global transfery
if(originalDir == 'north'):
if(bearring == 'right'):
transferx = x+1
transfery = y
elif(bearring =='forward'):
transferx = x
transfery = y+1
elif(bearring == 'left'):
transferx = x-1
transfery = y
else:
transferx = x
transfery = y-1
elif(originalDir == 'east'):
if(bearring == 'right'):
transferx = x
transfery = y-1
elif(bearring =='forward'):
transferx = x+1
transfery = y
elif(bearring == 'left'):
transferx = x
transfery = y+1
else:
transferx = x-1
transfery = y
elif(originalDir == 'west'):
if(bearring == 'right'):
transferx = x
transfery = y+1
elif(bearring == 'forward'):
transferx = x-1
transfery = y
elif(bearring == 'left'):
transferx = x
transfery = y-1
else:
transferx = x+1
transfery = y
elif(originalDir == 'south'):
if(bearring == 'right'):
transferx = x-1
transfery = y
elif(bearring == 'forward'):
transferx = x
transfery = y-1
elif(bearring == 'left'):
transferx = x+1
transfery = y
else:
transferx = x
transfery = y+1
return transferx,transfery
def go_back(self,current):
position = self.get_next_direction("forward")
position1 = self.get_next_direction("right")
position2 = self.get_next_direction("left")
position3 = self.get_next_direction("back")
nextDir = ""
if(current == position):
nextDir = 'forward'
elif(current == position1):
nextDir = 'right'
elif(current == position2):
nextDir = 'left'
elif(current == position3):
nextDir = 'back'
return nextDir
def set_coordinate(self,bearring):
global originalDir
global x
global y
if(originalDir == 'north'):
if(bearring == 'right'):
x += 1
originalDir = 'east'
elif(originalDir == 'forward'):
y += 1
originalDir = 'north'
elif(originalDir == 'left'):
x -= 1
originalDir = 'west'
else:
y -= 1
originalDir = 'south'
elif(originalDir == 'east'):
if(bearring == 'right'):
y -= 1
originalDir = 'south'
elif(bearring == 'forward'):
x += 1
originalDir = 'east'
elif(bearring == 'left'):
y += 1
originalDir = 'north'
else:
x -= 1
originalDir = 'west'
elif(originalDir == 'west'):
if(bearring == 'right'):
y += 1
originalDir = 'north'
elif(bearring == 'forward'):
x -= 1
originalDir = 'west'
elif(bearring == 'left'):
y -= 1
originalDir = 'south'
else:
x += 1
originalDir = 'east'
elif(originalDir == 'south'):
if(bearring == 'right'):
x -= 1
originalDir = 'west'
elif(bearring == 'forward'):
y -= 1
originalDir = 'south'
elif(bearring == 'left'):
x += 1
originalDir = 'east'
else:
y += 1
originalDir = 'north'
def mapping_maze(self,senf,senr,senl):
sr = senr
sf = senf
sl = senl
direction =""
global visitedStack
global x
global y
global originalDir
if len(visitedStack)== 0:
self.set_coordinate((0,0))
visitedStack.append((0,0))
dfs.append((0,0))
if len(visitedStack)== 49:
direction = "stop"
else:
if((sf == 0)and(sr == 1)and(sl==1)):
nextPosition = self.get_next_direction("forward")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("forward")
direction = "forward"
elif((sf==1)and(sr==0)and(sl==1)):
nextPosition = self.get_next_direction("right")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("right")
direction = "right"
elif((sf==1)and(sr==1)and(sl==0)):
nextPosition = self.get_next_direction("left")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("left")
direction = "left"
elif((sf==1)and(sr==0)and(sl==0)):
nextPosition = self.get_next_direction("right")
if(nextPosition in visitedStack):
nextPosition = self.get_next_direction("left")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("left")
direction = "left"
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("right")
direction = "right"
elif((sf==0)and(sr==0)and(sl==1)):
nextPosition =self.get_next_direction("forward")
if(nextPosition in visitedStack):
nextPosition = self.get_next_direction("right")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("right")
direction = "right"
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("forward")
direction = "forward"
elif((sf==0)and(sr==1)and(sl==0)):
nextPosition = self.get_next_direction("forward")
if(nextPosition in visitedStack):
nextPosition = self.get_next_direction("left")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("left")
direction = "left"
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("forward")
direction = "forward"
elif((sf==0)and(sr==0)and(sl==0)):
nextPosition = self.get_next_direction("forward")
if(nextPosition in visitedStack):
nextPosition = self.get_next_direction("right")
if(nextPosition in visitedStack):
nextPosition = self.get_next_direction("left")
if(nextPosition in visitedStack):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("left")
direction = "left"
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("right")
direction = "right"
else:
visitedStack.append(nextPosition)
dfs.append(nextPosition)
self.set_coordinate("forward")
direction = "forward"
elif((sf==1)and(sr==1)and(sl==1)):
dfs.pop()
rover = dfs[-1]
rovercurrent = self.go_back(rover)
self.set_coordinate(rovercurrent)
direction = rovercurrent
return direction
求大神指教,真的很着急,这个是期末作业,考试前一定要完成,否则将不能考试