Python 检查完美迷宫输入的验证
我正在做一个建造完美迷宫的项目。 我有一个类迷宫和一个表示迷宫中每个正方形的类单元格。在我的Cell类中,我有四个布尔变量(北、南、东、西)来表示在北还是南有墙。。一间牢房。还有一个名为visit的布尔变量,用于检查单元格是否已被访问。下面是我为Cell类初始化的代码Python 检查完美迷宫输入的验证,python,recursion,path-finding,maze,Python,Recursion,Path Finding,Maze,我正在做一个建造完美迷宫的项目。 我有一个类迷宫和一个表示迷宫中每个正方形的类单元格。在我的Cell类中,我有四个布尔变量(北、南、东、西)来表示在北还是南有墙。。一间牢房。还有一个名为visit的布尔变量,用于检查单元格是否已被访问。下面是我为Cell类初始化的代码 def __init__(self): self.north = True self.south = True self.east = True self.west = True self.
def __init__(self):
self.north = True
self.south = True
self.east = True
self.west = True
self.visit = False
对于迷宫类,我有self.Maze(一堆细胞)和self.size=N(构建一个N*N的迷宫)。
下面是类迷宫的init():
def __init__(self, N):
self.size = N
self.maze = [[i for i in range(N + 2)] for i in range(N + 2)]
for r in range(self.size + 2):
for c in range(self.size + 2):
self.maze[r][c] = Cell()
在更新maze的索引时,我编写了两个函数来检查newX和newY是否在Python中的1范围内,如果不指定另一个开始位置,则以0开始。因此,当您初始化迷宫时,在(0,*)
和(*,0)
中有单元格:
当你计算你的邻居时,你不会检查你是否没有出去:
neighbor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
只有在将new
指定给这样一个坐标后,您才能检查它是否有效。但是,如果它无效并且没有邻居,那么您将再次调用walk
。您应该独立于访问
检查范围内的
此外,您的循环只能运行一次,因为new
是有效的,您可以跳出循环,或者它是无效的,您可以跳出循环
最后,您忘了给我们提供search
函数和s
是什么(而且s.pop
看起来很有趣,因为pop
的参数通常是一个索引,而不是序列)。您可以通过仔细查看walk()
找到这一点,或者用print
语句对其进行飞溅以跟踪。
在网格的端点(当x或y==0或N-1时)出现问题。除非您允许wrapparound,否则我假设您的网格初始化将墙放置在网格的北部(y==0)、南部、东部和西部。
顺便说一句,您的网格有两个不必要的行和列:如果您想要N个单元格,编号为O..(N-1),那么使用range(N)
,而不是range(N+2)
,或者使用range(1,N+1)
。(是否用valid==False填充任何不需要的单元格?)
无论如何,walk()
首先选择一个随机的相邻单元,如果它是一个有效单元,则中断while循环。但如果不是,它会欣然挑选任何剩余的邻居单元(不管是否有效),并继续前进。那是你的错误。始终测试有效性。
如果它已经用完了有效的邻居单元,它将通过执行s.pop(s)
进行回溯s.pop
看起来也像一个bug。为什么不s.pop()
?
顺便说一句,调用变量path
,而不是s
此外,这只是检查坐标的有效性;你从来没有真正检查过你是否访问过那个单元,所以递归回溯没有终止条件;你可以很容易地进行循环
如果将walk()
重构为使用一个单独的生成器get\u random\u valid\u neighbor()
,它返回随机选择的已测试为有效的邻居(当邻居用完时,None
)
又是一周了吗?为什么到处都使用范围(N+2)
?这将创建一个(N+1)x(N+1)迷宫。只需创建一个单元格。很高兴提供帮助。你能为迷宫和单元发布你的课程代码吗?如果s.size()==self.size**2:return
检查,那么什么是?这是怎样的终止条件?除非你试图随机发现长度为N**2的路径(但它们不一定是循环或完全遍历),因为教授说要构建一个N+2迷宫来避免一些繁琐的问题。老实说,我也不知道原因。
def walk(self, s, x, y):
neighbor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
if s.size() == self.size**2: return
else:
while True:
new = choice(neighbor)#choice() is import from random
#print(self.is_valid(new[0], new[1]))
if self.is_valid(new[0], new[1]):break
else:
if len(neighbor) != 0:
neighbor.remove(new)
new = choice(neighbor)
else:
temp = s.pop(s)
self.walk(s, temp[0], temp[1])
break
print(new)
>>> ================================ RESTART
================================
>>>
>>> a = Maze(5)
>>> a.search()
1 2
(1, 3)
(2, 3)
(2, 4)
(1, 4)
(2, 4)
(2, 5)
(3, 5)
(4, 5)
(4, 4)
(4, 3)
(3, 3)
(3, 2)
(2, 2)
(2, 1)
(1, 1)
(0, 1)
(-1, 1)
(0, 1)
(1, 1)
(0, 1)
(-1, 1)
(-1, 2)
(-1, 1)
(0, 1)
for r in range(self.size + 2):
for c in range(self.size + 2):
self.maze[r][c] = Cell()
neighbor = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
def walk(self, s, x, y):
...
while True:
new = choice(neighbor)
if self.is_valid(new[0], new[1]):break # tested for validity
else:
if len(neighbor) != 0:
neighbor.remove(new)
new = choice(neighbor) # BUG: never tested for validity
...