最近,一个名为PyBoy的开源项目开始流行,因为它使用Python2.7重新实现了GameBoy上那些古老游戏的整个模拟器。用现代科技将古老的游戏重新演绎,一直是一件非常有趣的事情。大家都知道,GameBoy是任天堂在1989年推出的第一代掌上游戏机,对于一群80/90后来说,Gameboy是他们童年的一部分。不可或缺的一部分,可能有些人已经忘记了,但是说到《口袋妖怪》,应该很多人都能记住吧。除此之外,PyBoy支持通过API编写脚本,还添加了类型定义,这使得使用Cython编译软件成为可能,以实现与用C和C++编写的模拟器相媲美的性能。目前PyBoy在Github上有2600颗星,共有239个Fork(Github地址:https://github.com/Baekalfen/PyBoy/wiki/Scripts,-AI-and-Bots)。Access,从而支持和鼓励人们做实验研究,任何对机器人和人工智能感兴趣的人都可以尝试一下。创作者正在构建特定于游戏的包装器,目前允许程序员与俄罗斯方块和超级马里奥互动,而无需深入了解GameBoy。具体可以参考这个文档:https://docs.pyboy.dk。说到这里,不得不提的是这个项目的创建者是一位丹麦小哥。早在2015年,PyBoy就已经是一个大学项目。目前,创作者还想学习和尝试更多奇特的功能。根据大学项目,他们为模拟器添加了倒带功能,即你可以在任何游戏中倒带时间。PyBoy可以作为对象加载到Python中。这意味着它可以从另一个脚本初始化并由该脚本控制和探测。查看gamewrapper_tetris.py,了解与游戏交互的原始“机器人”。所有外部组件都可以在PyBoy文档中找到,这里是一个从屏幕读取数据的简短演示。该代码也可以在gamewrapper_mario.py以下位置找到:importosimportsysfrompyboyimportPyBoy,WindowEvent#MakesusabletoimportPyBoyfromthedirectorybelowfile_path=os.path.dirname(os.path.realpath(__file__))sys.path.insert(0,file_path+"/..")#throughiftheROMisgiven(sys.argv)>1:filename=sys.argv[1]else:print("Usage:pythonmario_boiler_plate.py[ROMfile]")exit(1)quiet="--quiet"insys.argvpyboy=PyBoy(文件名,window_type="headless"ifquietelse"SDL2",window_scale=3,debug=notquiet,game_wrapper=True)pyboy.set_emulation_speed(0)assertpyboy.cartridge_title()=="SUPERMARIOLAN"mario=pyboy.game_wrapper()mario.start_game()assertmario.score==0assertmario.lives_left==2assertmario.time_left==400assertmario.world==(1,1)assertmario.fitness==0#Abuilt-infitnessscoreforAIdevelopmentlast_fitness=0print(mario)pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT)for_inrange(1000):assertmario.fitness>=last_fitnesslast_fitness=mario.fitnesspyboy.tick()ifmario.lives_left==1:assertlast_fitness==27700assertmario.fitness==17700#Loosingalive,means10.000pointsinthisfitnessscoringprint(mario)breakelse:print("Mariodidn'tdie?")exit(2)mario.reset_game()assertmario.lives_left==2pyboy.stop()如果你在加载了超级马里奥乐园ROM的情况下运行上面的代码,你将得到类似于下面的图片和终端打印输出的内容请注意,马里奥的形状显示为索引0、1、16和17。SuperMarioLand:World1-1Coins:0lives_left:2Score:0Timeleft:400Levelprogress:251Fitness:0Spriteonscreen:Sprite[3]:Position:(35,112),Shape:(8,8),Tiles:(Tile:0),Onscreen:TrueSprite[4]:位置:(43,112),形状:(8,8),瓷砖:(瓷砖:1),屏幕上:TrueSprite[5]:位置:(35,120),形状:(8,8),瓷砖:(瓷砖:16),Onscreen:TrueSprite[6]:Position:(43,120),Shape:(8,8),Tiles:(Tile:17),Onscreen:TrueTilesonscreen:012345678910111213141516171819____________________________________________________________________________________0|3393393393393393393393393393393393393393393393393393393393391|3203203203203203203203203203203203203203203203203203203203202|3003003003003003003003003003003003003213223213223233003003003|3003003003003003003003003003003003243253263253263273003003004|3003003003003003003003003003003003003003003003003003003003005|3003003003003003003003003003003003003003003003003003003003006|3003003003003003003003003003003003003003003003003003003003007|3003003003003003003003003103503003003003003003003003003003008|3003003003003003003003103003003503003003003003003003003003009|30030030030030012931030030030030035030030030030030030030030010|30030030030030031030030030030030030035030030030030030030030011|30030031035031030030030030030630730030035030030030030030030012|3003683693000130030630730530030030030035030030030030030013|310370371300161730030530030530030030030030035030030030030014|35235235235235235235235235235235235235235235235235235235235215|353353353353353353353353353353353353353353353353353353353353
