-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame_player.py
More file actions
45 lines (30 loc) · 1.1 KB
/
game_player.py
File metadata and controls
45 lines (30 loc) · 1.1 KB
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
class GamePlayer:
def __init__(self, game_dsl):
self.game_dsl = game_dsl
self.state = {}
def reset(self, game_name, agents):
self.state = {
"score": {a.name: 0 for a in agents},
"positions": {a.name: [0, 0] for a in agents},
"done": False
}
def step(self, game, agents):
events = []
rewards = {a.name: 0.0 for a in agents}
for rule in game["rules"]:
for agent in agents:
event = self._evaluate_rule(rule, agent)
if not event:
continue
events.append(event)
if event["type"] == "score":
rewards[event["agent"]] += float(event.get("delta", 1.0))
if event["type"] == "reset":
rewards[agent.name] -= 0.1
return events, rewards
def _evaluate_rule(self, rule, agent):
if "collision" in rule:
return {"agent": agent.name, "type": "score", "delta": 1}
if "reset" in rule:
return {"type": "reset"}
return None