home · contact · privacy
Improve Map class.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 16 Jan 2019 22:54:20 +0000 (23:54 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 16 Jan 2019 22:54:20 +0000 (23:54 +0100)
server_/game.py

index 82759c25aee6b97fa37e978589f1fc3d05744aae..ea3649732b20eb8f729f79545d07e6c498c68935 100644 (file)
@@ -10,25 +10,33 @@ class GameError(Exception):
 class Map(game_common.Map):
 
     def __getitem__(self, yx):
 class Map(game_common.Map):
 
     def __getitem__(self, yx):
-        return self.terrain[self.get_pos_i(yx)]
+        return self.terrain[self.get_position_index(yx)]
 
     def __setitem__(self, yx, c):
 
     def __setitem__(self, yx, c):
-        pos_i = self.get_pos_i(yx)
+        pos_i = self.get_position_index(yx)
         self.terrain = self.terrain[:pos_i] + c + self.terrain[pos_i + 1:]
 
     def __iter__(self):
         self.terrain = self.terrain[:pos_i] + c + self.terrain[pos_i + 1:]
 
     def __iter__(self):
+        """Iterate over YX position coordinates."""
         for y in range(self.size[0]):
             for x in range(self.size[1]):
                 yield [y, x]
 
         for y in range(self.size[0]):
             for x in range(self.size[1]):
                 yield [y, x]
 
+    def lines(self):
+        width = self.size[1]
+        for y in range(self.size[0]):
+            yield (y, self.terrain[y * width:(y + 1) * width])
+
+    # The following is used nowhere, so not implemented.
+    #def items(self):
+    #    for y in range(self.size[0]):
+    #        for x in range(self.size[1]):
+    #            yield ([y, x], self.terrain[self.get_position_index([y, x])])
+
     @property
     def size_i(self):
         return self.size[0] * self.size[1]
 
     @property
     def size_i(self):
         return self.size[0] * self.size[1]
 
-    def get_line(self, y):
-        width = self.size[1]
-        return self.terrain[y * width:(y + 1) * width]
-
     def get_directions(self):
         directions = []
         for name in dir(self):
     def get_directions(self):
         directions = []
         for name in dir(self):
@@ -36,7 +44,7 @@ class Map(game_common.Map):
                 directions += [name[5:]]
         return directions
 
                 directions += [name[5:]]
         return directions
 
-    def get_pos_i(self, yx):
+    def get_position_index(self, yx):
         return yx[0] * self.size[1] + yx[1]
 
     def new_from_shape(self, init_char):
         return yx[0] * self.size[1] + yx[1]
 
     def new_from_shape(self, init_char):
@@ -238,9 +246,8 @@ class Game(game_common.CommonCommandsMixin):
         self.io.send('NEW_TURN ' + str(self.world.turn))
         self.io.send('MAP_SIZE ' + stringify_yx(self.world.map_.size))
         visible_map = self.world.get_player().get_visible_map()
         self.io.send('NEW_TURN ' + str(self.world.turn))
         self.io.send('MAP_SIZE ' + stringify_yx(self.world.map_.size))
         visible_map = self.world.get_player().get_visible_map()
-        for y in range(self.world.map_.size[0]):
-            self.io.send('VISIBLE_MAP_LINE %5s %s' %
-                         (y, self.io.quote(visible_map.get_line(y))))
+        for y, line in visible_map.lines():
+            self.io.send('VISIBLE_MAP_LINE %5s %s' % (y, self.io.quote(line)))
         visible_things = self.world.get_player().get_visible_things()
         for thing in visible_things:
             self.io.send('THING_TYPE %s %s' % (thing.id_, thing.type_))
         visible_things = self.world.get_player().get_visible_things()
         for thing in visible_things:
             self.io.send('THING_TYPE %s %s' % (thing.id_, thing.type_))