0

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

  1. 被攻击 = pawn_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
4

1 回答 1

0

如果您正在编写一个类,您可以创建attacked一个(只读)属性,以便在需要时透明地重新计算它:

... rest of the class ...

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

现在给定一个类的实例xx.attacked它将始终是最新的(缓存仅在需要时重新计算是没有保证的,因为无论如何操作是如此基本)。

如果您不愿意创建一个类,则必须attacked专门创建一个函数才能使相同的想法起作用。然而,虽然 Python 不会像其他语言那样强迫你使用类,但是在它们提供结构和/或便利性时使用类,就像这里一样,仍然是一个好主意:-)

于 2015-02-02T01:02:27.643 回答