用 Python 写出了一个 Gameboy 模拟器
off999 2024-10-25 13:40 46 浏览 0 评论
优质文章,第一时间送达!
感觉用 Atari 游戏研究人工智能有点「不够接地气」?现在我们可以使用 Gameboy 模拟器了。
作者:机器之心编辑部
对于很多 80 后、90 后来说,任天堂 Gameboy 代表了青春的很大一部分。很多我们耳熟能详的游戏都是最初搭载在这款 8 位游戏掌机上的,包括鼎鼎有名的《马里奥》、《塞尔达》系列。对于国内玩家来说,我们玩得最多的则应该是《口袋妖怪》系列了。
这款游戏机距离首次发布已过去了 30 年时间,不过人们对于它的热情却丝毫不减。昨天,一款利用 Python 编写的 Gameboy 模拟器在社交网络上吸引了人们的广泛关注。
爷的青春回来了?作者在 Reddit 上发出的帖子迅速获得了上千点赞。
该项目的作者之一 Mads Ynddal 宣布,PyBoy 的 1.0 版正式发布。
PyBoy 是什么?
简而言之,它是一个完全用 Python 从头开始编写的 Game Boy 模拟器,并且支持通过 API 编写脚本。研究者添加了类型定义,使其可以使用 Cython 编译软件,从而获得与用 C 和 C++编写的模拟器相媲美的性能。
项目链接:https://github.com/Baekalfen/PyBoy
特点
PyBoy 被设计成通过 Python 访问,因此支持并鼓励人们做实验研究,机器人和人工智能在作此尝试。研究者正在构建游戏特定的包装器,目前,包装器可让程序员与俄罗斯方块和超级玛丽进行交互,而不需要对 Game Boy 有深入的了解。可以参考该文档:https://docs.pyboy.dk。
项目作者还想学习和尝试更多奇特的功能,根据大学项目的研究,他们向模拟器添加了倒回功能,也就是说,您可以在任何游戏中倒回时间。
PyBoy 模拟器架构
1990 年,任天堂为 Game Boy 申请了专利。下图展示了该专利中 CPU、RAM、盒带和显示屏之间的集成与连接。
Game Boy 专利中的架构图。
PyBoy 项目成员基于此在 Python 中为每个组件制定类(class),从而在「主机系统」上为「客户系统」搭建了基础(系统运行 Python)。该客户系统就是虚拟的 Game Boy 硬件,理论上它能够运行为 Game Boy 编写的每一个软件部分。
下图展示了 PyBoy 模拟器中所有类及其关系:
PyBoy 对强化学习的意义以及与其他环境的比较
这些年来,已有很多人开发过 Gameboy 模拟器,现在的电脑和手机上都有可运行的工具。为什么要用 Python 来写一款呢?当然是用来训练人工智能的。
想打游戏?Gameboy 对于现在的人来说恐怕有点「难以上手」。
最接近通用人工智能的方法——强化学习
通用人工智能这一概念指的是机器能够成功完成任意一件人类能够做到的智力型任务。目前我们对 AI 的研究距离这一目标还差很远的距离,吴恩达之前就表示过,深度学习做的仅是高维的「curve fitting」。
不同于那些依靠预先收集数据(甚至需要大量人工标记)的机器学习算法,强化学习是一种仅通过环境奖赏进行训练的算法,其工作机制类似于人体内部的多巴胺系统。强化学习是目前最接近于人类从经验中学习这一能力的机器学习算法,尤其适用于智能体需要根据其所处环境进行决策的情景。
下图展示了 RL 智能体是如何仅以游戏图像作为输入,来学习马里奥控制策略的。
为什么大量关于 RL 的研究都在 Atari 上进行,而不是其他更实际的问题?
关于 RL 的研究使用 Atari 作为基准的原因主要有如下几点:
Atari 环境能够让我们使用相同的算法测试多个不同的环境,验证 RL 算法的通用性;
由于输入仅为游戏图像,增加了问题的复杂性;
Atari 为研究人员提供了一个公认的测试平台,能够较为公平地比较不同算法之间的性能;
RL 需要大量的交互数据进行学习,在真实环境中实际测试之前,Atari 为算法的初期验证提供了一个安全、快速、低成本的测试平台。
下图为一些 Atari 环境的展示:
Atari、PySC2 之类环境与 PyBoy 对比
上一小节介绍了在 Atari 环境中训练 RL 智能体的诸多优势,然而随着 RL 的发展,这一相对较简单的环境逐渐不再适用于目前新的 RL 研究。不久之前,由 DeepMind 提出的 Agent57 在所有 Atari 环境中表现均超越了人类玩家平均水平,也预示着在 Atari 环境上的 RL 研究逐渐进入尾声。
更困难环境有诸如 DeepMind 与暴雪合作的 PySC2,需要智能体学会复杂的协同、对抗策略。虽然 AlphaStar 在这一环境中取得了令人瞩目的成果,但仍存在很多亟待解决的问题。以下为 PySC2 环境示意图。
PyBoy 环境的难度可以说介于 Atari 与 PySC2 之间,它为我们提供了一个验证 RL 性能的新基准。在将 RL 应用于更复杂的实际问题之前,我们可以先在这一难度适中的环境中进行低成本、高效的测试。
就像特斯拉的人工智能和自动驾驶视觉总监 Andrej Karpathy 说的,「One should always try a BB gun before reaching for the Bazooka.」
Github 介绍
如何安装?
如果已经配置了一个能够正常运行 Python 的环境,那么安装会非常简单:
通过软件包管理器安装 SDL2(sudo apt install libsdl2-dev 或是 brew install sdl2)
使用 pip install pyboy 安装 Pyboy
可以直接从终端 $ pyboy file.rom 使用 PyBoy 或者在 Python 脚本中使用:
from pyboy import PyBoypyboy = PyBoy('ROMs/gamerom.gb')while not pyboy.tick:pass
该项目同时支持 macOS, Raspberry Pi (Raspbian), Linux (Ubuntu), 以及 Windows 10.
PyBoy API 文档
如果用户需要创建一个自己的机器人或者是 AI,可以在 PyBoy Documentation (https://baekalfen.github.io/PyBoy/index.html) 找到所有用以支持的外部组件,其中各种类及其用法都非常详细,这里不再一一赘述。(如下图结构索引)
简短示例
PyBoy 可以作为 Python 中的对象加载。所以它可以从另一个脚本进行初始化,并可以由该脚本控制和探测。看一下 gamewrapper_tetris.py 上一个粗糙的「机器人」,正在与游戏进行交互。当然,所有的外部组件都可以在 PyBoy 文档中找到。
对于一般的 Game Boy 文档,可以查看 Pan Docs,其中包含了每个主题的详细信息。
以下是从屏幕读取数据的简短演示,该代码也可以在 gamewrapper_mario.py 中找到:
import osimport sysfrom pyboy import PyBoy, WindowEvent# Makes us able to import PyBoy from the directory belowfile_path = os.path.dirname(os.path.realpath(__file__))sys.path.insert(0, file_path + "/..")# Check if the ROM is given through argvif len(sys.argv) > 1:filename = sys.argv[1]else:print("Usage: python mario_boiler_plate.py [ROM file]")exit(1)quiet = "--quiet" in sys.argvpyboy = PyBoy(filename, window_type="headless" if quiet else "SDL2", window_scale=3, debug=not quiet, game_wrapper=True)pyboy.set_emulation_speed(0)assert pyboy.cartridge_title == "SUPER MARIOLAN"mario = pyboy.game_wrappermario.start_gameassert mario.score == 0assert mario.lives_left == 2assert mario.time_left == 400assert mario.world == (1, 1)assert mario.fitness == 0 # A built-in fitness score for AI developmentlast_fitness = 0print(mario)pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT)for _ in range(1000):assert mario.fitness >= last_fitnesslast_fitness = mario.fitnesspyboy.tickif mario.lives_left == 1:assert last_fitness == 27700assert mario.fitness == 17700 # Loosing a live, means 10.000 points in this fitness scoringprint(mario)breakelse:print("Mario didn't die?")exit(2)mario.reset_gameassert mario.lives_left == 2pyboy.stop
如果你在加载了 Super Mario Land ROM 的情况下运行上述代码,则将在下面得到图片和终端输出。值得注意的是,Mario 的形态显示为索引 0,1,16,17。
作者简介
该项目的作者 Asger Anders Lund Hansen、Mads Ynddal 和 Troels Ynddal 均来自丹麦。毕业于丹麦哥本哈根大学的 Mads Ynddal 表示,事实上这一 Gameboy 模拟器可以追溯到 2015 年他在大学期间的项目。
Gameboy 模拟器的的 1.0 版发布了,但对于开发者们来说还有很多事可以去做。项目研发者表示,目前可以推进的方向包括为模拟器加入声音、彩色、Gameboy 模拟连线,以及更多游戏的封装,当然还有在其之上训练神经网络的示例。
希望在人们的努力下,Gameboy 中的游戏也能重获新生。更重要的是,它现在还有了训练人工智能的任务。
回复下方「关键词」,获取优质资源
回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版
回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
回复关键词「m」,立即获取Python精选优质文章合集
回复关键词「」,将数字替换成 0 及以上数字,有惊喜好礼哦~
题图:pexels,CC0 授权。
好文章,我在看
相关推荐
- 百度网页(百度网页自动翻译怎么设置)
-
1、百度的新闻源网站太多了,基本上大型的商业门户+政府官方的媒体、机构部门都是。2、出现在【百度新闻】里的网站都是新闻源网站。3、怎么判断一个网站是不是新闻源:1)在百度新闻下直接搜网站名字,如果出现...
- 外国网站的浏览器下载(外国网站的浏览器下载Games)
-
答,可在浏览器上面下载所需要的视频/音乐的名称,下载完毕后,按所给的排列表找出所需要的视频/音乐。如果是喜欢的视频/音乐它在浏览器里边都有分类,可详细的介绍一下自己吧,还可以在古典音乐或者名著导读介绍...
-
- 京东攒机助手(京东攒机在哪)
-
自己在京东买的配置,以为身边的人能帮忙组装,但是好像超过了个人的认知,所以无奈之下只能在京东找专业人士进行安装,挺快,前一天傍晚下单,第二天上午上班就来了,组装师傅挺好,挺有耐心,业务也挺熟练,走线看起来也不错,买的机箱是师傅从来没有接触过...
-
2025-11-14 22:03 off999
- 腾讯电脑管家和360哪个好(腾讯电脑管家好用还是360好用)
-
两个都很好。1.腾讯电脑管家和360卫士都是电脑上最常见的免费杀毒软件,两款软件在病毒查杀上都是首屈一指的。2.360卫士在功能上十分丰富,从木马查杀到电脑清理以及优化加速都是一应俱全的,而且还集成了...
- 笔记本突然没声音(笔记本突然没声音是什么原因)
-
可能是因为电脑声音驱动设备故障导致电脑没有声音。解决方法:使用Win+X快捷键,然后在弹出的窗口中点击“设备管理器”选项,之后点击“打开声音、视频和游戏控制器”选项,打开的属性界面查看运行是否正常,或...
- 大白菜一键装机win7系统(大白菜装系统教程win7)
-
1.电脑开机按f2或del进bios里面,启动项里面设置U盘启动,保存退出重启。2.键盘上一直按f12或f10,选择大白菜的u盘,进入pe界面,键盘按上下健移动,选择2003pe或win10pe,按回...
- 电脑windows密钥怎么查(windows密钥怎么看)
-
Win10系统查看并激活产品密钥的方法为:1、首先、进入到电脑屏幕的首页,在左上角会看到界面首页的“此电脑”选项。2、右键单次点击“此电脑”选项,在弹出的菜单快捷栏中选择最下方的“性”选项,并进行点击...
- 深度技术ghost xp sp3 如何安装
-
1、ghostxpsp3快速装机版使用ghost镜像来安装。方便快捷易操作。2、电脑开机进入bios后设置成光驱启动。设置方法参阅主板说明书。3、放入安装光盘后保存退出。电脑自动重启后光盘开始引导...
- win7安装卡在正在为首次使用
-
有可能是配置比较多,你可以耐心等待一会儿,如果实在不行就恢复原来的操作,然后使用U盘安装系统。1、到微软官网下载Windows10的系统光盘映象文件。2、然后用微软官方的系统U盘制作工具,将系统光盘...
- 用启动盘怎么安装系统(启动盘装系统win10步骤)
-
首先,需要准备一个启动盘,可以是U盘或光盘。将启动盘插入电脑,重启电脑并按下启动键,进入BIOS设置,将启动顺序改为从启动盘启动。保存设置并退出BIOS,电脑会重启并进入安装界面。选择安装语言和时区,...
- 华为手机怎么换桌面壁纸(华为壁纸怎么设置)
-
1、打开手机设置,点击“显示”。2、选择“壁纸”。3、将“随机切换桌面壁纸”后面的选项打开。4、点击上面的“设置壁纸”。5、我们发现最下方一排的图片可以切换,这一排图片就是壁纸相册。6、回到上一个界面...
- win7系统重装后没声音(win7系统重装没声音怎么解决)
-
检查电脑音频设备是否有问题,排查无问题后检查电脑声卡驱动,安装第三方驱动软件工具,这里以驱动精灵为例,安装后对电脑驱动进行查找,将声卡驱动安装或者升级即可电脑重装系统后没有声音可能是因为系统驱动程序没...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
