Python编写AI机器人玩爆星际争霸系列(1)

我们知道用Python可以给我们做很多工作,但用AI来玩游戏会是怎样的体验?2017年,暴雪同DeepMind合作推出了旗下著名的即时战略游戏星际争霸2的API,使用这些API竟然可以创建自己的AI机器人,操控AI机器人同电脑或者其他AI进行对战训练。

wall012-1024x768

相信很多朋友都听说过星际争霸这款游戏,作为暴雪乃至游戏界影响深远的游戏之一,其宏大的世界观、竞技性和观赏性让这款游戏经久不衰,甚至成为了韩国的国民游戏。星际争霸作为一款即时战略游戏,其玩法同其他即时战略游戏命令与征服、帝国一样,都是通过采集资来生产作战兵种同电脑或者其他玩家进行对抗。在星际争霸中,玩家可以在三个特色种族:人族、神族和虫族。

其中神族是一个依赖科技的机械种族,这次我们就通过Python AI来玩星际争霸。

首先让我们来看一下神族的科技树:

 

timg

游戏开局的时候,每个玩家都有一个主基地神族的(神族的基地叫Nexus)和若干农民。从科技树上我们看到,有了基地之后,玩家可以用农民建造传送门(兵营)和熔炉;建好融入就可以建造炮塔,以此类推;建造不同的建筑可以为玩家解锁新科技,允许玩家建造新的科技兵种。在这个过程中,玩家需要不断通过农民采集矿物和气体来建造这些科技建筑。同时生产作战兵种、农民和解锁科技均需要矿物和气体。所以资源、科技、作战兵种组合和战术是星际争霸的核心。当然想要在星际争霸中打败对手还需要考虑很多因素:地图地形、作战时机等等。先让我们一步一步来。

 

首先,我们要通过战网下载游戏客户端:http://sc2.blizzard.cn/download。现在星际争霸已经免费~

ss

然后,我们还需要下载一个Python wrapper,目前有两个和DeepMind集成的python wrapper: Python – sc2和pysc2。这里我们选择Python – sc2,相对来说容易上手。下载方法:在命令行中输入:

pip3 install --user --upgrade sc2

安装完成即可。

最后,我们需要下载星际争霸地图,登陆https://github.com/Blizzard/s2client-proto#map-packs,下载好地图,保存到星际争霸的地图文件夹下:一般是….\StarCraft II\Maps,如果没有Maps文件夹,新建一个即可,将地图包解压放到该文件夹下。这里需要注意如果你星际文件夹的安装目录不在C盘下,需要在下载的Python-sc2 wrapper中找到paths.py,修改默认路径:

BASEDIR = {
“Windows”: “C:/Program Files (x86)/StarCraft II”, //windows系统需要修改这段安装路径
“Darwin”: “/Applications/StarCraft II”,
“Linux”: “~/StarCraftII”
}

接下来,我们就可以写第一个案例,启动星际争霸,让农民伯伯开始干活:

新建一个Python文件,输入:

import sc2
from sc2 import run_game, maps, Race, Difficulty
from sc2.player import Bot, Computer

引入游戏所需要的资源。

接下来,我们需要创建一个我们自己的AI,可以叫他MrBot,这个bot(AI 机器人)继承sc2.BotAI的类。关于sc2.BotAI类的更多信息,可以参考sc2/bot_ai.py。里面提供了更多有趣的方法。

这样我们接下来,增加代码:

class MrBot(sc2.BotAI):

在星际争霸中,为了击败对手,我们首先需要采集资源,才能建造足够的军队。星际争霸中的资源有两种:Minerals(矿)和Gas(气体)。采矿和采气的工人在不同种族中有不一样的名字,神族的名字叫做Probes(探机)。游戏中,每次开局玩家会获得12个农民,每一个农民生产出来后第一件事情就是将农民分配到矿脉上,通常一个矿脉有三个农民采集就是饱和了。听起来很复杂,好在sc2.BotAI提供了自动分配农民的方法: distribute_workers

 

class MrBot(sc2.BotAI):
    async def on_step(self, iteration):
        # what to do every step
        await self.distribute_workers()  # in sc2/bot_ai.py

这里async是用来声明异步方法,这样我们不必让程序等待到上一个操作命令的执行完成结束,就可以同时开始做下一个命令操作。

接下来,我们需要启动游戏,让游戏执行我们的命令,我们需要通过下面代码实现:

run_game(maps.get("(2)CatalystLE"), [
    Bot(Race.Protoss, MrBot()),
    Computer(Race.Terran, Difficulty.Easy)
], realtime=True)

这里我们使用(2)CatalystLE这张地图,这之前需要确保下载并将该地图保存在Maps下,如果没有的话,可以换成其他地图。这段代码同时定义了AI机器人的种族:Protoss。同时设置了一个电脑对手,电脑对手的种族是人族,难度是easy.

完整代码如下:

import sc2
from sc2 import run_game, maps, Race, Difficulty
from sc2.player import Bot, Computer


class SentdeBot(sc2.BotAI):
    async def on_step(self, iteration):
        # 循环执行
        await self.distribute_workers()  # in sc2/bot_ai.py


run_game(maps.get("(2)CatalystLE"), [   #注意AbyssalReefLE是我们选择的地图需要事先保存在Maps的文件夹下
    Bot(Race.Protoss, MrBot()),
    Computer(Race.Terran, Difficulty.Easy)
], realtime=True)

执行这段代码之后,会自动启动星际争霸:

0H)P(9FAH[_W~CN_QWTDP_G D6Y4BGK2{{1R[S9IUB4C}]I

今天第一节分享到这里。

未经允许不得转载:Mr.开发者 » Python编写AI机器人玩爆星际争霸系列(1)

赞 (1)
分享到:更多 ()