文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-24 17:10

关注

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

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

目前,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以下位置找到:

  1. import os 
  2. import sys 
  3.  
  4. from pyboy import PyBoy, WindowEvent 
  5.  
  6. # Makes us able to import PyBoy from the directory below 
  7. file_path = os.path.dirname(os.path.realpath(__file__)) 
  8. sys.path.insert(0, file_path + "/.."
  9.  
  10. # Check if the ROM is given through argv 
  11. if len(sys.argv) > 1
  12.     filename = sys.argv[1
  13. else
  14.     print("Usage: python mario_boiler_plate.py [ROM file]"
  15.     exit(1
  16.  
  17. quiet = "--quiet" in sys.argv 
  18. pyboy = PyBoy(filename, window_type="headless" if quiet else "SDL2", window_scale=3, debug=not quiet, game_wrapper=True) 
  19. pyboy.set_emulation_speed(0
  20. assert pyboy.cartridge_title() == "SUPER MARIOLAN" 
  21.  
  22. mario = pyboy.game_wrapper() 
  23. mario.start_game() 
  24.  
  25. assert mario.score == 0 
  26. assert mario.lives_left == 2 
  27. assert mario.time_left == 400 
  28. assert mario.world == (11
  29. assert mario.fitness == 0 # A built-in fitness score for AI development 
  30. last_fitness = 0 
  31.  
  32. print(mario) 
  33.  
  34. pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT) 
  35. for _ in range(1000): 
  36.     assert mario.fitness >= last_fitness 
  37.     last_fitness = mario.fitness 
  38.  
  39.     pyboy.tick() 
  40.     if mario.lives_left == 1
  41.         assert last_fitness == 27700 
  42.         assert mario.fitness == 17700 # Loosing a live, means 10.000 points in this fitness scoring 
  43.         print(mario) 
  44.         break 
  45. else
  46.     print("Mario didn't die?"
  47.     exit(2
  48.  
  49. mario.reset_game() 
  50. assert mario.lives_left == 2 
  51.  
  52. pyboy.stop() 

如果在加载了Super Mario Land ROM的情况下运行上述代码,则将在下面获得类似图片和终端的打印输出。请注意,Mario的形状显示为索引0、1、16和17。

 

  1. Super Mario Land: World 1-1 
  2. Coins: 0 
  3. lives_left: 2 
  4. Score: 0 
  5. Time left: 400 
  6. Level progress: 251 
  7. Fitness: 0 
  8. Sprites on screen: 
  9. Sprite [3]: Position: (35112), Shape: (88), Tiles: (Tile: 0), On screen: True 
  10. Sprite [4]: Position: (43112), Shape: (88), Tiles: (Tile: 1), On screen: True 
  11. Sprite [5]: Position: (35120), Shape: (88), Tiles: (Tile: 16), On screen: True 
  12. Sprite [6]: Position: (43120), Shape: (88), Tiles: (Tile: 17), On screen: True 
  13. Tiles on screen: 
  14.      0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19 
  15. ____________________________________________________________________________________ 
  16. 0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 
  17. 1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 
  18. 2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300 
  19. 3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300 
  20. 4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 
  21. 5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 
  22. 6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 
  23. 7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300 
  24. 8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300 
  25. 9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300 
  26. 10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300 
  27. 11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300 
  28. 12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300 
  29. 13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300 
  30. 14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 
  31. 15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 

 

来源:开源最前线内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯