AD0DE412
опредилить ближе или дальше стала фигура
а разве этого требует задание? Насколько я понял, нужно для любой фигуры определить, разрешено ли для нее то или иное перемещение. Ладья ходит строго по горизонтали, поэтому для неё ход А1=А8 разрешен, а слона - нет, потому что слон ходит по диагоналям. Расстояние вам понадобится для фигур пешка и король. Задание вообще идиотское, потому что в реальных шахматах правила сложнее. Король, например, не всегда перемещается на одну клетку, как и пешка. Но, я думаю, этим можно пренебречь, как и направлением перемещения пешек. Итак, дано задание - “есть шахматные фигуры…”. Дальше можно не читать, мы должны начать описывать фигуры в коде. Не какие-то литералы “h” и “w” понятные только автору изобретать, не странные структуры, не понятно на кой нужные вообще, а описывать нашу предметную область.
from abc import ABC, abstractmethod
from dataclasses import dataclass
@dataclass
class CellDelta:
x: int
y: int
@dataclass
class Cell:
x: int
y: str
def difference(self, another: "Cell") -> CellDelta:
return CellDelta(abs(self.x - another.x), abs(ord(self.y) - ord(another.y)))
@classmethod
def form_string(cls, s: str) -> "Cell":
y, x = s[0].lower(), int(s[1])
return cls(x, y)
class BaseFigure(ABC):
def __init__(self, cell: Cell):
self.cell = cell
@abstractmethod
def can_move(self, cell: Cell) -> bool:
pass
class Rook(BaseFigure):
def can_move(self, cell: Cell) -> bool:
diff = self.cell.difference(cell)
return diff.x == 0 or diff.y == 0
class Bishop(BaseFigure):
def can_move(self, cell: Cell) -> bool:
diff = self.cell.difference(cell)
return diff.x == diff.y
print(Bishop(Cell.form_string("a1")).can_move(Cell.form_string("a2")))
print(Bishop(Cell.form_string("a1")).can_move(Cell.form_string("b2")))