1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| import turtle
PART_OF_PATH = 'O' TRIED = '.' OBSTACLE = '+' DEAD_END = '-'
class Maze: def __init__(self,mazeFileName): rowsInMaze = 0 columnsInMaze = 0 self.mazelist = [] mazeFile = open(mazeFileName,'r') rowsInMaze = 0 for line in mazeFile: rowList = [] col = 0 for ch in line[:-1]: rowList.append(ch) if ch == 'S': self.startRow = rowsInMaze self.startCol = col col = col + 1 rowsInMaze = rowsInMaze + 1 self.mazelist.append(rowList) columnsInMaze = len(rowList)
self.rowsInMaze = rowsInMaze self.columnsInMaze = columnsInMaze self.xTranslate = -columnsInMaze/2 self.yTranslate = rowsInMaze/2 self.t = turtle.Turtle() self.t.shape('turtle') self.wn = turtle.Screen() self.wn.setworldcoordinates(-(columnsInMaze-1)/2-.5,-(rowsInMaze-1)/2-.5,(columnsInMaze-1)/2+.5,(rowsInMaze-1)/2+.5)
def drawMaze(self): self.t.speed(10) for y in range(self.rowsInMaze): for x in range(self.columnsInMaze): if self.mazelist[y][x] == OBSTACLE: self.drawCenteredBox(x+self.xTranslate,-y+self.yTranslate,'orange') self.t.color('black') self.t.fillcolor('blue')
def drawCenteredBox(self,x,y,color): self.t.up() self.t.goto(x-.5,y-.5) self.t.color(color) self.t.fillcolor(color) self.t.setheading(90) self.t.down() self.t.begin_fill() for i in range(4): self.t.forward(1) self.t.right(90) self.t.end_fill()
def moveTurtle(self,x,y): self.t.up() self.t.setheading(self.t.towards(x+self.xTranslate,-y+self.yTranslate)) self.t.goto(x+self.xTranslate,-y+self.yTranslate)
def dropBreadcrumb(self,color): self.t.dot(10,color)
def updatePosition(self,row,col,val=None): if val: self.mazelist[row][col] = val self.moveTurtle(col,row)
if val == PART_OF_PATH: color = 'green' elif val == OBSTACLE: color = 'red' elif val == TRIED: color = 'black' elif val == DEAD_END: color = 'red' else: color = None
if color: self.dropBreadcrumb(color)
def isExit(self,row,col): return (row == 0 or row == self.rowsInMaze-1 or col == 0 or col == self.columnsInMaze-1 )
def __getitem__(self,idx): return self.mazelist[idx]
def searchFrom(maze, startRow, startColumn): maze.updatePosition(startRow, startColumn) if maze[startRow][startColumn] == OBSTACLE : return False if maze[startRow][startColumn] == TRIED or maze[startRow][startColumn] == DEAD_END: return False if maze.isExit(startRow,startColumn): maze.updatePosition(startRow, startColumn, PART_OF_PATH) return True maze.updatePosition(startRow, startColumn, TRIED) found = searchFrom(maze, startRow-1, startColumn) or \ searchFrom(maze, startRow+1, startColumn) or \ searchFrom(maze, startRow, startColumn-1) or \ searchFrom(maze, startRow, startColumn+1) if found: maze.updatePosition(startRow, startColumn, PART_OF_PATH) else: maze.updatePosition(startRow, startColumn, DEAD_END) return found
myMaze = Maze('maze2.txt') myMaze.drawMaze() myMaze.updatePosition(myMaze.startRow,myMaze.startCol)
searchFrom(myMaze, myMaze.startRow, myMaze.startCol)
|