Files
amazing/src/mazegen/Cell.py
T
2026-04-01 22:31:08 +02:00

125 lines
3.5 KiB
Python

from dataclasses import dataclass
@dataclass
class Cell:
"""Represent a maze cell encoded as a bitmask of surrounding walls.
The cell value is stored as an integer where each bit represents the
presence of a wall in one cardinal direction:
- bit 0 (1): north wall
- bit 1 (2): east wall
- bit 2 (4): south wall
- bit 3 (8): west wall
"""
def __init__(self, value: int) -> None:
"""Initialize a cell with its encoded wall value.
Args:
value: Integer bitmask representing the cell walls.
"""
self.value = value
def __str__(self) -> str:
"""Return the hexadecimal representation of the cell value.
Returns:
The uppercase hexadecimal form of the cell value without the
``0x`` prefix.
"""
return hex(self.value).removeprefix("0x").upper()
def set_value(self, value: int) -> None:
"""Set the encoded value of the cell.
Args:
value: Integer bitmask representing the cell walls.
"""
self.value = value
def get_value(self) -> int:
"""Return the encoded value of the cell.
Returns:
The integer bitmask representing the cell walls.
"""
return self.value
def set_north(self, is_wall: bool) -> None:
"""Set or clear the north wall.
Args:
is_wall: ``True`` to add the north wall, ``False`` to remove it.
"""
if (not is_wall and self.value | 14 == 15) or (
is_wall and self.value | 14 != 15
):
self.value = self.value ^ (1)
def get_north(self) -> bool:
"""Return whether the north wall is present.
Returns:
``True`` if the north wall is set, otherwise ``False``.
"""
return self.value & 1 == 1
def set_est(self, is_wall: bool) -> None:
"""Set or clear the east wall.
Args:
is_wall: ``True`` to add the east wall, ``False`` to remove it.
"""
if (not is_wall and self.value | 13 == 15) or (
is_wall and self.value | 13 != 15
):
self.value = self.value ^ (2)
def get_est(self) -> bool:
"""Return whether the east wall is present.
Returns:
``True`` if the east wall is set, otherwise ``False``.
"""
return self.value & 2 == 2
def set_south(self, is_wall: bool) -> None:
"""Set or clear the south wall.
Args:
is_wall: ``True`` to add the south wall, ``False`` to remove it.
"""
if (not is_wall and self.value | 11 == 15) or (
is_wall and self.value | 11 != 15
):
self.value = self.value ^ (4)
def get_south(self) -> bool:
"""Return whether the south wall is present.
Returns:
``True`` if the south wall is set, otherwise ``False``.
"""
return self.value & 4 == 4
def set_west(self, is_wall: bool) -> None:
"""Set or clear the west wall.
Args:
is_wall: ``True`` to add the west wall, ``False`` to remove it.
"""
if (not is_wall and self.value | 7 == 15) or (
is_wall and self.value | 7 != 15
):
self.value = self.value ^ (8)
def get_west(self) -> bool:
"""Return whether the west wall is present.
Returns:
``True`` if the west wall is set, otherwise ``False``.
"""
return self.value & 8 == 8