作为练习,作为我想到的更复杂,更大的项目的前身,我使用Turtle模块创建了一个随机游走脚本。我意识到有更简单的方法来进行随机游走而不必找到相邻的坐标,但据我所知,这对于更大的实现是必要的。
我遇到的问题是当python发现它已访问getnext()
函数中的每个相邻单元格时,它正在达到其最大递归深度。我不确定如何逃脱该循环并继续正常发生。
import turtle
import random
class cell(object):
def __init__(self, pos, visited = False):
self.xCoord = pos[0]
self.yCoord = pos[1]
self.visited = visited
self.neigh = []
self.neighbors = self.getneighbors()
def getneighbors(self):
for j in (-1, 0, 1):
for i in (-1, 0, 1):
self.neigh.append((self.xCoord+i, self.yCoord+j))
def getnext():
nextindex = random.randint(0, len(c.neigh)-1)
nextcoordt = c.neigh[nextindex]
nextcoord = list(c.neigh[nextindex])
if nextcoordt in coords:
getnext()
else:
turtle.goto(nextcoord[0], nextcoord[1])
coords = {}
turtle.setup(width =200, height = 200, startx = 0, starty = 0)
turtle.trace = False
for i in range(1000):
c = cell(list(turtle.pos()))
coords[turtle.pos()] = (c)
getnext()
此外,这实际上是我对OOP的第一次真正应用,我想知道这是否是一种使用它的好方法。
非常感谢!
答案 0 :(得分:2)
如果随机游走发现它已访问过每个相邻的单元格,它将永远循环。由于您正在使用递归,因此它会快速超过最大递归限制。
我确信这可以用OOP方式编写,但问题在于使用递归比在cell
类是否有用时更多。例如,我简化了您的代码以线性方式运行。变化是:
random.choice()
选择下一步行动的方向。代码:
import itertools
import random
import turtle
# change step size if you like
STEP = 1
PTS = [-STEP, 0, STEP]
DIRS = [(x, y) for x in PTS for y in PTS if x or y]
turtle.setup(width=400, height=400, startx=0, starty=0)
turtle.trace = False
pos = turtle.pos()
for i in range(1000):
px, py = turtle.pos()
# direction of next move
xd, yd = random.choice(DIRS)
# set pos to current pos + direction vector
turtle.goto(px + xd, py + yd)