Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

用Python玩任一款街机游戏!

$
0
0

编译 Bot 来源 GitHub

编者按:近年来,虽然关于强化学习进展的新闻屡见报端,对强化学习感兴趣的人也很多,但对普通学习者来说,真正做一个自己感兴趣的强化学习项目还是太麻烦了。今天论智给大家推荐的是一名网友开源的python库,它提供了一个可以玩任何旧版街机游戏的API,操作方式非常亲民。

这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在linux系统上可用。通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状态,以及发送与游戏交互的动作。

安装

GitHub地址:github.com/M-J-Murray/MAMEToolkit/blob/master/README.md

你可以用pip安装这个库,只需运行以下命令:

pip install MAMEToolkit 演示示例:街霸

在街机爱好者心中,街霸是史上最经典的游戏之一。现在工具包内包含的街霸版本是街头霸王3:三度冲击(Japan 990608, NO CD),我们以此为例,用以下代码写一个随机智能体:

import random

from MAMEToolkit.sf_environment import Environment

roms_path = "roms/"

env = Environment("env1", roms_path)

env.start()

while True:

move_action = random.randint(0, 8)

attack_action = random.randint(0, 9)

frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action)

if game_done:

env.new_game()

elif stage_done:

env.next_stage()

elif round_done:

env.next_round()

这个工具包还支持hogwild!训练:

什么是hogwild!?Niu等人引入了一个叫做 Hogwild! 的更新策略,可以使 SGD 可以在多 CPU 上并行更新。处理器在无需对参数加锁的情况下就可以访问共享内存。但仅在输入的是稀疏数据时才有效,因为每次更新仅修改所有参数的一小部分。他们展示了在这种情况下,更新策略几乎可以达到一个最优的收敛率,因为处理器不太可能覆盖掉有用的信息。

from threading import Thread

import random

from MAMEToolkit.sf_environment import Environment

def run_env(env):

env.start()

while True:

move_action = random.randint(0, 8)

attack_action = random.randint(0, 9)

frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action)

if game_done:

env.new_game()

elif stage_done:

env.next_stage()

elif round_done:

env.next_round()

def main():

workers = 8

# Environments must be created outside of the threads

roms_path = "roms/"

envs = [Environment(f"env{i}", roms_path) for i in range(workers)] threads = [Thread(target=run_env, args=(envs[i], )) for i in range(workers)] [thread.start() for thread in threads] 建立自己的游戏环境

这个工具包之所以易于上手,是因为它和模拟器本身不需要太多交互,只需注意两点――一是查找你关注的内部状态相关联的内存地址值,二是用选取的环境跟踪状态。你可以用MAME Cheat Debugger,它会反馈游戏的内存地址值如何随时间变化。如果要创建游戏模拟,你得先获得正在模拟的游戏的ROM,并知道MAME使用的游戏ID,比如街霸的ID是'sfiii3n'。

游戏ID

你可以通过运行以下代码找到游戏的ID:

from MAMEToolkit.emulator import Emulator emulator = Emulator("env1", "", "", memory_addresses)

这个命令会打开MAME仿真器。你可以搜索游戏列表以找到想要的游戏,游戏的ID位于游戏标题末尾的括号中。

内存地址

如果获得了ID,也有了想要跟踪的内存地址,你可以开始模拟:

from MAMEToolkit.emulator import Emulator

from MAMEToolkit.emulator import Address

roms_path = "roms/"

game_id = "sfiii3n"

memory_addresses = {

"fighting": Address('0x0200EE44', 'u8'),

"winsP1": Address('0x02011383', 'u8'),

"winsP2": Address('0x02011385', 'u8'),

"healthP1": Address('0x02068D0B', 's8'),

"healthP2": Address('0x020691A3', 's8'

Viewing all articles
Browse latest Browse all 9596

Trending Articles