您现在的位置是:首页 > 数码 > 

python玩转街机游戏,操作亲民!

2025-07-18 23:01:25
python玩转街机游戏,操作亲民! 这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用。通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状态,以及发送与游戏交互的动作。 跟大家推荐一下我的Python学习交流裙【 78

python玩转街机游戏,操作亲民!




这是一个允许你在几乎任何街机游戏中训练你的强化学习算法的Python库,它目前在Linux系统上可用。通过这个工具包,你可以定制算法逐步完成游戏过程,同时接收每一帧的数据和内部存储器地址值以跟踪游戏状态,以及发送与游戏交互的动作。


跟大家推荐一下我的Python学习交流裙【 784758214 】内有安装包和学习视频资料,零基础,进阶,,大牛在线解答疑问。希望可以帮助你快速了解Python、学习python


安装


GitHub地址:github/M-J-Murray/MAMEToolkit/blob/master/


你可以用pip安装这个库,只需运行以下命令:


pip install MAMEToolkit


演示:街霸




街霸是史上最经典的游戏之一。现在工具包内包含的街霸版本是街头霸王:三度冲击(Japan 990608, O CD),我们以此为例,用以下代码写一个随机智能体:


import randomfrom MAMEToolkit.sf_environment import Environmentroms_path = roms/env = Environment(env1, roms_path)
env.start()while True:move_action = random.randint(0, 8)attack_action = random.randint(0, 9)frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action)   if game_done:_game()   elif stage_done:_stage()   elif round_done:_round()


支持hogwild!

hogwild!? iu等人引入了一个叫做 Hogwild! 的更新策略,可以使 SGD 可以在多 CPU 上并行更新。处理器在无需对参数加锁的情况下就可以访问共享内存。但仅在输入的是稀疏数据时才有效,因为每次更新仅修改所有参数的一小部分。他们展示了在这种情况下,更新策略几乎可以达到一个最优的收敛率,因为处理器不太可能覆盖掉有用的信息。


from threading import Threadimport randomfrom MAMEToolkit.sf_environment import Environment def run_env(env):env.start()   while True:move_action = random.randint(0, 8)attack_action = random.randint(0, 9)frames, reward, round_done, stage_done, game_done = env.step(move_action, attack_action)       if game_done:_game()       elif stage_done:_stage()       elif round_done:_round() def main():workers = 8# Environments must be created outside of the threadsroms_path = roms/envs = [Environment(fenv{i}, roms_path) for i in range(workers)]threads = [Thread(target=run_env, args=(envs[i], )) for i in range(workers)][thread.start() for thread in threads]


建立自己的游戏环境


这个工具包之所以易于上手,是因为它和模拟器本身不需要太多交互,只需注意两点——一是查你关注的内部状态相关联的内存地址值,二是用选取的环境跟踪状态。你可以用MAME Cheat Debugger,它会反馈游戏的内存地址值如何随时间变化。如果要创建游戏模拟,你得先获得正在模拟的游戏的ROM,并知道MAME使用的游戏ID,比如街霸的ID是 sfiiin 。

游戏ID


你可以通过运行以下代码到游戏的ID


from  import Emulator
emulator = Emulator(env1, , , memory_addresses)


这个命令会打开MAME仿真器。你可以搜索游戏列表以到想要的游戏,游戏的ID位于游戏标题末尾的括号中。


内存地址


如果获得了ID,也有了想要跟踪的内存地址,你可以开始模拟:


from  import Emulatorfrom  import Addressroms_path = roms/game_id = sfiiinmemory_addresses = {       fighting: Address(	0x0200EE44	, 	u8	),       winsP1: Address(	0x020118	, 	u8	),       winsP2: Address(	0x0201185	, 	u8	),       healthP1: Address(	0x02068D0B	, 	s8	),       healthP2: Address(	0x020691A	, 	s8	)}emulator = Emulator(env1, roms_path, sfiiin, memory_addresses)


这会启动仿真器,并在工具包连接到模拟器进程时暂停。


分步运行仿真器


连接工具箱后,你可以分步运行仿真器:


data = emulator.step([])
frame = data[frame]
is_fighting = data[fighting]
player1_wins = data[winsP1]
player2_wins = data[winsP2]
player1_health = data[healthP1]
player2_health = data[healthP2]


step函数会把帧数据作为umPy矩阵返回,同时,它也会返回该时间步长的所有内存地址整数值。


如果要向仿真器输入动作,你还需要确定游戏支持的输入端口和字段。比如玩街霸需要先投币,这个代码是:


from  import Action
insert_coin = Action(	:IPUTS	, 	Coin 1	)
data = emulator.step([insert_coin])


要确定哪些端口可用,请使用list acti命令:


from  import list_acti
roms_path = roms/game_id = sfiiinprint(list_acti(roms_path, game_id))


下面这个返回的列表就包含街霸环境中可用于向步骤函数发送动作的所有端口和字段:


[{	port	: 	:scsi:1:cdrom:SCSI_ID	, 	field	: 	SCSI ID	},{	port	: 	:IPUTS	, 	field	: 	P2 Jab Punch	},{	port	: 	:IPUTS	, 	field	: 	P1 Left	},{	port	: 	:IPUTS	, 	field	: 	P2 Fierce Punch	},{	port	: 	:IPUTS	, 	field	: 	P1 Down	},{	port	: 	:IPUTS	, 	field	: 	P2 Down	},{	port	: 	:IPUTS	, 	field	: 	P2 Roundhouse Kick	},{	port	: 	:IPUTS	, 	field	: 	P2 Strong Punch	},{	port	: 	:IPUTS	, 	field	: 	P1 Strong Punch	},{	port	: 	:IPUTS	, 	field	: 	2 Players Start	},{	port	: 	:IPUTS	, 	field	: 	Coin 1	},{	port	: 	:IPUTS	, 	field	: 	1 Player Start	},{	port	: 	:IPUTS	, 	field	: 	P2 Right	},{	port	: 	:IPUTS	, 	field	: 	Service 1	},{	port	: 	:IPUTS	, 	field	: 	Coin 2	},{	port	: 	:IPUTS	, 	field	: 	P1 Jab Punch	},{	port	: 	:IPUTS	, 	field	: 	P2 Up	},{	port	: 	:IPUTS	, 	field	: 	P1 Up	},{	port	: 	:IPUTS	, 	field	: 	P1 Right	},{	port	: 	:IPUTS	, 	field	: 	Service Mode	},{	port	: 	:IPUTS	, 	field	: 	P1 Fierce Punch	},{	port	: 	:IPUTS	, 	field	: 	P2 Left	},{	port	: 	:EXTRA	, 	field	: 	P2 Short Kick	},{	port	: 	:EXTRA	, 	field	: 	P2 Forward Kick	},{	port	: 	:EXTRA	, 	field	: 	P1 Forward Kick	},{	port	: 	:EXTRA	, 	field	: 	P1 Roundhouse Kick	},{	port	: 	:EXTRA	, 	field	: 	P1 Short Kick	}
]


仿真器类还有一个frame_ratio参数,可用于调整算法所见的帧速率。默认情况下,MAME以每秒60帧的速度生成帧,如果你觉得这太多了,想把它改成每秒20帧,可以输入以下代码:


from  import Emulator
emulator = Emulator(roms_path, game_id, memory_addresses, frame_ratio=)


MAME性能基准测试

目前这个工具包的开发和测试已在8核AMD FX-800 .GHz CPU以及GB GeForce GTX 1060 GPU上完成。在使用单个随机智能体的情况下,街头霸王环境可以以正常游戏速度的600%运行。而如果是用8个随机智能体进行hogwild!训练,环境可以以正常游戏速度的00%运行。

Convet智能体

为了确保工具包能够训练算法,作者还设置了一个简单的5层Convet,只需少量调整,你就可以用它进行测试。在街霸实验中,这个算法能够成功学习到游戏的一些简单技巧,比如连击(combo)和格挡(blocking)。街霸本身的游戏机制是分成10个关卡(难度递增),玩家在每个关卡都要迎战不同的对手。刚开始的时候,这个智能体平均只能打到第2关。但在经过2200次训练后,它平均能打到第5关。


至于智能体的学习率,它是用每一局智能体所造成的净伤害和所承受的伤害来计算的。

跟大家推荐一下我的Python学习交流【 784758214 】内有安装包和学习视频资料,零基础,进阶,,大牛在线解答疑问。希望可以帮助你快速了解Python、学习python


来自 “ ITPUB博客 ” ,链接:/,如需转载,请注明出处,否则将追究法律责任。

转载于:/

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/805345.html

相关标签:无
上传时间: 2024-01-17 22:29:57
留言与评论(共有 15 条评论)
本站网友 北京师范大学珠海分校教务处
12分钟前 发表
scsi
本站网友 牙线怎么用
5分钟前 发表
 
本站网友 林霞
11分钟前 发表
IPUTS
本站网友 天工
9分钟前 发表
IPUTS
本站网友 重庆美仑美奂
28分钟前 发表
 
本站网友 人身上被螨虫咬的图片
1分钟前 发表
{ port
本站网友 长风万里送秋雁下一句
15分钟前 发表
而如果是用8个随机智能体进行hogwild!训练,环境可以以正常游戏速度的00%运行
本站网友 免费论文下载中心
11分钟前 发表
  field
本站网友 北京最好的隆胸医院
4分钟前 发表
  u8 )
本站网友 苏州美容医院
7分钟前 发表
  field
本站网友 桌面上文件删不掉
29分钟前 发表
  P1 Strong Punch }
本站网友 聊城房屋出租
9分钟前 发表
{ port
本站网友 华普报价
16分钟前 发表
{ port
本站网友 胶南二手房网
10分钟前 发表
{ port