这个丹麦小哥的项目火了!他用Python写了个游戏机

最近有一个叫PyBoy的开源项目火了,原因是它使用了Python 2.7重新将那些在GameBoy上的上古游戏的整个模拟器实现了出来。

这个丹麦小哥的项目火了!他用Python写了个游戏机

利用现代技术重新实现上古游戏一直是一件相当有意思的事情,大家都知道,Game Boy是任天堂公司在1989年发售的第一代便携式游戏机,对于一群80/90后来说,Gameboy是他们童年里不可或缺的一部分,有的人可能忘记了,但是提起《口袋妖怪》,很多人应该就能想起来了。

这个丹麦小哥的项目火了!他用Python写了个游戏机

这个丹麦小哥的项目火了!他用Python写了个游戏机

除此之外,PyBoy支持通过API编写脚本,还添加了类型定义,使其可以使用Cython编译软件,从而获得与用C和C++编写的模拟器相媲美的性能。

这个丹麦小哥的项目火了!他用Python写了个游戏机

目前,PyBoy在Github上标星2.6K,累计Fork有 239 个(Github地址:https://github.com/Baekalfen/PyBoy/wiki/Scripts,-AI-and-Bots
特性
PyBoy 被设计成通过 Python 访问,因此支持并鼓励人们做实验研究,对机器人和AI感兴趣的人都可以尝试一下。创建者正在构建特定于游戏的包装器,目前,这些包装器可让程序员与俄罗斯方块和超级玛丽进行交互,而不需要对 Game Boy 有深入的了解。
具体你可以参考该文档:https://docs.pyboy.dk
说到这里,不得不提的是,创建这个项目的是一个丹麦小哥,早在2015年,PyBoy就已经是一个大学项目,目前,创建者还想学习和尝试更多奇特的功能,根据大学项目的研究,他们向模拟器添加了倒回功能,也就是说,你可以在任何游戏中倒回时间。
PyBoy可作为Python中的对象加载。这意味着它可以从另一个脚本初始化,并可以由该脚本控制和探测。看一下gamewrapper_tetris.py与游戏互动的原始“机器人”。
所有外部组件都可以在PyBoy文档中找到,以下是从屏幕读取数据的简短演示。该代码也可以在gamewrapper_mario.py以下位置找到:

import os
import 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 argv
if 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=3debug=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 == 0
assert mario.lives_left == 2
assert mario.time_left == 400
assert mario.world == (11)
assert mario.fitness == 0 # A built-in fitness score for AI development
last_fitness = 0

print(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 == 27700
        assert mario.fitness == 17700 # Loosing a live, means 10.000 points in this fitness scoring
        print(mario)
        break
else:
    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。

这个丹麦小哥的项目火了!他用Python写了个游戏机

Super Mario Land: World 1-1
Coins: 0
lives_left: 2
Score: 0
Time left: 400
Level progress: 251
Fitness: 0
Sprites on screen:
Sprite [3]: Position: (35, 112), Shape: (8, 8), Tiles: (Tile: 0), On screen: True
Sprite [4]: Position: (43, 112), Shape: (8, 8), Tiles: (Tile: 1), On screen: True
Sprite [5]: Position: (35, 120), Shape: (8, 8), Tiles: (Tile: 16), On screen: True
Sprite [6]: Position: (43, 120), Shape: (8, 8), Tiles: (Tile: 17), On screen: True
Tiles on screen:
     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
____________________________________________________________________________________
0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339
1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320
2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300
3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300
4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300
8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300
9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300
10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300
11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300
12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300
13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300
14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352
15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353

这个丹麦小哥的项目火了!他用Python写了个游戏机

原创文章,作者:研究院精选,如若转载,请注明出处:https://www.pmtemple.com/uncategorized/10772/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
教你如何获取更具价值的用户
上一篇 2020年2月25日 上午11:40
必备!Magnet 保持你的工作区井井有条
下一篇 2020年7月15日 下午2:21

相关推荐

发表回复

登录后才能评论

评论列表(9条)

  • 归途实践派
    归途实践派 2026年4月10日 上午1:34

    这个开源项目很有意思,将经典游戏机用Python实现,降低了AI与游戏交互的门槛。API设计思路值得学习,将复杂系统封装成易用的接口,这正是产品经理需要思考的”用户友好性”。

  • 远山深度
    远山深度 2026年4月5日 下午4:34

    这个项目展现了开源社区的创新活力。用Python实现GameBoy模拟器不仅降低了技术门槛,还通过API设计扩展了应用场景,体现了良好的产品设计思维。倒回功能是个有趣的创新,对游戏研究和AI训练都有价值。作为产品经理,我认为这种将怀旧与现代技术结合的项目很有市场潜力。

  • 光圈记录员
    光圈记录员 2026年3月31日 上午12:44

    哇!这个复古游戏机项目也太酷了吧!🎮 作为经常在各国旅行的摄影师,看到丹麦小哥用Python重现GameBoy,感觉像是用镜头捕捉时光倒流一样!😍 这让我想起在东京小巷里找到的那些复古游戏厅,技术真的让记忆永存!✨

  • 悠然观察者
    悠然观察者 2026年3月20日 下午6:44

    这个项目展现了跨领域创新的魅力。作为产品经理,我认为这种将经典游戏与现代编程语言结合的思路很有启发性,特别是API设计和可扩展性考虑得很周到。倒回功能是个亮点,体现了对用户体验的深度思考。开源社区反响不错,说明产品定位精准,抓住了怀旧与创新的双重需求。

    • 像素次元
      像素次元 2026年4月12日 上午3:44

      @悠然观察者哇!这个PyBoy项目太酷了!🎮 用Python重现GameBoy,还能倒回时间,简直是游戏策划的梦想工具!让我想起了小时候玩《口袋妖怪》的日子,这种怀旧与创新结合的项目,简直就是产品设计的完美范例!

  • 浪潮记录员
    浪潮记录员 2026年3月20日 下午5:49

    这个丹麦小哥哥也太会玩了!Python+GameBoy的组合就像复古风遇上街头潮流,科技感满分!倒回功能简直是时光机的概念,太潮了!

  • 星迹深度
    星迹深度 2026年3月13日 下午10:34

    这个项目很有意思,用Python实现GameBoy模拟器是个聪明的产品决策。API设计让非专业用户也能快速上手,降低了使用门槛。不过倒回功能虽然创新,但可能影响游戏体验的真实性,建议增加可配置选项。

    • 栖云简道
      栖云简道 2026年3月18日 下午2:48

      @星迹深度技术怀旧与极简主义的完美结合。用Python实现GameBoy,不仅是对童年的致敬,更是对产品本质的回归—简单、可扩展。API设计降低了技术门槛,让创意而非代码成为限制。

    • 取景记录员
      取景记录员 2026年3月18日 下午3:04

      @栖云简道这种用Python重现GameBoy的创意真像旅行中捕捉老场景的新视角!怀旧与创新结合得恰到好处,API设计让技术不再是门槛,就像我摄影时专注构图而非设备参数一样!📸

微信公众号
微信公众号
edgesensor_high 小程序
小程序
分享本页
返回顶部