-
Notifications
You must be signed in to change notification settings - Fork 0
/
mxngym.py
154 lines (111 loc) · 3.47 KB
/
mxngym.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
"""
Bluelake Mixin for OpenAI Gym.
"""
import math
import random
import time
import numpy as np
class BLMixinGym(object):
def __init__(self, action_set=['NOOP', 'UP'],
out_rect=[0, 0, 2, 3],
main_game=None,
simu=True,
*args, **kwargs):
"""
Args:
out_rect: the screen rect export to outside, [x, y, w, h]
main_game: the main sprite on which the game logic is
"""
self.action_set = action_set
self.out_rect = out_rect
self.main_game = main_game
# if run game in gym, do not check events
self.simu = simu
if self.simu:
self.close_check_event()
# override
def close_check_event(self):
self.do_not_check_event()
# override
def act(self, action):
# do action
a = self.action_idx(action)
self.main_game.e_keys_dn = [a]
#self.main_game.e_keys_up = [a]
reward = self.main_game.sc
self.step()
reward = self.main_game.sc - reward
if self.main_game.game_over:
reward = -1
return reward
# override
def reset_game(self):
self.main_game.reset()
# override
def game_over(self):
return self.main_game.game_over
def action_idx(self, action):
try:
i = self.action_set.index(action)
except:
i = None
return i
def getMinimalActionSet(self):
return self.action_set
def getScreenDims(self):
return (self.out_rect[2], self.out_rect[3])
def get_scrn_rgb__0(self):
a = []
# <1>
#data = self.pong.surf_to_img_str(fmt='RGB')
# <2>
rct = self.out_rect
data = self.surf_main_to_img_str(fmt='RGB', rect=rct)
for d in data:
a.append(ord(d))
return a
def to_rgb(self, a, screen_height, screen_width):
b = np.fromiter(a, dtype=np.uint8)
#c = b.reshape((screen_height, screen_width, 4))
c = b.reshape((screen_height, screen_width, 3))
return c
def get_scrn_rgb(self):
a = []
# <1>
#data = self.pong.surf_to_img_str(fmt='RGB')
# <2>
rct = self.out_rect
data = self.surf_main_to_img_str(fmt='RGB', rect=rct)
for d in data:
a.append(ord(d))
a = self.to_rgb(a, self.out_rect[3], self.out_rect[2])
# compatible for new gym
a = a[:, :, [2, 1, 0]]
return a
def get_surf_rgb__0(self):
image_data = self.pygm.surfarray.array3d(
self.pygm.display.get_surface())
return image_data
def get_surf_rgb(self):
image_data = self.pygm.surfarray.array3d(
self.pygm.display.get_surface())
# compatible for new gym
image_data = self.img_to_gym(np.array(image_data))
return image_data
def img_to_gym(self, im):
image_data = np.swapaxes(im, 0, 1)
# compatible for new gym
image_data = image_data[:, :, [2, 1, 0]]
return image_data
def getScreenRGB(self, arr):
#a = self.get_scrn_rgb() # slow
a = self.get_surf_rgb() # fast
return a
def getRAM(self, ram):
a = self.get_scrn_rgb()
return a
def frame_step(self, action): # for not using gym
r = self.act(self.action_set[action])
obv = self.get_surf_rgb()
term = self.game_over()
return obv, r, term