-
Notifications
You must be signed in to change notification settings - Fork 2
/
env_gen_wrapper.py
80 lines (64 loc) · 2.41 KB
/
env_gen_wrapper.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import os
import gym
import gym_gvgai
import numpy as np
from generator.levels.base import Generator
from generator.levels.base import _initialize
class GridGame(gym.Wrapper):
def __init__(self, game, play_length, path, lvl_name, mechanics=[], id=0):
"""Returns Grid instead of pixels
Sets the reward
Generates new level on reset
--------
"""
self.id = id
self.name = game
self.dir_path = path # gvgai.dir path + envs/games/zelda_v0
self.lvl_path = os.path.join(path, lvl_name)
self.mechanics = mechanics
self.generator = Generator(tile_world=_initialize(os.path.join(path, lvl_name)),
path=path,
mechanics=self.mechanics,
generation=0)
self.env = gym_gvgai.make('gvgai-{}-lvl0-v0'.format(game))
gym.Wrapper.__init__(self, self.env)
# env must exist to reset
self.reset()
self.compiles = True
self.state = None
self.steps = 0
self.score = 0
self.play_length = play_length
def reset(self):
"""reset gym simluation with whatever level the Generator currently holds
"""
self.steps = 0
self.score = 0
# save file currently in generator to disk
f = self.generator.to_file(self.id)
# reset to just saved file
state = self.set_level(f)
return state
def step(self, action):
im, reward, done, info = self.env.step(action)
if(self.steps >= self.play_length):
done = True
#reward = self.get_reward(done, info["winner"], r) #extra r parameter
state = info['grid'] # need to understand how Philip changes this below
# state = self.get_state(info['grid'])
self.steps += 1
self.score += reward
return state, reward, done, {'pic':im}
def set_level(self, path_to_level):
self.env.unwrapped._setLevel(path_to_level)
self.env.reset()
_, _, _, info = self.env.step(0)
state = info['grid']
return state
def fitness(self, agent):
"""Score agent by having it try to complete the level.
:param agent: NN-agent
:return:
"""
score = np.sum(agent.evaluate())
self._fit = score / 100