Пример #1
0
class MonsterKongEnv(gym.Env):
    metadata = {'render.modes': ['human']}

    def __init__(self, map_config):
        self.map_config = map_config
        self.game = MonsterKong(self.map_config)

        self.fps = 30
        self.frame_skip = 1
        self.num_steps = 1
        self.force_fps = True
        self.display_screen = True
        self.nb_frames = 500
        self.reward = 0.0
        self.episode_end_sleep = 0.2

        if map_config.has_key('fps'):
            self.fps = map_config['fps']
        if map_config.has_key('frame_skip'):
            self.frame_skip = map_config['frame_skip']
        if map_config.has_key('force_fps'):
            self.force_fps = map_config['force_fps']
        if map_config.has_key('display_screen'):
            self.display_screen = map_config['display_screen']
        if map_config.has_key('episode_length'):
            self.nb_frames = map_config['episode_length']
        if map_config.has_key('episode_end_sleep'):
            self.episode_end_sleep = map_config['episode_end_sleep']
        self.current_step = 0

        self._seed()

        self.p = PLE(self.game,
                     fps=self.fps,
                     frame_skip=self.frame_skip,
                     num_steps=self.num_steps,
                     force_fps=self.force_fps,
                     display_screen=self.display_screen,
                     rng=self.rng)

        self.p.init()

        self._action_set = self.p.getActionSet()[1:]
        self.action_space = spaces.Discrete(len(self._action_set))
        (screen_width, screen_height) = self.p.getScreenDims()
        self.observation_space = spaces.Box(low=0,
                                            high=255,
                                            shape=(screen_height, screen_width,
                                                   3))

    def _seed(self, seed=24):
        self.rng = seed

    def _step(self, action_taken):
        reward = 0.0
        action = self._action_set[action_taken]
        reward += self.p.act(action)
        obs = self.p.getScreenRGB()
        done = self.p.game_over()
        info = {'PLE': self.p}
        self.current_step += 1
        if self.current_step >= self.nb_frames:
            done = True
        return obs, reward, done, info

    def _reset(self):
        self.current_step = 0
        # Noop and reset if done
        start_done = True
        while start_done:
            self.p.reset_game()
            _, _, start_done, _ = self._step(4)
            #self.p.init()
        if self.p.display_screen:
            self._render()
            if self.episode_end_sleep > 0:
                time.sleep(self.episode_end_sleep)
        return self.p.getScreenRGB()

    def _render(self, mode='human', close=False):
        if close:
            return  # TODO: implement close
        original = self.p.display_screen
        self.p.display_screen = True
        self.p._draw_frame()
        self.p.display_screen = original