changeset 201:78f9cafb0819

Fix uturns. Start of work on adding and removing segments.
author Simon Cross <hodgestar@gmail.com>
date Wed, 14 Sep 2011 20:14:41 +0200
parents d920768357de
children 498c1d659a94
files mamba/snake.py
diffstat 1 files changed, 34 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/mamba/snake.py	Wed Sep 14 19:55:15 2011 +0200
+++ b/mamba/snake.py	Wed Sep 14 20:14:41 2011 +0200
@@ -12,6 +12,7 @@
 
     def __init__(self, tile_pos, orientation):
         self.segments = self.create_segments(tile_pos, orientation)
+        self.pending_segments = []  # segments waiting to be added
         self.segment_group = Group()
         self.segment_group.add(*reversed(self.segments))
         self.set_orientation(orientation)
@@ -30,6 +31,29 @@
             segments.append(cls((tx, ty)))
         return segments
 
+    def add_segment(self, segment=None):
+        if segment is None:
+            segment = Body((0, 0))
+        self.pending_segments.append(segment)
+
+    def remove_segment(self, segment=None):
+        if segment is None:
+            if len(self.segments) < 3:
+                return
+            segment = self.segments[-2]
+        try:
+            idx = self.segments.index(segment)
+        except IndexError:
+            return
+        self.shiftup_segments(idx, segment.get_tile_state())
+        del self.segments[idx]
+
+    def shiftup_segments(self, idx, state):
+        for segment in self.segments[idx:]:
+            next_state = segment.get_tile_state()
+            segment.shift_tile(state)
+            state = next_state
+
     def draw(self, surface):
         self.segment_group.draw(surface)
 
@@ -42,26 +66,27 @@
             shifted, ds = self.head.shift_head(ds)
             if not shifted:
                 break
-            self.head.set_orientation(self.orientation)
-            for segment in self.segments[1:]:
-                old_tile_state = segment.get_tile_state()
-                segment.shift_tile(tile_state)
-                tile_state = old_tile_state
+            self.shiftup_segments(1, tile_state)
+            if not self.check_uturn():
+                self.head.set_orientation(self.orientation)
 
         for segment in self.segments:
             segment.shift_pixels(ds)
             world.interact(segment)
 
-    def set_orientation(self, orientation):
+    def check_uturn(self):
         if len(self.segments) > 1:
             neck_x, neck_y = self.segments[1].tile_pos
             head_x, head_y = self.head.tile_pos
-            if (head_x + orientation[0] == neck_x and
-                head_y + orientation[1] == neck_y):
+            if (head_x + self.orientation[0] == neck_x and
+                head_y + self.orientation[1] == neck_y):
                 # Don't allow the snake to go back on itself
                 # immediately. More creative self-inflicted
                 # deaths are allowed though.
-                return
+                return True
+        return False
+
+    def set_orientation(self, orientation):
         self.orientation = orientation
 
     def crash(self):