Python API | RetroEnv:经典游戏模拟环境
Python API
RetroEnv
Python API 主要由 retro.make()、retro.RetroEnv 和一些枚举组成。大多数用户将要用到的主要函数是 retro.make()。
retro.make(game, state=<State.DEFAULT: -1>, inttype=<Integrations.DEFAULT: <retro.data.DefaultIntegrations object>>, **kwargs)[source]
为指定的游戏创建一个 Gym 环境
class retro.RetroEnv(game, state=<State.DEFAULT: -1>, scenario=None, info=None, use_restricted_actions=<Actions.FILTERED: 1>, record=False, players=1, inttype=<Integrations.STABLE: 1>, obs_type=<Observations.IMAGE: 0>)[source]
Gym Retro 环境类
为经典视频游戏提供 Gym 接口
如果你想要指定游戏集成的 metadata.json 中默认的状态或者指定从控制台的初始开机状态开始,你可以使用 retro.State 枚举:
class retro.State[source]
设置环境重启状态的特殊值。你也可以指定一个 .state 文件的名称字符串
DEFAULT= -1
从 metadata.json 中的默认 savestate 开始游戏
NONE= 0
从模拟器的开机界面开始游戏
动作
retro.RetroEnv 包含一些可能的动作空间:
class retro.Actions[source]
环境动作空间的不同设置
ALL= 0
没有过滤动作的 MultiBinary 动作空间
DISCRETE= 2
经过过滤的离散动作空间
FILTERED= 1
带有无效或不允许的动作过滤的 MultiBinary 动作空间
MULTI_DISCRETE= 3
经过过滤的 MultiDiscete 动作空间
你也可以创建从这些空间派生的自己的动作空间。例如,请参见 discretizer.py。这个文件展示了如何使用 retro.Actions.Discrete,以及如何制作一个自定义包装器,将动作空间从 126 个动作减少到 7 个动作
观测
默认观测是游戏的 RGB 图像,但你也可以查看 RAM 值(通常比 RGB 图像小得多,而且你的代理可以更直接地观察游戏状态)。如果你想要变量值,任何在 data.json 中定义的变量都会在每个步骤后出现在 info 字典中。
class retro.Observations[source]
环境观测空间的不同设置
IMAGE= 0
使用 RGB 图像观测
RAM= 1
使用 RAM 观测,在这里你可以看到游戏的内存而不是屏幕
多人游戏环境
少数游戏支持多人游戏。要使用此功能,请将 players=<n> 传递给 retro.RetroEnv。这是一个控制 Pong-Atari2600 中的两个挡板的示例随机代理:
import retro
def main():
env = retro.make(game='Pong-Atari2600', players=2)
obs = env.reset()
while True:
# 动作空间现在将是 MultiBinary(16) 而不是 MultiBinary(8)
# 动作的下半部分将是玩家 1 的动作,上半部分将是玩家 2 的动作
obs, rew, done, info = env.step(env.action_space.sample())
# rew 将是一个 [player_1_rew, player_2_rew] 的列表
# done 和 info 仍将保持不变
env.render()
if done:
obs = env.reset()
env.close()
if __name__ == "__main__":
main()
回放文件
Gym Retro 可以创建 .bk2 文件,记录了一个初始游戏状态和一系列按钮按下。因为模拟器是确定性的,每次播放此文件时都会看到相同的输出。因为它只存储按钮按下,所以文件可以比存储完整视频小约 1000 倍。
此外,如果你希望使用存储的按钮按下进行训练,它们可能会很有用。例如,为 Gym Retro Contest 提供了每个 Sonic The Hedgehog 关卡的回放文件。
你可以使用集成 UI(游戏 > 播放电影...)创建和查看回放文件。如果你想从 Python 使用回放文件,请参阅以下部分。
记录
如果你有一个代理在玩游戏,你可以将游戏过程记录到 .bk2 文件中以供以后处理:
import retro
env = retro.make(game='Airstriker-Genesis', record='.')
env.reset()
while True:
_obs, _rew, done, _info = env.step(env.action_space.sample())
if done:
break
播放
给定一个 .bk2 文件,你可以在 Python 中加载它,然后播放它或使用它进行训练。
import retro
movie = retro.Movie('Airstriker-Genesis-Level1-000000.bk2')
movie.step()
env = retro.make(
game=movie.get_game(),
state=None,
# bk2s 可以包含任何按钮按下,因此允许所有按钮
use_restricted_actions=retro.Actions.ALL,
players=movie.players,
)
env.initial_state = movie.get_state()
env.reset()
while movie.step():
keys = []
for p in range(movie.players):
for i in range(env.num_buttons):
keys.append(movie.get_key(i, p))
env.step(keys)
渲染到视频 这需要安装 ffmpeg,并将输出写入输入文件所在的目录。
python3 -m retro.scripts.playback_movie Airstriker-Genesis-Level1-000000.bk2
原文地址: https://www.cveoy.top/t/topic/ooge 著作权归作者所有。请勿转载和采集!