用 Python 写出了一个 Gameboy 模拟器

用python回忆童年,嘿!还真把游戏模拟器跑起来了 写在前面 故事的起源非常简单,我无意中看到了复古游戏机,然后联想到了儿时的回忆,心想能不能用Python跑个模拟器出来,然后运行一下黑白游戏。其实想想也就罢了,没想到捣鼓了一路,最终还真配置出来一个可以操作的东东。 先直接露底,这个用到的也是Python的一个现有库,叫做PyBoy,我翻看了一下搜索引擎,发现没有认真写这个模块的,估计关注人数没那么多。 作为一个Python知识普及者,坚... 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

感觉用 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 作为基准的原因主要有如下几点:

  1. Atari 环境能够让我们使用相同的算法测试多个不同的环境,验证 RL 算法的通用性;

  2. 由于输入仅为游戏图像,增加了问题的复杂性;

  3. Atari 为研究人员提供了一个公认的测试平台,能够较为公平地比较不同算法之间的性能;

  4. 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 的环境,那么安装会非常简单:

  1. 通过软件包管理器安装 SDL2(sudo apt install libsdl2-dev 或是 brew install sdl2)

  2. 使用 pip install pyboy 安装 Pyboy

可以直接从终端 $ pyboy file.rom 使用 PyBoy 或者在 Python 脚本中使用:

from pyboy import PyBoy
pyboy = 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 sys
from pyboy import PyBoy, WindowEvent
# Makes us able to import PyBoy from the directory below
file_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.argv
pyboy = 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_wrapper()
mario.start_game()
assert 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 development
last_fitness = 0print(mario)


pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT)for _ in range(1000):
    assert mario.fitness >= last_fitness
    last_fitness = mario.fitness


    pyboy.tick()
    if 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_game()assert mario.lives_left == 2


pyboy.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精选优质文章合集
回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~
题图:pexels,CC0 授权。

好文章,我在看
Game Boy 模拟器!完美运行超级马里奥、口袋妖怪等游戏 Game Boy 模拟器!完美运行超级马里奥、口袋妖怪等游戏 【导语】:基于 Python 的 Game Boy 模拟器,超级马里奥、口袋妖怪等耳熟能详的游戏都可以在上面完美运行。 简介 PyBoy 是一个基于 Python 的 Game Boy 模拟器,超级马里奥、口袋妖怪等耳熟能详的游戏都可以在上面完美运行。这款模拟器的独特之处,在于你能用它来创建 AI 或机器人,让它基于强化学习实现自动打游戏通关等骚操作。 项目地址: https://github.com/Baekalfen/PyBoy 下载 阅读详情

相关推荐

深入Pyrite:GameBoy Advance模拟器源码解析

本文还有配套的精品资源,点击获取 简介:Pyrite是一个开源的GameBoy Advance模拟器,用Rust语言编写,并利用OpenGL图形渲染技术提供流畅的游戏体验。本文详细介绍Pyrite模拟器的原理与开发,包括Rust语言的内存安全特性、OpenGL图形渲染技术,以及模拟器如何复刻GBA硬件和游戏环境。开发者可以参考源代码和文档进一步学习和参与模拟器的开发,而Py...

weixin_35592186的博客 1766

用Python写出Gameboy模拟器,还能训练AI模型:丹麦小哥的大学项目火了

点击上方“Python高校”,关注文末干货立马到手来源:机器之心感觉用 Atari 游戏研究人工智能有点「不够接地气」?现在我们可以使用 Gameboy 模拟器了。对于很多 80 后、9...

Python爬虫和机器学习专栏 586

GameBoy模拟器源代码

任天堂GameBoy的模拟器virtual_gameboy的源代码,给喜欢模拟器的朋友们。

探秘PyBoy:一款Python实现的Game Boy模拟器

![PyBoy Logo](https://github.com/Baekalfen/PyBoy/raw/master/extras/README/pyboy.svg) PyBoy是一款用Python编写的Game Boy模拟器,它不仅能够让你在计算机上重温经典的游戏体验,还提供了许多高级特性如回溯、人工智能接口以及脚本支持。如果你对游戏机模拟器的工作原理感兴趣,或者想利用这个平台开发AI游戏策

gitblog_00045的博客 1018

Python-Gameboy功能齐全的跨平台GameBoy模拟器

Gameboy - 功能齐全的跨平台GameBoy模拟器

故障转移集群无法连接到节点_Windows 2012系统群集故障转移集群

理论知识很重要!集群和群集是什么意思?其实看到标题可能会感觉有点绕,简单易懂的来说一下:集群,英文名称为Cluster,集群的意思就是将多个系统连接在一起,可以让多台服务器能够像一台服务器那样工作。通常采用集群系统是为了提高系统的稳定性和网络中心的数据处理能力以及服务能力。第二个就是:群集,其实这个概念也不难理解,群集是把多个计算机连接在一起,形成整形,随后可以更好的利用设备资源的一项新...

weixin_39535283的博客 3250

设计、训练、测试、部署,用Python手把手开发AI模型

释放 ML 模型的力量:使用 Python 进行设计、训练、测试和部署的指南

weixin_39915649的博客 3515

ESP32使用microPython控制240x240彩色屏幕显示中文

王铭东老师详细讲解了讲了关于240x240屏幕的一些基础东西,我这里在原功能的基础上拓展了中文显示的功能,顺带修改了实际操作过程中程序中遇到的一些问题。

m0_59452630的博客 1万+

python写计算机模拟器_用 Python 写出了一个 Gameboy 模拟器

点击上方“编程派”,选择设为“设为星标”优质文章,第一时间送达!感觉用 Atari 游戏研究人工智能有点「不够接地气」?现在我们可以使用 Gameboy 模拟器了。作者:机器之心编辑部对于很多 80 后、90 后来说,任天堂 Gameboy 代表了青春的很大一部分。很多我们耳熟能详的游戏都是最初搭载在这款 8 位游戏掌机上的,包括鼎鼎有名的《马里奥》、《塞尔达》系列。对于国内玩家来说,我们玩得最多...

weixin_39880318的博客 689

AT32串口打印全攻略:从零搭建到printf重定向(GCC版)

本文详细介绍了在GCC编译环境下为AT32系列MCU实现串口打印与printf重定向的完整方案。针对从Keil MDK迁移到GCC工具链时常见的串口无输出问题,文章从环境搭建、USART配置入手,重点剖析了GCC下printf重定向的核心原理——通过重写_write()函数,并提供了经过验证的代码实现、常见问题排查及性能优化建议。

weixin_29163797的博客 263

激光测距仪DIY指南:从元器件选型到精度优化(附避坑清单)

本文提供了一份详尽的激光测距仪DIY实战指南,涵盖从核心元器件选型到系统集成的全过程。重点解析了相位法测距原理,并分享了激光发射器与APD探测器选型、信号链路设计、低成本改造方案以及精度校准等关键环节的避坑经验,帮助电子爱好者与开发者深入理解并成功搭建高精度测距系统。

h6i7j8的博客 944

用 Python 写出 Gameboy 模拟器,这位丹麦小哥的大学项目火了!

公众号关注“菜鸟学Python”设为 “星标”,每天带给你Python干货!转自机器之心对于很多 80 后、90 后来说,任天堂 Gameboy 代表了青春的很大一部分。很多我们耳熟能...

cainiao_python的博客 400

Ubuntu中snap简单介绍

通过Snap可以安装众多的软件包。需要注意的是,snap是一种全新的软件包管理方式,它类似一个容器拥有一个应用程序所有的文件和库,各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题,使应用程序之间更容易管理。但是由此带来的问题就是它占用更多的磁盘空间 介绍一些常用命令,有点类似docker 1、查看已经通过snap安装的snap包 snap list可以查看 2、可以搜索想要的snap包,例如tomcat snap search tomcat

icanflying的博客 4万+

用深度强化学习玩atari游戏_用 Python 写出了一个 Gameboy 模拟器

优质文章,第一时间送达!感觉用 Atari 游戏研究人工智能有点「不够接地气」?现在我们可以使用 Gameboy 模拟器了。作者:机器之心编辑部对于很多 80 后、90 后来说,任天堂 Gameboy 代表了青春的很大一部分。很多我们耳熟能详的游戏都是最初搭载在这款 8 位游戏掌机上的,包括鼎鼎有名的《马里奥》、《塞尔达》系列。对于国内玩家来说,我们玩得最多的则应该是《口袋妖怪》系列了。这款游戏机...

weixin_39969448的博客 385

深入解析AUTOSAR中IIC的MCAL实现与Vector配置实践

本文深入解析AUTOSAR架构中IIC总线的MCAL实现与Vector配置实践,探讨IIC在汽车电子中的特殊定位及Vector的折中方案。通过Channel与Sequence设计模式、Chain特性应用及DaVinci Configurator配置步骤,提供IIC驱动的优化与安全实现方法,助力开发者高效解决车载通信问题。

weixin_29172963的博客 407

Jmeter压测报告

账户分析压测报告 一、测试内容 本次测试是针对账户分析进行的压力测试,在账户分析查询接口中,只对用户资产查询接口进行压力测试,其中不包含用户签名校验功能。 二、测试方法 本次采用apache的开源测试工具jmeter,采用本地动态拼装请求数据并通过http协议GET方式发送每日盈亏查询请求。并采用1000个用户账号测试访问情况。...

qq_31108731的博客 6627

使用python开发任天堂gameboy模拟器|pyboy开发实践

PyBoy是一个基于Python的开源Game Boy模拟器,通过软件模拟Game Boy的硬件组件(CPU、内存、GPU等)来运行原始ROM文件。其核心模块包括Sharp LR35902 CPU模拟、内存管理、图形渲染等,采用主循环结构逐帧执行指令并处理输入。该项目不仅支持游戏运行,还为AI研究和计算机体系结构学习提供了Python接口。文章详细解析了PyBoy的工作原理、核心组件及数据流,并展示了相关代码实现。

神奇代码在哪里 1602

智能能效管家:基于 ESP32 的智能插座设计与精细化功耗管理实现

针对传统插座无法远程控制、功耗监测缺失、能源浪费严重等问题,本文设计一款基于 ESP32 主控芯片的智能插座。该系统集成 WiFi 无线通信、交流功耗采集、继电器通断控制模块,实现四大核心功能。硬件采用模块化选型与安全接线设计,软件基于 Arduino-ESP32 框架开发,搭载 Mqtt 通信协议与功耗算法,可通过手机 / 云端实时管控设备,有效提升用电安全性与能源利用率。:ESP32;智能插座;功耗管理;远程控制;能耗监测。

weixin_42300449的博客 101

用Python忆童年,最终还真把模拟器跑起来了

GameBoy游戏窗口跑起的那一刻,充满魔力,每个午后,每次放学,每次拿起GB机,与三五朋友凑在一起,上下左右ABAB,现在想想,还真是幸福呢

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

探索复古游戏世界的奇妙之旅:GameBoy模拟器

探索复古游戏世界的奇妙之旅:GameBoy模拟器 去发现同类优质开源项目:https://gitcode.com/ 项目简介 在科技飞速发展的今天,我们有机会通过一款名为的开源项目,重温经典的8位游戏体验。这个项目是一个用Python编写的GameBoy高级别模拟器,它能够精确地复现GameBoy硬件的功能,让你在现代设备上畅玩那些充满童年回忆的游戏。 技术分析 模拟器架构 GameBoy模拟器的...

gitblog_00011的博客 499

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jsGB:用JavaScript打造你的网页版GameBoy模拟器完全指南

你是否曾经梦想过在浏览器中重温经典的GameBoy游戏?🎮 jsGB正是这样一个神奇的JavaScript模拟器项目,它让你能够在现代网页环境中体验原汁原味的GameBoy游戏!这个开源项目通过纯JavaScript代码完美模拟了GameBoy的硬件架构,为Web开发者提供了一个学习计算机架构和游戏模拟器开发的绝佳平台。✨ ## 🔍 什么是jsGB模拟器? jsGB是一个完全用JavaSc

gitblog_00706的博客 750

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 这 10 个GitHub库开发者必看
下一篇: 你用 Python 写过最牛逼的程序是什么?
codingpy
博客等级 码龄11年 1867粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值