Compare commits

..

9 Commits

Author SHA1 Message Date
8dc989a0a8 Part f 2026-03-30 09:35:47 -04:00
5e3b122ab1 spacing 2026-03-30 09:25:54 -04:00
6c2d865d96 modified dfs() for part e 2026-03-30 09:25:29 -04:00
98a59532da part d 2026-03-30 09:21:53 -04:00
2f6dd3858c added to main 2026-03-30 09:19:29 -04:00
d4b6db8edf added main 2026-03-30 09:19:13 -04:00
9ca023025b added part b of step 4 2026-03-30 09:17:33 -04:00
97bdfd1907 added imports 2026-03-30 09:16:47 -04:00
ee4da2417d Finished step 2 2026-03-30 09:12:30 -04:00
5 changed files with 122 additions and 5 deletions

106
Project 5/TurtleDFS.py Normal file
View File

@@ -0,0 +1,106 @@
######################################
# DCS 229 -- TurtleDFS
# Depth-First Search implementation for Turtle Maze
# Date: 03/29/2026
# Name: Benjamin Adovasio
# Resources Used: I worked with Pat Cohen on the project.
##########################################
import os
from Stack import Stack
from TurtleMaze import TurtleMaze, Cell, Contents
def get_neighbors(maze: TurtleMaze, cell: Cell) -> list[Cell]:
'''returns a list of non-obstacle neighbors in north, south, east, west order'''
neighbors = []
row = cell.y
col = cell.x
# north
if row - 1 >= 0:
north = maze[row - 1][col]
if not north.isBlocked():
neighbors.append(north)
# south
if row + 1 < len(maze.maze_grid):
south = maze[row + 1][col]
if not south.isBlocked():
neighbors.append(south)
# east
if col + 1 < len(maze[0]):
east = maze[row][col + 1]
if not east.isBlocked():
neighbors.append(east)
# west
if col - 1 >= 0:
west = maze[row][col - 1]
if not west.isBlocked():
neighbors.append(west)
return neighbors
def dfs(maze: TurtleMaze) -> bool:
'''runs a non-recursive depth first search on the maze with backtracking
Returns:
True if the goal is found, False otherwise
'''
stack = Stack()
start = maze.getStart()
visited = set()
stack.push(start)
visited.add((start.y, start.x))
maze.updatePosition(start)
while not stack.is_empty():
current = stack.peek()
# if we reached the goal, we are done
if current.isGoal():
return True
found_next = False
# look for an unvisited neighbor
for neighbor in get_neighbors(maze, current):
if (neighbor.y, neighbor.x) not in visited:
neighbor.setParent(current)
visited.add((neighbor.y, neighbor.x))
stack.push(neighbor)
if not neighbor.isGoal():
maze.updatePosition(neighbor, Contents.TRIED)
else:
maze.updatePosition(neighbor)
found_next = True
break
# if no unvisited neighbor exists, backtrack
if not found_next:
dead_end = stack.pop()
if dead_end != start and not dead_end.isGoal():
maze.updatePosition(dead_end, Contents.DEAD_END)
if not stack.is_empty():
maze.updatePosition(stack.peek())
return False
def main():
maze = TurtleMaze('maze_1.txt')
maze.drawMaze()
solved = dfs(maze)
print("Maze solved:", solved)
maze.t.screen.mainloop()
if __name__ == "__main__":
main()

View File

@@ -235,16 +235,27 @@ class TurtleMaze:
def main():
maze = TurtleMaze('maze_3.txt')
maze = TurtleMaze('maze_2.txt')
maze.drawMaze()
# print("row at index 4", maze[4])
# print("cell at index 4, 4", maze[4][4])
# print the contents of the top-right corner
top_right = maze[0][len(maze[0]) - 1]
print("Top-right corner:", top_right)
# print the start and goal cells
print("Start cell:", maze.getStart())
print("Goal cell:", maze.getGoal())
# start at S
maze.updatePosition(maze.getStart())
print(maze.getStart())
# move only to neighboring cells so the turtle stays on the path
maze.updatePosition(maze[9][15], Contents.TRIED) # down 1
maze.updatePosition(maze[9][16], Contents.PART_OF_PATH) # right 1
maze.updatePosition(maze[9][17], Contents.PART_OF_PATH) # right 1
maze.updatePosition(maze[8][17], Contents.DEAD_END) # up 1
maze.t.screen.mainloop()
if __name__ == "__main__":
main()