# Operate on individual bits
def check_bit(self, bit):
- return bool(self.bits & bit)
+ return bool(self.bits & (1 << bit))
def set_bit(self, bit):
- self.bits |= bit
+ self.bits |= (1 << bit)
def clear_bit(self, bit):
- self.bits &= (0xff ^ bit)
+ self.bits &= (0xff ^ (1 << bit))
def toggle_bit(self, bit):
- self.bits ^= bit
+ self.bits ^= (1 << bit)
# Operate on sets of 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
- # TODO: Something cleaner than this.
- x, y = self.position
- if direction == BITS.NORTH:
- if y > 0 and self.bits.check_bit(BITS.NORTH):
- self.position = (x, y - 1)
- return True
- elif direction == BITS.SOUTH:
- if y < 4 and self.bits.check_bit(BITS.SOUTH):
- self.position = (x, y + 1)
- return True
- elif direction == BITS.EAST:
- if x < 4 and self.bits.check_bit(BITS.EAST):
- self.position = (x + 1, y)
- return True
- elif direction == BITS.WEST:
- if x > 0 and self.bits.check_bit(BITS.WEST):
- self.position = (x - 1, y)
- return True
+ new_position = self.get_adjacent_position(direction)
+ if new_position is not None:
+ self.position = new_position
+ return True
+ return False
+ def set_position(self, new_position):
+ if new_position in self.legal_moves():
+ 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