text: import sys
  
  from .constants import Constants
  from .game_map import GameMap
  from .game_objects import Player, Unit, City, CityTile
  
  INPUT_CONSTANTS = Constants.INPUT_CONSTANTS
  
  
  class Game:
      def __init__(self, messages):
          self.id = int(messages[0])
          self.turn = -1
          map_info = messages[1].split(" ")
          self.map_width = int(map_info[0])
          self.map_height = int(map_info[1])
          self.map = GameMap(self.map_width, self.map_height)
          self.players = [Player(0), Player(1)]
          self.update(messages[2:])
  
      @staticmethod
      def submit_actions(actions):
          print(",".join(actions))
  
      @staticmethod
      def end_turn():
          print("D_FINISH")
  
      def reset_player_states(self):
          self.players[0].units = []
          self.players[0].cities = {}
          self.players[0].city_tile_count = 0
          self.players[1].units = []
          self.players[1].cities = {}
          self.players[1].city_tile_count = 0
  
      def update(self, messages):
          """
          update state
          """
          self.map = GameMap(self.map_width, self.map_height)
          self.turn += 1
          self.reset_player_states()
  
          for update in messages:
              if update == "D_DONE":
                  break
              strs = update.split(" ")
              input_identifier = strs[0]
              if input_identifier == INPUT_CONSTANTS.RESEARCH_POINTS:
                  team = int(strs[1])
                  self.players[team].research_points = int(strs[2])
              elif input_identifier == INPUT_CONSTANTS.RESOURCES:
                  r_type = strs[1]
                  x = int(strs[2])
                  y = int(strs[3])
                  amt = int(float(strs[4]))
                  self.map.set_resource(r_type, x, y, amt)
              elif input_identifier == INPUT_CONSTANTS.UNITS:
                  unittype = int(strs[1])
                  team = int(strs[2])
                  unitid = strs[3]
                  x = int(strs[4])
                  y = int(strs[5])
                  cooldown = float(strs[6])
                  wood = int(strs[7])
                  coal = int(strs[8])
                  uranium = int(strs[9])
                  self.players[team].units.append(Unit(team, unittype, unitid, x, y, cooldown, wood, coal, uranium))
              elif input_identifier == INPUT_CONSTANTS.CITY:
                  team = int(strs[1])
                  cityid = strs[2]
                  fuel = float(strs[3])
                  lightupkeep = float(strs[4])
                  self.players[team].cities[cityid] = City(team, cityid, fuel, lightupkeep)
              elif input_identifier == INPUT_CONSTANTS.CITY_TILES:
                  team = int(strs[1])
                  cityid = strs[2]
                  x = int(strs[3])
                  y = int(strs[4])
                  cooldown = float(strs[5])
                  city = self.players[team].cities[cityid]
                  citytile = city._add_city_tile(x, y, cooldown)
                  self.map.get_cell(x, y).city_tile = citytile
                  self.players[team].city_tile_count += 1
              elif input_identifier == INPUT_CONSTANTS.ROADS:
                  x = int(strs[1])
                  y = int(strs[2])
                  road = float(strs[3])
                  self.map.get_cell(x, y).road = road
  