Обновить битовую доску атаки при обновлении одной атаки

Это всего лишь принцип. Я бы хотел, чтобы атакованный битборд обновлялся при изменении одной из битбордов атаки (коня, слона или пешки) без повторения строки 1. Возможно ли это? Каков наилучший способ сделать это? В классе Борг или просто используя поведение словарей:

  1. Attacked = Pawn_attacks | knight_attacks | bishop_attacks

  2. pawn_attacks = (1 << (пешка + 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

1 ответ

Решение

Если вы пишете класс, вы можете сделать attacked свойство (только для чтения), поэтому оно прозрачно пересчитывается при необходимости:

... rest of the class ...

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

Сейчас дан пример x класса, x.attacked всегда будет в актуальном состоянии (кэширование для перерасчета только в случае необходимости не гарантируется, учитывая, что операция в любом случае настолько элементарна).

Если вы не хотите делать уроки, вам придется сделать attacked в частности, функция, чтобы заставить ту же идею работать. Однако, хотя Python не заставляет вас использовать классы, как это делают некоторые другие языки, тем не менее, использование классов, когда они обеспечивают структуру и / или удобство, как здесь, все еще хорошая идея:-)

Другие вопросы по тегам