+from naja.constants import BITS
class PlayerBits(object):
# Operate on sets of bits
- def check_bits(self, *bits):
+ def check_bits(self, bits):
return all(self.check_bit(bit) for bit in bits)
- def set_bits(self, *bits):
+ def set_bits(self, bits):
for bit in bits:
self.set_bit(bit)
- def clear_bits(self, *bits):
+ def clear_bits(self, bits):
for bit in bits:
self.clear_bit(bit)
- def toggle_bits(self, *bits):
+ def toggle_bits(self, bits):
for bit in bits:
self.toggle_bit(bit)
def __init__(self, bits, position):
self.bits = PlayerBits(bits)
self.position = position
+
+ @classmethod
+ def import_player(cls, definition):
+ return cls(definition['bits'], tuple(definition['position']))
+
+ def export(self):
+ return {
+ 'bits': self.bits.bits,
+ 'position': list(self.position),
+ }
+
+ def get_adjacent_position(self, direction):
+ x, y = self.position
+ if direction == BITS.NORTH and y > 0:
+ return (x, y - 1)
+ elif direction == BITS.SOUTH and y < 4:
+ return (x, y + 1)
+ elif direction == BITS.EAST and x < 4:
+ return (x + 1, y)
+ elif direction == BITS.WEST and x > 0:
+ return (x - 1, y)
+ else:
+ # Not a legal space.
+ return None
+
+ def move(self, direction):
+ if not self.bits.check_bit(direction):
+ return False
+ new_position = self.get_adjacent_position(direction)
+ if new_position is not None:
+ self.position = new_position
+ return True
+ return False
+
+ def legal_moves(self):
+ positions = [self.position]
+ for direction in [BITS.NORTH, BITS.SOUTH, BITS.EAST, BITS.WEST]:
+ position = self.get_adjacent_position(direction)
+ if position is not None and self.bits.check_bit(direction):
+ positions.append(position)
+ return positions