저는 파이썬에서 이상한 문제에 직면하고 있습니다. 나는 미로가있다. x는 벽을 의미하고, g는 목표이고, s는 출발점이며, 숫자는 하나의 숫자에서 다른 숫자로 이동하는 포털이다. (예를 들어, 2로 가면 당신을 기타 2).파이썬은 문자열을 비교하지 못합니다.
xxxxxxxxxxxxxxxxxxxx
x2 x
x xxx x
x 1 x xxxxx x
x s x x
x x x xxxxxxx
x xx xxxxx x
x x g x
x 1 x 2 x
xxxxxxxxxxxxxxxxxxxx
모든 포털을 찾아서 배열에 넣으려고합니다. 지금까지이 작업을 통해 프로그램은 네 개의 포털을 모두 찾습니다.
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
file = filedialog.askopenfilename()
def readMazeToArray(path):
with open(path) as f:
return [list(line.strip()) for line in f]
maze = readMazeToArray(file)
def findPortals(maze):
portals = []
for i in range(0, len(maze)):
for j in range(0, len(maze[i])):
if (maze[i][j] != 'g' and maze[i][j] != 's'
and maze[i][j] != 'x' and maze[i][j] != ' '):
portals.append([i, j])
return portals
그런 다음부터는 다소 이상해집니다. 여기에 바로 작동하지 않는 코드는 다음과 같습니다
def portalHeuristic(maze, x1, x2, y1, y2):
portals = findPortals(maze)
for portal in portals:
for i in range(0, len(maze)):
for j in range(0, len(maze[i])):
if maze[i][j] == maze[portal[0]][portal[1]]
and (portal[0] != i or portal[1] != j):
return abs(x1 - portal[0]) + abs(y1 - portal[1])
+ abs(x2 - i) + abs(y2 - j))
print(maze[i][j] == maze[portal[0]][portal[1]])
print("x1 = ", x1, ", y1 = ", y1, ", portal0 = ",
portal[0], ", portal1 = ", portal[1], ", x2 = ",
x2, ", y2 = ", y2, ", i = ", i, ", j = ", j)
portalHeuristic(maze, 4, 4, 7, 14)
무엇 portalHeuristic
기본적으로이 반복 현재 포털의 동일한 기호 (maze[i][j] == maze[portal[0]][portal[1]]
)을 찾고 연이어 포털을 통해 지금 수행하지만 'didn를 보장 현재 포털의 좌표와 발견 된 포털의 좌표를 같은 기호/숫자 (portal[0] != i or portal[1] != j
)와 비교하여 현재 포털 자체를 찾습니다. 결국 그것은 시작 지점과 현재 포털 및 쌍둥이 포털과 목표 사이의 거리를 계산합니다.
그러나 내 프로그램이 항상 다른 포털을 찾을 수 있기 때문에 maze[i][j] == maze[portal[0]][portal[1]]
이 작동하지 않는 것 같습니다. i = 9, j = 19, 어떤 포털이든 상관 없습니다. 이상하게도 필자가 파이썬에서 문자열의 동등성을 테스트하면 항상 거짓이라는 것을 알 수 있습니다. 내가 도대체 뭘 잘못하고있는 겁니까? 나는 이제 오류를 찾기 위해 3 시간 이상을 보냈지 만 그것을 찾을 수없는 것 같습니다. 어쩌면 정말 바보예요? 또한 내 끔찍한 코드를 참아주십시오. 방금 파이썬으로 시작했습니다.
도와 주셔서 대단히 감사합니다, 또한 기사를 게시하기 위해! 나는 아직도 내 경험적 방법을 어떻게 계산할 것인지는 아직 확실치 않다 ... 나는이 값을 내 함수에주기 위해서 동시에 두 튜플의 모든 값을 필요로 할 것이다. 두 번째 튜플이 먼저 발견 된 경우 나중에 값의 순서를 변경해야합니다. –