python玩转街机游戏,操作亲民!
这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用。通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状态,以及发送与游戏交互的动作。
跟大家推荐一下我的Python学习交流裙【 784758214 】内有安装包和学习视频资料,零基础,进阶,,大牛在线解答疑问。希望可以帮助你快速了解Python、学习python
安装
GitHub地址:github.com/M-J-Murray/MAMEToolkit/blob/master/README.md
你可以用pip安装这个库,只需运行以下命令:
pip install MAMEToolkit
演示:街霸
街霸是史上最经典的游戏之一。现在工具包内包含的街霸版本是街头霸王3:三度冲击(Japan 990608, NO CD),我们以此为例,用以下代码写一个随机智能体:
import randomfrom MAMEToolkit.sf_environment import Environmentroms_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 Threadimport randomfrom 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 threadsroms_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 Emulatorfrom MAMEToolkit.emulator import Addressroms_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')}emulator = Emulator("env1", roms_path, "sfiii3n", memory_addresses)
这会启动仿真器,并在工具包连接到模拟器进程时暂停。
分步运行仿真器
连接工具箱后,你可以分步运行仿真器:
data = emulator.step([]) frame = data["frame"] is_fighting = data["fighting"] player1_wins = data["winsP1"] player2_wins = data["winsP2"] player1_health = data["healthP1"] player2_health = data["healthP2"]
step函数会把帧数据作为NumPy矩阵返回,同时,它也会返回该时间步长的所有内存地址整数值。
如果要向仿真器输入动作,你还需要确定游戏支持的输入端口和字段。比如玩街霸需要先投币,这个代码是:
from MAMEToolkit.emulator import Action insert_coin = Action(':INPUTS', 'Coin 1') data = emulator.step([insert_coin])
要确定哪些端口可用,请使用list actions命令:
from MAMEToolkit.emulator import list_actions roms_path = "roms/"game_id = "sfiii3n"print(list_actions(roms_path, game_id))
下面这个返回的列表就包含街霸环境中可用于向步骤函数发送动作的所有端口和字段:
[{'port': ':scsi:1:cdrom:SCSI_ID', 'field': 'SCSI ID'},{'port': ':INPUTS', 'field': 'P2 Jab Punch'},{'port': ':INPUTS', 'field': 'P1 Left'},{'port': ':INPUTS', 'field': 'P2 Fierce Punch'},{'port': ':INPUTS', 'field': 'P1 Down'},{'port': ':INPUTS', 'field': 'P2 Down'},{'port': ':INPUTS', 'field': 'P2 Roundhouse Kick'},{'port': ':INPUTS', 'field': 'P2 Strong Punch'},{'port': ':INPUTS', 'field': 'P1 Strong Punch'},{'port': ':INPUTS', 'field': '2 Players Start'},{'port': ':INPUTS', 'field': 'Coin 1'},{'port': ':INPUTS', 'field': '1 Player Start'},{'port': ':INPUTS', 'field': 'P2 Right'},{'port': ':INPUTS', 'field': 'Service 1'},{'port': ':INPUTS', 'field': 'Coin 2'},{'port': ':INPUTS', 'field': 'P1 Jab Punch'},{'port': ':INPUTS', 'field': 'P2 Up'},{'port': ':INPUTS', 'field': 'P1 Up'},{'port': ':INPUTS', 'field': 'P1 Right'},{'port': ':INPUTS', 'field': 'Service Mode'},{'port': ':INPUTS', 'field': 'P1 Fierce Punch'},{'port': ':INPUTS', 'field': 'P2 Left'},{'port': ':EXTRA', 'field': 'P2 Short Kick'},{'port': ':EXTRA', 'field': 'P2 Forward Kick'},{'port': ':EXTRA', 'field': 'P1 Forward Kick'},{'port': ':EXTRA', 'field': 'P1 Roundhouse Kick'},{'port': ':EXTRA', 'field': 'P1 Short Kick'} ]
仿真器类还有一个frame_ratio参数,可用于调整算法所见的帧速率。默认情况下,MAME以每秒60帧的速度生成帧,如果你觉得这太多了,想把它改成每秒20帧,可以输入以下代码:
from MAMEToolkit.emulator import Emulator emulator = Emulator(roms_path, game_id, memory_addresses, frame_ratio=3)
MAME性能基准测试
目前这个工具包的开发和测试已在8核AMD FX-8300 3.3GHz CPU以及3GB GeForce GTX 1060 GPU上完成。在使用单个随机智能体的情况下,街头霸王环境可以以正常游戏速度的600%+运行。而如果是用8个随机智能体进行hogwild!训练,环境可以以正常游戏速度的300%+运行。
ConvNet智能体
为了确保工具包能够训练算法,作者还设置了一个简单的5层ConvNet,只需少量调整,你就可以用它进行测试。在街霸实验中,这个算法能够成功学习到游戏的一些简单技巧,比如连击(combo)和格挡(blocking)。街霸本身的游戏机制是分成10个关卡(难度递增),玩家在每个关卡都要迎战不同的对手。刚开始的时候,这个智能体平均只能打到第2关。但在经过2200次训练后,它平均能打到第5关。
至于智能体的学习率,它是用每一局智能体所造成的净伤害和所承受的伤害来计算的。
跟大家推荐一下我的Python学习交流群【 784758214 】内有安装包和学习视频资料,零基础,进阶,,大牛在线解答疑问。希望可以帮助你快速了解Python、学习python
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69901074/viewspace-2284310/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/69901074/viewspace-2284310/
python玩转街机游戏,操作亲民!相关推荐
- atari游戏模型_在Atari.com免费玩经典街机游戏
atari游戏模型 The late 70's and early 80's was a golden age for video games. Arcades were a thriving hot ...
- linux用mame玩游戏,Ubuntu下用kxmame运行精彩的街机游戏
闲得无聊,试试在Ubuntu玩一下那些经典的街机游戏,搜了下论坛,一般是用gxmame,先看看"添加/删除"里有没有,查找"gxmame",没有,倒是有个kxm ...
- skype安卓手机版_安卓:街机游戏大全~手机版
街机游戏大全~手机版 大家好,我是雨晨~ 给大家带来的 一款游戏叫做 街机游戏大全 ~手机版 目前支持安卓系统 大家快来亲身感受一下吧~~ 游戏介绍 安卓手机街机游戏1500合集,街机模拟器街机游戏可 ...
- 手机qq表白代码大全可复制_街机游戏大全~手机版
街机游戏大全~手机版 安卓:街机游戏大全~手机版 1.街机游戏 2.经典游戏 游戏介绍 安卓手机街机游戏1500合集,街机模拟器街机游戏可以说是一代80.90后的童年回忆,此合集收录1500多款街机经 ...
- 用Python编一个街机拳皇游戏,操作起来!
这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用.通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状 ...
- 教AI逐帧搓招玩《铁拳》通关最高难度,现在的街机游戏爱好者有点东西啊
博雯 发自 凹非寺 量子位 | 公众号 QbitAI 现在的AI都开始学着逐帧搓招打街机了? <拳皇98>.<街头霸王>.<死或生>--一干童年回忆全都玩了个遍,其 ...
- 街机linux有安卓好吗,Ubuntu下用xmame玩街机游戏
Ubuntu下用xmame玩街机游戏 xmame是Windows下mame的Linux版,gxmame是xmame的图形化前端.mame号称是模拟效果最好.支持roms最多的模拟器,不过这个我就不清楚 ...
- 小时候玩的10款经典街机游戏,如今我们都在玩什么?
很多的人的童年,都是伴随着游戏度过的.尤其是8090后.今天就列举10款经典的大型街机游戏,跟大家一起回忆一下童年时光,不信没有你玩过的! 1.<拳皇> 小时候小编最喜欢的大型对战格斗型街 ...
- linux街机系统,Ubuntu下用xmame玩街机游戏
Ubuntu下用xmame玩街机游戏 发布时间:2007-05-10 12:34:24来源:红联作者:seais xmame是Windows下mame的Linux版,gxmame是xmame的图形化前 ...
最新文章
- 数据挖掘应用于流失分析的整体思路
- 韦布望远镜睁眼看到第一缕星光,镜面校准进行时
- SpringData —— HelloWorld
- 第三次学JAVA再学不好就吃翔(part3)--基础语法之常量
- 请求对象Request
- 最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
- 云服务器 ECS 建站教程:部署Linux主机管理系统WDCP
- 常用类 (五) ----- Date日期类和Calender日历类
- 超简单!Vue 短信验证码组件开发详解
- Tomcat配置文件server.xml(转)
- 2019牛客多校第三场F Planting Trees(单调队列)题解
- Python 做一个属于自己的web网站
- 电视剧的收视排行榜(Python)
- c++·C++游戏——海战棋
- 【第4章】网络安全体系与网络安全模型(信息安全工程师)
- Android一点 play商店地区与语言设置
- C++字符串转换(stoi;stol;stoul;stoll;stoull;stof;stod;stold)
- Verilog语言之向量vector和解压缩数组unpacked array
- vnc移植_【安富莱】开源原创高级玩法,用F429接SDRAM虚拟远程VNC桌面
- oracle 加载数据戽_oracle数据库数据导入导出步骤(入门)
热门文章
- Android Studio无线Wifi调试手机的两种方案
- ubuntu下 双显卡Optimus笔记本 CUDA配置教程(成功解决黑屏问题)
- FHD 1920 x 1080 VS UHD 3840 x 2160
- 为何穿越火线能在全球免费游戏中收入第一
- OpenVINO工具套件使用教程
- 全球物联网行业2017年十大方向发展
- 联合双边滤波器(joint bilateral filter)
- 电脑软件:硬盘信息检测工具 HD Tune Pro v5.75 介绍和使用教程
- PL SQL Developer 中文汉化补丁-亲测最新版本
- 字母打字练习--键盘事件onkeydown--keycode - css