File size: 1,431 Bytes
5a2a073
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Scripted policy against a running SUPERBEAM server (run right; right+jump near gaps/walkers).

  python play_scripted.py [--url http://localhost:8000] [--level classic]
"""
import argparse
import os
import re
import sys

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from superbeam_env import SuperBeamAction, SuperBeamEnv  # noqa: E402


def policy(obs):
    ahead = [int(v) for v in re.findall(r"\((-?\d+) px ahead\)", obs.facts)]
    if "standing on ground" in obs.facts and any(0 <= d < 8 for d in ahead):
        return "right+jump"
    return "right"


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("--url", default="http://localhost:8000")
    ap.add_argument("--level", default=None)
    a = ap.parse_args()
    kw = {"level": a.level} if a.level else {}
    with SuperBeamEnv(base_url=a.url).sync() as env:
        r = env.reset(**kw)
        print(r.observation.screen); print(r.observation.facts)
        n, total = 0, 0.0
        while not r.done:
            r = env.step(SuperBeamAction(action=policy(r.observation)))
            n += 1
            total += r.reward or 0
        o = r.observation
        print(o.screen); print(o.facts)
        print("won=%s dead=%s steps=%d frames=%d progress=%.2f reward=%.1f level=%s state=%s"
              % (o.won, o.dead, n, o.frames, o.progress, total, o.level, env.state()))


if __name__ == "__main__":
    main()