有很多答案说这是不明智的,但是我发现了一种我认为有用的方案。如果我错了,请纠正我,还有更好的方法。
我正在建立一个国际象棋游戏,其中个别棋子继承自超类Chesspiece
:
class ChessPiece:
def __init__(self, pos, color, num, piece):
...
每件作品都有一个定义可以采取的动作的方法:
class Knight(ChessPiece):
def __init__(self, pos, color=None, num=''):
ChessPiece.__init__(self, pos, color, num, self.__class__.__name__)
def possible_moves(self):
pos_moves = []
# Up, Right (1 space, 2 spaces)
try:
if 1 <= self.x + 2 <= len(Config.board) and 1 <= self.y - 1 <= len(Config.board):
if Config.board[self.x + 2][self.y - 1] == '___':
pos_moves.append(f'{Config.tile_convert(self.x + 2)}{Config.tile_convert(self.y - 1, True)}')
except Exception: pass
#Up, Left
...
return pos_moves
我想实现一个move()
函数。 move()
函数的代码对于每个棋子都是相同的,不同的是,它必须将建议的棋步与可能的棋子进行比较,因为每个棋子都可能有所不同。我可以为每个代码块创建一个move()
函数,但这将重复代码6次。
因此,我想在move()
中定义Chesspiece
,并引用每个文件的possible_moves()
函数。
答案 0 :(得分:1)
在父级中实现空的possible_moves
更简单:
class ChessPiece:
...
def possible_moves(self):
raise NotImplementedError
def move(self, pos):
if pos in self.possible_moves():
...
或者甚至在父类中返回一组空的动作:
def possible_moves(self):
return set()
但是我认为第一个比较好,因此它会强制所有子类实现它以便有用。