On 29/06/2018 09:01, Ian Kelly wrote:
On Thu, Jun 28, 2018 at 10:06 PM Ben Finney <ben+pyt...@benfinney.id.au> wrote:

@total_ordering
class ChessPiece(Enum):
     PAWN = 1, 'P'
     KNIGHT = 2, 'N'
     BISHOP = 3, 'B'
     ROOK = 4, 'R'
     # ...

     @property
     def label(self):
         return self.value[1]

     def __lt__(self, other):
         assert isinstance(other, ChessPiece)
         return self.value < other.value

This enum type defines its own ordering based on the relative values
of the chess pieces.

class ChessPiece(Enum):
     PAWN = 'P', pawn_moves, pawn_attacks
     KNIGHT = 'N', knight_moves, knight_attacks
     BISHOP = 'B', bishop_moves, bishop_attacks
     ROOK = 'R', rook_moves, rook_attacks
     # ...

     def moves(self, board, from_square):
         return self.value[1](board, from_square)

     def attacks(self, board, from_square):
         return self.value[2](board, from_square)

Now, elsewhere we can easily do something like:

     all_moves = []
     for square in board:
         piece = board[square]
         if piece:
             all_moves.extend(piece.moves(board, square))

Et voila. ChessPiece is still an enum as it should be, and it also has
a useful API on top of that.
I get the feeling is that the enum (PAWN, BISHOP etc) is a property of a piece, rather than being the cornerstone of everything you might think of doing with a chess-piece.

That thinking keeps the that property as a simple type, a simple enum of six distinct values with nothing else piled on top to complicate matters. And it means the same enum can be used in other contexts associated with chess where that other data may be irrelevant.

--
bart
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to