PySC2 2.0新功能利与弊,用“星际争霸”的实例告诉你!
PySC2 2.0是在几天前刚刚发布的。最新版本的学习环境有了很大的的增强,但也出现了一些软件不兼容的问题。
在本教程中,你将会构建一个基本的“虫族机器人”,这个机器人将能够生成跳虫(游戏"星际争霸"中的兵种)并通过地图坐标对敌人发动攻击。作者这里已经假定你有基本的Python编程知识,并且能够安装PySC2 2.0。那么,现在开始教程吧。
1. 创建基本代理
首先,我们导入基本模块:
现在我们可以创建代理:
Step()方法是我们代理的核心部分,它是我们所有决策制定的地方。在每一步结束时,你必须返回一个动作,在这种情况下,这个动作就是什么都不做。我们会尽快添加一些行动。
如果你看过作者以前的教程,你就会注意到这个动作的格式已经改变了,以前的最后一行是:
作者认为新格式更容易遵循。这一步的完整代码在这里。
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step1.py)
2. 添加运行代码
现在我们建立环境,以便我们可以运行它。在作者的原始教程中,我们在命令行上运行了代理并传入了许多参数,但是在这里,我们将添加一些代码,以便代理可以在没有这些额外参数的情况下运行。
作者选择在这里使用深渊礁图地图,这比作者之前的教程中的Simple 64地图更有趣。
这里我们指定的第一个玩家是我们的代理人,并且代理人的种族是虫族。如果你很勇敢,你可以通过使用sc2_env.Race.protoss,sc2_env.Race.terranor甚至sc2_env.Race.random来选择其他种族。
接下来我们指定第二个玩家是一个机器人,这意味着它使用游戏的内部AI,机器人的种族是随机的,难度级别较低。
在这个空间中,你可以指定另一个代理,允许两个代理相互对战!
这里我们指定屏幕和小地图分辨率,这些是PySC2 1.x中的默认值。这些分辨率基本上决定了每个功能图层中有多少"像素"数据,这些图层包含地形高度、可见性和单位所有权等内容。你的机器人可以使用这些功能来做出决定。
PySC2 2.0的一个新功能是增加了RGB层,它本质上是可以看到的渲染游戏,如果你想使用该层,你需要在这里指定维度,但是作者不会在本教程中讨论该问题。
该参数决定了在你的机器人选择要采取的动作之前会经过多少道"游戏步骤"。 默认情况下,该设置为8,在"正常"游戏速度下约为300 APM,我们将其设置为160,以将APM降低到150。在此阶段,额外的APM不是必需的,如果你采取更少的行动,游戏会更快地完成。
在这里我们设置了每个游戏的固定长度,PySC2 1.x中的默认值在正常速度下大约为30分钟。 在PySC2 2.0中,你可以将此值设置为0,从而允许游戏在必要的时候运行。
这最后一个参数是可选的,但它可以方便地查看可视化,因为它包含有关机器人可用的所有观测图层的详细信息。通过在屏幕上看到这些图层,你可以更好地理解它们。
代码的其余部分仅仅是循环,将步骤细节提供给代理,接收一个动作,并重复直到游戏结束或直到终止。
现在你可以运行你的代理:python zerg_agent.py
你应该可以看到你的代理在收集矿物,直到它最终被敌人占领。
这一步的完整代码在这里。
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step2.py)
3. 选择一个无人机
在虫族代理生产任何跳虫之前,它需要一个产卵池。为了建立一个产卵池,我们需要选择一个无人机。
PySC2 2.0的一个很酷的新功能是增加了功能单元,它允许你通过屏幕要素图层获取有关屏幕上无法观察或获取困难的单位的信息。我们将使用功能单元来选择无人机。
另一个很酷的新功能是增加了一个单元列表,它允许你使用单元名称检索单元类型。以前我们用_TERRAN_SCV = 45之类的东西来编写我们自己的单元类型,但现在我们可以使用诸如units.Terran.SCV之类的东西。
让我们将单元列表添加到模块导入中:
我们还需要一些随机模块。
接下来,我们需要启用功能单元:
现在,在step()方法中,让我们使用功能单元功能获取屏幕上所有无人机的列表:
这很酷,对吧?!以前你可能做过类似的事情:
现在,我们选择一个无人机:
此处的select_all_type参数的作用类似于CTRL +单击,因此它将选择屏幕上的所有无人机。正如你所看到的,无人机的x和ycoordinates可以作为属性访问。还有更多的属性可以访问,如健康、盾牌、能量、build_progress以及重要的ideal_harvesters和assigned_harvesters的基地和vespene。
如果你喜欢,你现在可以运行代理,以确保你的无人机已被选中。
这一步的完整代码在这里
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step3.py)
4. 建立一个产卵池
在上面的代码之上,让我们确定我们选择了一个无人机。现在,在我们的课堂中添加一个小实用方法:
该代码检查单选和多选,以查看第一个选定的单位是否是正确的类型。在step()的顶部,我们可以使用这个方法:
接下来我们要确保我们可以建立一个产卵池。如果我们没有足够的矿物质,这是不可能完成的,所以如果我们不首先检查就会导致崩溃:
然后,我们可以在屏幕上选择一个随机点:
最后,我们将随机坐标输入到动作中。
试试看,如果你幸运的话,你将拥有大量的产卵池。我们如何阻止我们所有的无人机成为产卵池?
让我们添加另一种实用方法来选择给定单位类型的单位:
这与上面的代码相同,但可以根据需要将unit_type换出。让我们使用该方法来替换以前的代码:
然后我们可以使用该方法来获取产卵池:
这样比较好,现在我们需要只建立一个产卵池。
这一步的完整代码在这里。
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step4.py)
5. 建立跳虫
现在我们有了一个产卵池,我们终于可以建立一些跳虫了。我们首先选择屏幕上的所有幼虫:
然后我们可以创建一些跳虫。将此代码放在前一个代码的上方:
测试它,你应该能得到一个跳虫。
这很好,但我们无法建立足够的跳虫,我们的供应是有限的。我们需要一个霸主。
这一步的完整代码在这里。
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step5.py)
6. 产生更多霸主
当我们选择了幼虫时,如果我们不能自由的供应,我们可以产生一个霸主。
让我们添加另一种方法:
我们现在可以替换行动检查:
和:
和:
如果你现在测试你的机器人,你会发现它产生了很多的跳虫,是时候进行攻击了!
这一步的完整代码在这里。
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step6.py)
7. 攻击
在我们攻击之前,我们需要知道我们在哪里以及敌人在哪里。在本教程中,我们将假定产卵位置总是在左上角和右下角。所以我们需要找出我们的位置,并攻击对方。
我们来创建一个__init __()方法来初始化一个变量:
在step()方法开始时,添加以下内容:
obs.first()代码检查它是否是游戏的第一步。然后我们在小地图上得到我们单位的中心x和y坐标。这里有一个功能图层,它根据他们所属的人员来显示小地图上的所有单位。
现在我们有攻击位置,让我们来攻击。首先选择我们的军队:
在此之前,我们可以攻击:
测试一下。我们的跳虫会被咬!在我们攻击之前,等到我们有更多的跳虫时进行这一步:
这一步的完整代码在这里
(https://github.com/skjb/pysc2-tutorial/blob/master/Build%20a%20Zerg%20Bot/zerg_agent_step7.py)