导航:首页 > 源码编译 > 星际争霸算法

星际争霸算法

发布时间:2024-07-31 14:59:46

❶ 星际争霸2的寻路算法思路是怎样的

首先地图整体开始前,会用多层可达矩阵算法,算出路径关键点
2,创建关键节点可达矩阵
3,再每个兵当前位置对关键节点进行路径计算
这样可以最小化资源占用就可以完成路径计算了,高数的离散数学,挺容易解的

❷ 人工智能有无可能打《星际争霸》,赢一个星际的高手

人类是不可能战胜ai的。大道理不说,围棋是人类的游戏,ai赢了,星际争霸是电脑的游戏,在人家的地盘上,你还搞毛毛啊。

人类能操作两线作战的,就是高手了,能操作三线作战的,我在自己的游戏生涯中没有见到,可能世界顶尖高手能做到吧。我拿我早期的一个游戏实例说明下,lost temple,pvz,z一队刺蛇在地图中央,和p的叉子,电兵周旋,你不动他就打你,你打他就跑,趁你不注意,点死你一个兵就跑,p无奈了,在他忙于操作这里的时候,家里被Z空投了。

还有一次,TV,被进攻的T和进攻的T兵力相当,进攻的T用雷达扫了下对方,发现他的机枪和MM在门口集合,双方兵力相当,可能防守的还多些,进攻方打了下兴奋剂,护士加上血,直接a过去了。对方发现的时候,如果不打兴奋剂,死得很惨,打兴奋剂是30血的枪兵对40血的枪兵,也是很惨。。。。

如果是ai,他会把这些发挥到极致,操作6个枪兵打4个XX绝对和玩一样。所以,这个ai和人类打星际的新闻有那么一句不知道你们注意看了没有。ai制作方要制定一个规则,这样才能和人类公平的竞技。所以说,人类选手面对的是一个被限制的ai,这样人类才有取胜的可能。

❸ 星际争霸2编辑器这个队伍怎么设置想要设置一个2打4的对局2个人机敌方人员4个玩家攻击他

制作一个最简单的塔防地图

在本教程中,你可以通过跟随教程制作一个简单的塔防地图,来了解一些制作炮塔防御类地图的相关知识。

注意,本教程假设你已经看过以下二篇暴雪官方教程,或已具备同等的基础知识:

地形模块、触发模块

以上二篇教程介绍了星际争霸II编辑器中绘制地形和使用触发器的最基本知识。了解它们是学习本教程的先决条件。

关于TD(塔防)地图

就本质上来说,TD(炮塔防御)地图是很简单的东西,简单到连简陋的星际争霸I地图编辑器都可以把它做出来。最初的塔防地图就是星际争霸I里面的,它在星际争霸I和随后的魔兽争霸III平台上不断发展,最终变成了一个独立的游戏类型。

虽然现在TD游戏已经衍生出各种各样的风格,但是说到底TD就是:玩家通过建造炮塔来防守电脑不断刷出来的兵。在通常TD游戏中,玩家方会有一些关键建筑物,被摧毁就算输。而有些TD游戏不一定有胜利条件,某些无限刷兵的TD玩的就是比谁撑得久。但是这些都不是规定死的,基本上,只要符合玩家通过建造炮塔来防守电脑不断刷出来的兵这一点的地图都算TD,其余的规则可由作者随便定义。

所以,本教程就围绕这个核心规则,来带大家制作一张最简单朴素的单人TD地图。这张地图将包含两条电脑进攻路线,每一波共100个怪物。玩家使用光子炮进行防守。胜利规则很简单:撑过所有9波攻击。失败规则为关键建筑物(神器)被毁。

当然,这张地图仅仅是一张制作塔防的入门教程,所有兵种数据皆采用默认,请勿指望本地图有什么平衡性可言。有兴趣的同学可以在平衡性方便自行探索。


准备地形和主角

由于本教程并不是地形教程,所以关于如何绘制地形的部分,大家可以参考官方教程《地形模块》。但是这里我也会对关键部分做一些说明。下面给出我用来演示本教程的地图所采用的地形图片。这张地形图仅仅是一个例子,大家完全可以按照自己的喜好来绘制自己的TD地图的地形。要注意的也就2点:1]确保我们构造的道路足够宽,免得电脑连路都走不进来。2]炮塔可以建造的那些位置必须能确实地攻击到电脑部队的进攻路线。

注意:如果你想要完全按照本篇教程的步骤来进行每一步操作,请务必在创建地图时选择搭载“战役”Mod。具体搭载战役Mod的方法,在官方教程《地形模块》中已有说明。

本教程为单人TD地图,但是设计了两条攻击路线。所以我们能在地图上看到2条通往中心的路。我们还可以看到,大路的上方和下方都有延伸出来的马路部分,电脑部队将创建在这里,并一路侵入中心部分。而在实际游戏中,我们会让玩家看到的区域比这里略小一些。这样,在玩家眼中,我们创建的电脑部队就好像是从地图外走进来的了。

我们可以直接在地图中心摆上我们想要防守的关键建筑物。这里我们选用的是战役中出现过的大杀器:萨尔纳加神器。

选中它并没有什么特殊原因,仅仅是因为我们可以在危急的时候使用神器的全屏秒杀技能:能量新星来救场。毕竟本地图仅仅是个教程示例,所以游戏难度是很低的。如果想要适当加大游戏难度,大家可以选用别的建筑。

由于本地图分为了2层。而下层是电脑的进攻路线。而我们不希望玩家可以在下层建造炮塔,否则会阻塞电脑的进攻路线(本地图中的炮塔设定为无敌的,无法被攻击)。所以我们需要进入地形编辑器的路径层,来画出我们禁止建造建筑的区域。

通过地形模块菜单中的层->路径来进入路径层(或者按快捷键H)。然后在地形模块左侧的地形笔刷中选择添加路径,类型为不可有建筑物。


然后我们就可以用笔刷在地图上涂抹禁止建造建筑物的区域了。如下图将整个下层区域全部填满即可。

另外,神器的周围也必须禁止建造建筑,以免玩家用炮塔将神器围住。


保险起见,我们需要在周围的河道里也涂上禁止建造的笔刷,免得玩家把炮塔造到河里。弄得不伦不类。

最后,我们在地图上放上我们用来建造炮塔的农民,我们这里选用Protoss的探测器。注意,这里我们把农民和神器都归到玩家1。


接下去,我们要为后面的刷兵触发器指定两个刷兵点。点击菜单中的层->点,然后在地图的上下两个入口放下两个点。


然后我们来进行触发模块中的最后一项操作。上面已经提过,我们要缩小玩家实际看到的地图范围,让玩家看到的电脑部队看起来像是从地图外走进来的那样。于是我们就需要画好玩家的可见区域,把上面的两个刷新点排除在该区域外。点击菜单中的层->区域,进入区域层。

然后新建一个区域,命名为Game Region,覆盖我们想要让玩家看到的部分,我们之后会使用触发器来将玩家的镜头限制在这格区域。(注意,由于镜头角度关系,玩家实际在游戏中可以看到的部分会比我们画出的略大,所以我们在画区域时要稍微画小一些。)

玩家属性

本地图中,我们将把左路和右路进攻的电脑分成2个不同的玩家。所以这张地图里总共需要一个真人玩家和二个电脑玩家。

使用菜单中的地图->玩家属性来对玩家属性进行设置。将玩家1的种族设为人类,控制者设为用户,玩家2和3的控制者设为电脑。


数据模块

由于这是个简易教程,所以我们不会对地图中的兵种作任何平衡性设定,而是直接采用默认数据。但是一些基本的数据更改还是必要的:在本地图的设计上,我们使用光子炮来作为防御用的炮塔,而且炮塔和农民都必须是无敌的。我们使用的Protoss农民必须可以在场地上快速飞行,同时不会阻塞到进攻路线上的电脑部队;而且它必须只能建造光子炮,无法建造任何其它建筑。因此我们还是得拜访一下数据模块。

在菜单中,点击模块->数据就可以打开数据模块。我们在数据类型那一栏中选择“单位”就可以打开单位数据页。我们在这里使用搜索功能来搜索来找到Protoss的农民:


我们可以看到右侧的属性列表列出了它的所有属性。这里,我们修改它的UI - 高度属性为1,这样我们的探机看起来就是悬浮在半空的了。并将移动 - 碰撞属性设为飞行,移动 - 移动器属性也设为飞行,这样探机就会真正地可以飞行,也不会挡住地面单位了。为了让探机能在场地上快速移动,我们再将它的移动 - 速度属性设为5。

注意:如果你看到的数据模块右侧窗格的数据并不是以列表模式显示的,请将右侧窗格上方的5个按钮全部按下。


我们对探机的设置还没有结束,我们找到探机的单位 - 标旗这一属性,在弹出的对象值窗口中勾上无敌,这样,探机便无法被伤害了。


我们还需要修改一下探机的命令面板。由于这个游戏里,探机只需要建造光子炮。因此我们可以完全抛弃建造页面按钮和采集按钮,直接把建造光子炮的按钮放到探机的默认按钮页里。下图是我们希望实现的效果:


按照以下步骤来实现:

在数据模块中找到探机的技能 - 命令面板属性并双击之,可以看到一个设置命令按钮的对话框。


我们选中第二行和第三行的所有按钮,将它们全部删除(点击图中的红色X按钮)。

然后选中左下方的空白格,点击对话框上的绿色+X按钮来新建一个按钮。使用的按钮为“折跃光子炮台”。并按照下图所示对命令按钮、技能、技能命令三项进行设置。这样便可将该按钮与折跃光子炮技能相绑定。


但光这样还不能直接建造光子炮台。默认状态下,光子炮必须在建好锻炉以后才能建造。我们同样需要去掉这一限制。

我们选中探机,并在数据模块左下角的关联浏览器窗格中选择技能分类下的探机 - 折跃(探机)这一技能(如下图所示)。


双击其技能 - 信息 +属性。在跳出的对话框中双击折跃光子炮台。


在跳出的建造信息对话框中,点击所需条件下面的红色X按钮。这样既可将建造光子炮台的前置条件清空并点击确定。:


于是,探机的修改已经完成了,我们尚需要对光子炮台本身进行修改。

我们在数据模块中找到光子炮台,并如法炮制地将光子炮台设为无敌的。


但是我们的光子炮台并不只需要无敌,默认的光子炮台无法建造在水晶矩阵之外。而我们的地图要求光子炮可以建造在任何地方,因此要去掉只能建造在水晶矩阵内的限制。

找到光子炮的行为 - 行为 +属性。将其中的能量使用者这一行为删除,只留下侦测单位和正在建造。


这样,建造光子炮台所需的一切限制都已被去除了。我们在数据模块的工作也已经结束。差不多该开始考虑触发器的编写了。

触发器框架构思

在动手编写触发器之前,我们先来考虑一下我们希望用触发器来做些什么,并将它们分一下类。

以本地图为例,我们要做的事情大致有三大块:

一、地图初始化触发器

所谓地图初始化触发器,即是地图在载完毕后要做的一些准备工作。 这一部分中要做的工作很杂,大体上有清除战争迷雾、开启电脑的自杀性进攻AI、设置电脑的结盟关系、给玩家初始资金、显示一个刷兵的倒计时,并设置一些全局数据(比如电脑每一波刷兵时具体要刷什么类型的兵)。

在本地图中,我们计划用一个名为Init的触发器来做这些准备工作。

二、电脑的刷兵与进攻

这是本地图的核心触发。正如本文最初所说,TD地图的核心就是拿炮塔来防守电脑刷出来的兵。造炮塔的工作是由玩家完成的,所以我们只需要让触发器负责刷兵,并让他们进攻既可。在这张地图的设计中,电脑总共会发动9波攻击,每波100只怪物,左路和右路各50只。怪物的强度随着波次增加。

第一波:跳虫

第二波:爆虫

第三波:蟑螂

第四波:刺蛇

第五波:屠猎者

第六波:畸变体

第七波:雷兽

第八波:莽兽

第九波:王兽

当然,这是个简易的教程,以上兵种采用的都是默认数据。大家若想要做一个平衡的TD地图的话,尚需好好地考虑兵种数据的设置问题。

另外,本地图打算使用这样的刷兵规则:在前一波怪物死光后再等待20秒钟才会刷下一波怪。

我们计划用一个名为WaitForNextWave的触发器来判断目前这波怪物是否已死完,然后进行20秒倒计时。并在倒计时结束后用一个名为SendWave的触发器来刷下一波兵。

那进攻触发呢?其实我们并不需要在每一波怪物刷新后用触发器让他们进攻。我们只需要在地图初始化时准备一个自杀AI。那样电脑就会随时派出手头的全部兵力对玩家进行自杀性攻击。

三、胜利、失败触发器

确切地说,我们只需要一个失败触发器。在神器被毁以后让游戏失败。而玩家的胜利判断可以放在混合进上面的WaitForNextWave触发器中。因为WaitForNextWave会判断目前这波怪物是否已经死完。这样,只要在判断这个的时候附带判断一下目前这波怪物是否已经是最后一波,若是,立刻让玩家获胜既可。

我们计划用一个名为Defeat的触发器来进行失败判定。

触发器的编写

我们正式开始编写触发器:

一、地图初始化

在这一段,我们来实现Init触发器。在这个触发器中,我们要清除战争迷雾,然后把玩家1的镜头限制在Game Region区域内,给玩家1初始启动资金。开动两个电脑玩家的AI,让他们一直进行自杀性攻击。当然,为了避免两拨电脑自杀残杀,我们还需要让它们结盟。最后,设置好刷兵数据,并开动第一波刷兵的倒计时(20秒)。

接下来我们来按部就班地编写这个触发器:

由于在这格触发器中,我们要开启一个20秒的倒计时,还要把倒计时给显示出来,所以我们需要一个计时器和一个计时器窗口,还要准备两个全局变量来记录它们。

新建两个全局变量,分别取名T和TW。T的类型为计时器,TW为计时器窗口。初始值保留默认。


我们还需要一个全局数组来保存我们每一波要刷新的怪物的单位类型。所以再新建一个名为WaveType的全局变量,类型为“单位类型”。并勾上数组的钩子,然后在大小的第一行中填上100。


这样意味着我们新建了一个容量为100的单位类型数组。可以保存最多100波怪物的单位类型。当然,在本地图中我们只需要保存9个。

准备完全局变量后,我们就开始编写Init了。新建一个触发器,起名Init。事件为地图初始化。代表本触发器的动作全部都在地图载入完毕后执行。

先让大家预览一下Init触发器最终的样子:


-动作

在前二句中,我们使用启用或禁用可见性这条动作,分别将黑色遮罩和战争迷雾禁用掉。这样,我们在游戏里就看不到战争迷雾了,相当于打了地图全开秘技。因为战争迷雾在这个游戏里毫无意义。

在第三句中,我们使用设置镜头界限这个动作来将所有玩家的镜头限制在Game Region区域内。以下为该动作的参数详情:

设置镜头界限

玩家: 所有玩家

界限: Game Region

小地图: 执行

小地图参数设为执行,这样我们在限制玩家游戏区域的同时,也会影响到玩家的小地图,玩家的小地图将只显示玩家能看到的那一部分地形。

第四句,使用动作为玩家启用战役AI来为玩家2(电脑)启用AI。

第五句,使用动作全局自毁来让玩家2进行自杀性攻击,只要全局自毁开着,玩家2将会不断地派出自己手头的所有兵力来进行自杀性攻击,所以每一波进攻的时候,我们只需要给电脑补充兵力,具体进攻的命令AI会自己来完成。

第六第七句重复以上两句,对玩家3如法炮制。因为我们有2个电脑玩家。

第八句,使用修改玩家属性动作来修改玩家1的初始晶矿数量。这里设为600。因为每个光子炮需要150晶矿,所以开局时,玩家可以造4座炮塔。该动作的详细参数如下:

修改玩家属性

玩家: 1

属性: 晶体矿

运算: 设为

值: 600

第九句,使用设置同盟动作来让两个电脑玩家结盟,以免它们在地图中央交汇以后开始自相残杀。

设置同盟

源玩家: 2

目标玩家: 3

同盟设定: 以共享视野的方式结盟

第十-十八句,我们在这里用设置变量动作来预先设定好每一波要刷的怪物的类型,方便后面的刷兵触发来调用。

变量 -设置WaveType[1] = 跳虫

变量 -设置WaveType[2] = 爆虫

变量 -设置WaveType[3] = 蟑螂

变量 -设置WaveType[4] = 刺蛇

变量 -设置WaveType[5] = 屠猎者

变量 -设置WaveType[6] = 畸变体

变量 -设置WaveType[7] = 雷兽

变量 -设置WaveType[8] = 莽兽

变量 -设置WaveType[9] = 王兽

注意,这里为方便起见,我们从下标1开始赋值,WaveType[0]留空。

第十九句,我们使用开始计时器为第一波怪启动一个20秒的倒计时,使用的计时器为我们刚才新建的那个计时器变量。

开始计时器

计时器: T

重复: 一次性

时间类型: 游戏时间

持续时间: 20.0

在后面的触发器中,我们还会重复利用计时器T,在每一波怪物被消灭之后,下一波怪物刷新之前进行20秒的倒计时。

第二十句,虽然我们已经建立了一个计时器,但是不以计时器窗口来把它的时间显示出来的话,玩家是看不到的。所以我们用创建计时器窗口来创造一个计时器窗口。

创建计时器窗口

计时器: T

标题: "下一波攻击倒计时"

已流逝: 剩余的

可见的: 可见

这样,在地图初始化时,屏幕右上角就会出现一个标题为"下一波攻击倒计时"的窗口,并显示剩余时间。

本触发器最后一句动作,用变量TW来把刚才创建的计时器窗口记录下来,这样,以后就可以随时对这个窗口进行显示和隐藏的操作了。

变量 -设置TW = (上一次创建的计时器窗口)

二、刷兵间隔触发器

在这一段,我们来实现WaitForNextWave触发器在每波怪物死光后发动,为下一波攻击启动一个20秒的倒计时。如果最后一波攻击死光,那么立刻让玩家获胜。

要判断当前这波怪物有没有死光,我们需要一个全局变量来记录别的刷兵触发器所创造的攻击部队,以便WaitForNextWave触发器检查这个部队里的剩余人数。

于是我们新建一个名为AttackingGroup的全局变量,类型为单位组,初始值留空。


我们还需要两个整数变量,一个记录目前的这次攻击是第几波攻击。另一个决定这场游戏总共会创造几波攻击(本地图设定为9)。因为WaitForNextWave中需要进行一个胜利条件判定,看目前死完的这波怪物是否已经是最后一波。

于是我们新建一个名为WaveNumber的整数类型变量,初始值为0,一个名为WaveCount的整数类型变量,初始值为9

为了管理方便,我们新建一个名为Wave的触发器文件夹,以后刷兵相关的触发器和变量都放进这个文件夹。我们把AttackingGroup、WaveType、WaveNumber、WaveCount这四个变量全部都拖进去。

然后我们正式开始编写WaitForNextWave触发器。新建一个名为WaitForNextWave的触发,拖动到Wave文件夹里。

下面是WaitForNextWave触发器最终样子的预览:


-事件

我们使用任意单位死亡作为事件,因为单位组死光必定是以最后一个单位死掉为契机的。

-条件

我们使用单位组中的单位数量函数来计算AttackingGroup中活着的单位,如果为0则代表AttackingGroup(目前进攻的这波怪物)已经死光。这样才执行我们设定的动作。

-动作

先使用开启或关闭触发器动作来关闭当前触发,以免这个触发器在不恰当的场合下被触发。

然后我们使用If Then Else来进行一次胜利条件判断。就是看当前死完的这一波怪物的是否就是最后一波怪:即判断WaveNumber==WaveCount。如果确实相等,那么立刻让玩家1获胜。

如果还不是最后一波,那么重新显示(因为在后面的触发器中,我们会在计时器T走到0后隐藏掉这个计时器窗口)计时器窗口TW。并重新启动计时器T,进行20秒钟的倒计时。

显示TW用的是显示或隐藏计时器窗口这个动作。

显示或隐藏计时器窗口

玩家: 所有玩家

显示: 显示

窗口: TW

启动T的动作和初始化时启动T的动作完全一样,只要复制过来即可。

三、

刷兵触发器

在这一段,我们来实现SendWave触发器。这个触发器将在计时器T每次走到0时发动。为电脑玩家创造出下一波部队。由于我们已经在地图初始化时开启了两个电脑的自杀性攻击开关,因此在创造部队以后无需用触发器来命令他们进攻,他们会自己一个个地排队冲向我们的神器(因为这是地图上唯一一个可以攻击的目标)。

不过这不是本触发器唯一要做的事情。作为TD地图,我们需要一个收入资金的渠道,否则无以在游戏进行中建造更多的炮塔。一个最常见的收入方式便是杀怪得钱。只是,通常来说要改怪物掉落的晶矿,需要去数据编辑器里进行调整,而我们这里有9种怪物,一个个改有点麻烦。因此我们这里一并用触发器来解决了,在创建怪物的时候,一并设置好杀死它们所获得的晶矿数量,并设定一个每一波怪的晶矿奖励数量公式即可。

于是我们开始编写SendWave触发器。新建一个名为SendWave的触发,拖动到Wave文件夹里。

下面是SendWave触发器最终样子的预览:


由于在Init和WaitForNextWave两个触发器中都是用计时器T来做倒计时,而计时器到期后要做的事情又都是一样的(都是刷兵)。所以我们可以用SendWave来统一处理它们的到期事件。

-事件

我们使用计时器结束事件来捕捉计时器T走到0的瞬间。

-动作

第一句,我们使用播放音效动作来给玩家播放警报声。这是为了方便玩家注意到下一波怪物已经来了。因为玩家不可能一刻不停地注意着屏幕右上角的倒计时窗口。以下是详细参数

播放音效

玩家: 所有玩家

音效链接: UI_TerranKlaxonAlert

音量: 100.0

偏移量: 0.0

第二句,由于刷兵倒计时到了,所以我们需要刷下一波兵,因此我们先得将记录当前波次的变量加1。使用修改变量 (整数)动作可以简单地将WaveNumber的值加1 。

第三句,由于倒计时走完了,让显示着00:00:00的计时器窗口继续晾在那儿只有碍眼,而且还会误导玩家,故而我们在每次计时器走完后,使用显示或隐藏计时器窗口来隐藏计时器窗口TW:

显示或隐藏计时器窗口

玩家: 所有玩家

显示: 隐藏

窗口: TW

接下去要做的工作,我们得在刷兵点A创建50个属于玩家2的单位,在刷兵点B创建50个属于玩家3的单位,单位类型为我们在WaveType中事先设定好的当前波次对应的单位类型。然后用AttackingGroup单位组来记录下这些单位。

阅读全文

与星际争霸算法相关的资料

热点内容
华为v10模拟加密门禁卡 浏览:723
android修改app名称 浏览:640
辐射3伙伴命令 浏览:247
苹果电脑pdf转换成word 浏览:921
纯小数运算法则 浏览:385
php什么是事务 浏览:859
怎么添加网名文件夹 浏览:769
啊哈算法语言 浏览:677
马来西亚加密货币政策 浏览:233
交通银行app锁定怎么解锁 浏览:54
php登录验证session 浏览:730
粤政易文件放在手机哪个文件夹 浏览:107
打印机和传真命令 浏览:550
php添加购物车 浏览:5
安卓怎么下载植物大战僵尸1无尽版 浏览:267
程序员上班下班难吗 浏览:299
梦的pdf微盘 浏览:186
材料结构分析pdf 浏览:795
程序员预研的项目 浏览:346
新华保险服务器登录不上怎么回事 浏览:397