maze-solver/cell.py
Dan Anglin 2ebb555bac
fix: only draw the graphics if the window exists
Optionally pass in the reference of the Window to the Maze and
Cell classes, and only draw the graphics if the reference exists.

Use a single underscore instead of the double underscore for private
Class members.
2024-02-13 13:39:25 +00:00

90 lines
2.6 KiB
Python

from graphics import Window, Point, Line
class Cell:
"""
A Cell represents a grid on the maze.
"""
def __init__(
self,
x1: int, y1: int,
x2: int, y2: int,
window: Window = None,
) -> None:
# Define the cell walls
top_wall = Line(Point(x1, y1), Point(x2, y1))
bottom_wall = Line(Point(x1, y2), Point(x2, y2))
left_wall = Line(Point(x1, y1), Point(x1, y2))
right_wall = Line(Point(x2, y1), Point(x2, y2))
self._top_wall = CellWall(top_wall)
self._bottom_wall = CellWall(bottom_wall)
self._left_wall = CellWall(left_wall)
self._right_wall = CellWall(right_wall)
# Calculate the cell's central point
centre_x = x1 + ((x2 - x1) / 2)
centre_y = y1 + ((y2 - y1) / 2)
self._centre = Point(centre_x, centre_y)
# A reference to the root Window class for drawing purposes.
self._window = window
def configure_walls(
self,
top: bool = True,
bottom: bool = True,
left: bool = True,
right: bool = True,
) -> None:
"""
configure_walls configures the existence of the Cell's walls.
"""
self._top_wall.exists = top
self._bottom_wall.exists = bottom
self._left_wall.exists = left
self._right_wall.exists = right
def centre(self) -> Point:
"""
centre returns the Cell's central point
"""
return self._centre
def draw(self) -> None:
"""
draw draws the cell onto the canvas
"""
if self._window:
if self._top_wall.exists:
self._window.draw_line(self._top_wall.line)
if self._bottom_wall.exists:
self._window.draw_line(self._bottom_wall.line)
if self._left_wall.exists:
self._window.draw_line(self._left_wall.line)
if self._right_wall.exists:
self._window.draw_line(self._right_wall.line)
def draw_move(self, to_cell: 'Cell', undo: bool = False) -> None:
"""
draw_move draws a path between the centre of this cell and
the centre of the given cell.
"""
if self._window:
fill_colour = "red"
if undo:
fill_colour = "grey"
line = Line(self.centre(), to_cell.centre())
self._window.draw_line(line, fill_colour)
class CellWall:
"""
A CellWall represents the existence (or non-existence) of
a Cell's wall.
"""
def __init__(self, line: Line) -> None:
self.exists = True
self.line = line