mirror of
https://github.com/maoakeEnterprise/amazing.git
synced 2026-04-28 16:04:35 +02:00
125 lines
3.5 KiB
Python
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
|