Tkinter Gui For Astar 算法
Tkinter Gui For Astar algorithm
我正在尝试制作 Astar 算法的输入迷宫(找到起点和目的地之间的最短路径的算法,迷宫内可能会有一些障碍物,
它只输入一个表示阻塞的迷宫,如下所示。
在 GUI 中,在每个按钮中使用 Click1 命令,
我打算得到这样的输出(我在 [3][2] 处插入了一个阻塞)。
1代表从头到尾找到路径要避免的阻塞。
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
但我得到如下输出,我不明白为什么它会阻塞每一行的同一列
[[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0]]
我在 init(): 的 class App() 中创建了这个迷宫:
def __init__(self, master,dimension,indexes):
self.maze=[[0]*self.dimension]*self.dimension
这一切都在 class App():
用于创建按钮网格并存储它们的引用
self.gid = []
for i in range(self.dimension):
row = []
Grid.rowconfigure(self.frame1, i + 1, weight=3)
for j in range(self.dimension):
Grid.columnconfigure(self.frame1, j + 1, weight=3)
btn=Button(self.frame1,command=lambda i=i, j=j: self.Click1(i, j))
btn.grid(sticky=N+S+E+W,padx=2,pady=2,ipadx=1,ipady=1)
row.append(btn)
row[-1].grid(row=i + 1, column=j+1)
self.gid.append(row)
Click1 method/Command 也在此 class:
def Click1(self, i, j):
self.indxes.append((i,j))
if len(self.indxes)==1:
self.gid[i][j]["bg"]="blue" #indicates start
elif len(self.indxes)==2:
self.gid[i][j]["bg"]="green" #indicates destinations
else:
self.gid[i][j]["bg"] = "black"
self.maze[i][j] = 1 #how I insert blockage within the maze
在你的初始化中试试这个:
def __init__(self, master,dimension,indexes):
self.maze = [[0] * self.dimension] for _ in range(self.dimension)]
后一个 * self.dimension
调用将相同的引用分配给所有内部列表(维度次数)——这意味着当一个被改变时,所有的都会改变。
这会为每个子列表创建一个唯一的列表
我正在尝试制作 Astar 算法的输入迷宫(找到起点和目的地之间的最短路径的算法,迷宫内可能会有一些障碍物, 它只输入一个表示阻塞的迷宫,如下所示。
在 GUI 中,在每个按钮中使用 Click1 命令,
我打算得到这样的输出(我在 [3][2] 处插入了一个阻塞)。
1代表从头到尾找到路径要避免的阻塞。
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
但我得到如下输出,我不明白为什么它会阻塞每一行的同一列
[[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0]]
我在 init(): 的 class App() 中创建了这个迷宫:
def __init__(self, master,dimension,indexes):
self.maze=[[0]*self.dimension]*self.dimension
这一切都在 class App():
用于创建按钮网格并存储它们的引用
self.gid = []
for i in range(self.dimension):
row = []
Grid.rowconfigure(self.frame1, i + 1, weight=3)
for j in range(self.dimension):
Grid.columnconfigure(self.frame1, j + 1, weight=3)
btn=Button(self.frame1,command=lambda i=i, j=j: self.Click1(i, j))
btn.grid(sticky=N+S+E+W,padx=2,pady=2,ipadx=1,ipady=1)
row.append(btn)
row[-1].grid(row=i + 1, column=j+1)
self.gid.append(row)
Click1 method/Command 也在此 class:
def Click1(self, i, j):
self.indxes.append((i,j))
if len(self.indxes)==1:
self.gid[i][j]["bg"]="blue" #indicates start
elif len(self.indxes)==2:
self.gid[i][j]["bg"]="green" #indicates destinations
else:
self.gid[i][j]["bg"] = "black"
self.maze[i][j] = 1 #how I insert blockage within the maze
在你的初始化中试试这个:
def __init__(self, master,dimension,indexes):
self.maze = [[0] * self.dimension] for _ in range(self.dimension)]
后一个 * self.dimension
调用将相同的引用分配给所有内部列表(维度次数)——这意味着当一个被改变时,所有的都会改变。
这会为每个子列表创建一个唯一的列表