dispense with movement mode
[naja.git] / naja / player.py
index fa6e1e9f3b3edd39a7a20a109135c39ee1f9cd36..f502b640ffd94ddd999022931425e77248794141 100644 (file)
@@ -21,16 +21,16 @@ class PlayerBits(object):
     # 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
 
@@ -69,26 +69,39 @@ class Player(object):
             '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:
-                self.position = (x, y - 1)
-                return True
-        elif direction == BITS.SOUTH:
-            if y < 4:
-                self.position = (x, y + 1)
-                return True
-        elif direction == BITS.EAST:
-            if x < 4:
-                self.position = (x + 1, y)
-                return True
-        elif direction == BITS.WEST:
-            if x > 0:
-                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