Обновить битовую доску атаки при обновлении одной атаки
Это всего лишь принцип. Я бы хотел, чтобы атакованный битборд обновлялся при изменении одной из битбордов атаки (коня, слона или пешки) без повторения строки 1. Возможно ли это? Каков наилучший способ сделать это? В классе Борг или просто используя поведение словарей:
Attacked = Pawn_attacks | knight_attacks | bishop_attacks
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 не заставляет вас использовать классы, как это делают некоторые другие языки, тем не менее, использование классов, когда они обеспечивают структуру и / или удобство, как здесь, все еще хорошая идея:-)