更新一次攻击时更新攻击位板

update attack bit board when one attack is updated

这只是一个原则。我希望在更改其中一个攻击位板(骑士、主教或典当)时更新被攻击的位板,而不必重复第 1 行。这可能吗?做这个的最好方式是什么?在 borg class 方式或简单地使用字典的行为:

  1. 攻击=pawn_attacks | knight_attacks | bishop_attacks

  2. pawn_attacks = (1 << (pawn + 9)) | (1<< (棋子 + 7))

当其中一种攻击发生变化时,这不会透明/自动地工作。下面被攻击的结果总是1.

class Test(object):
    def __init__(self):
        self.pawn_attacks = 0
        self.knight_attacks = 0
        self.bishop_attacks = 0

    @property
    def attacked(self):
        return self.pawn_attacks | self.knight_attacks | self.bishop_attacks

test = Test()
test.pawn_attacks = 1
print test.attacked
test.pawn_attacks = 2
print test.attacked

如果您正在编写 class,您可以将 attacked 设为(只读)属性,以便在需要时透明地重新计算它:

... rest of the class ...

@property
def attacked(self):
    return self.pawn_attacks | self.knight_attacks | self.bishop_attacks

现在给定 class 的实例 xx.attacked 将始终是最新的(不保证只在需要时才重新计算缓存,因为操作是这样的无论如何都是初级的)。

如果您不愿意制作 class,则必须专门制作 attacked 函数 才能使相同的想法发挥作用。然而,虽然 Python 不会像其他一些语言那样强制您使用 classes,但是当 classes 提供结构 and/or 便利时使用 classes,就像这里一样,是还是个好主意:-)