说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

《Warcraft是怎样炼成的》:多人对战、战争迷雾以及AI

HTML文档下载 WORD文档下载 PDF文档下载
在之前的关于Warcraft开发的文章中,Warcraft之父Partrick Wyatt开启了一个“为什么Blizzard Entertainment成为了世界上最有名、最受欢迎的游戏公司之一”的话题,并从Warcraft和StarCraft开发回忆当初在Blizzard奋斗的过程,一步一步为我们描绘出Blizzard从普通的工作室开始的“征途”。

如果你没有看过之前的文章,可以点击这里:

  • 魔兽之父:《Warcraft是怎样炼成的(一)》
  • 《Warcraft是怎样炼成的(二)》:我们是一个团队
  • 《Warcraft是怎样炼成的(三)》:从Demo到游戏

支持多人游戏


1994年6月,也就是在10个月的开发之后,游戏引擎已经基本上支持多人对战了。随着代码集成的进行,我感到越来越兴奋,因为马上就可以使用Warcraft进行多人对战了!虽然我一直忙于游戏核心逻辑的设计、实现(事件循环、单位调度器、路径寻找、战术AI单位、状态栏、游戏内UI、高级网络代码等等),其他程序员已经开始着手多人对战相关功能的开发了。

Jesse McReynolds ,Caltech(加里福利亚理工大学)的毕业生,完成一个低级网络库的开发,可以在局域网络内发送IPX包。这些代码的实现得感谢id software John Carmack(3D游戏之父——约翰·卡马克)刚刚开源的Doom源代码,虽然IPX中间层只有几百行C代码,但它能很完美地跟网卡驱动结合,保证一个游戏客户端发出的信息能够传送到另一个玩家那里。

Bob Fitch,Cal State Fullerton(加州富乐敦州立大学)的硕士,开发了“glue screens”的原始版本,自此玩家已经可以创建或者加入多人游戏。Bob的办公室紧贴着我的,因此我们可以密切地合作,把他开发的“创建/加入游戏”功能融合进我设计的游戏事件循环中也因此变得非常方便。

在合并了这些更改之后,我把游戏客户端重新编译了一遍,并复制到网络共享盘中,Bob也紧接着回到办公室加入游戏。奇迹发生了,没有任何问题!就这样,Warcraft开始支持多人游戏。

在游戏过程中,我感受到前所未有的兴奋,在之前玩过的所有游戏中都没有这样的感觉。如此激动的原因一部分是因为我自己参与了部分代码编写;另两个更重要的原因在于:我是和人类做对手,而不再是计算机AI(Artificial Intelligence,人工智能);更特别的地方在于,因为“战争迷雾”的存在,我并不知道他在做什么。这甚至给我带来了心理上的恐惧感。

战争迷雾


一个小村庄被战争迷雾所包围着,那里究竟发生了什么?!?

早期的游戏里,视野外的敌人是隐藏的,这正是“战争迷雾”设计的原型。除非有友方单位探测过,否则地图将会被黑色的图形层覆盖,以此来模拟真实战斗中无法获知敌人的调度和行动。

Empire,Walter Bright(“D语言”之父)大约17年前所开发的游戏,也出于同样的目的使用了战争迷雾。如果地图上的某一块并没有被探索过,那么它将处于烟雾笼罩之下,所以游戏初期的一个重要任务就是去探索(未探索过的)地图。

心理上的恐惧源于我无法得知对手正在做什么,正如历史上很多将军死亡那样。RTS游戏中加入了这一元素让游戏精彩(恐怖)程度更上一层。感谢Westwood的Walter以及其他想到了这一创意的人。

计算机AI


正如很多玩家所知,计算机控制的“人工智能(Artificial Intelligence)”(AI)通常在战略上很弱,所以人类玩家经常可以AI玩家的程序漏洞,因此可以轻松获胜。为了保证可玩性,AI玩家的队伍通常会在队伍数量、位置上有优势,又或者是通过其它“不对称规则”来给人类玩家足够的挑战。

大部分Warcraft的任务中,计算机敌人通常一开始就会拥有整个城市以及军队。此外,Warcraft还为AI制定了其它不平等的规则,如同作弊一样。

我们制定的不公平规则之一就是:AI玩家每次采矿后金矿数量减少地更少,所以很少会有矿井被采空的情况发生。人类玩家在采矿时会从矿井移除100个矿石单位到市政大厅,但AI玩家同样采一次100单位的矿石,矿井只会减少8个单位的矿石。

这种不对称规则有两方面的好处:

  1. 防止人类玩家使用“龟缩战术”(不停地堆积防御性建筑,直到变得无懈可击的时候才进行攻击。),因为计算机能够近乎无休止地采矿并且发展军队,于是玩家不得不使用高级战术来战胜计算机AI。
  2. 当玩家战胜了一个计算机玩家的时候,相当于得到了一个可以使用金矿作为奖励,相比于在有限的资源中磨出胜利,这样的游戏节奏变得更快、更有趣。

大多数玩家都意识到了另一个更加违反公平竞争原则的规则:计算机AI在作弊,因为战争迷雾对它们无效;AI知道玩家每时每刻究竟在做什么。在实战中这是个非常大的优势,可惜计算机没有那么聪明,也无法充分利用这一优势。

有趣的是,在StarCraft流行的那段时间里(自发布以来14年多的岁月),一直有一群AI程序员视图制作无作弊AI的挑战。在BWAPI库的帮助下,这些程序员可以编辑代码直接注入到StarCraft的引擎中去,并且和AI一决胜负。虽然BWAPI AI已经很厉害了,但StarCraft高手仍然可以轻松战胜它们。

和真人对战


作为战略游戏资深玩家,我很清楚那个时代计算机AI的局限性。在和众多AI对战的经历中,鲜有败绩,即使在面对Eastern Front(Chris Crawford开发的东部战线)中俄罗斯的疯狂进攻,也从未有面带惧色。

我玩过的这些游戏都非常有趣而且令人兴奋,但从不令人恐惧;这在Warcraft多人对战中就不一样了!

我需要战胜的是一名人类玩家——我所面对的不仅是技巧和战略,还有敌人快速的控制。因为战争迷雾的存在,双方都不知道对手的动作,因此更加令人振奋。我在职业生涯中从未对某款游戏感到如此激动,但是第一次玩Warcraft的时候却不一样,不到迷雾揭开之时都是胜负难知。

我的血液在沸腾,肾上腺素在飙升,只为了更快地伐木、采矿、建造农场和兵营,当然还包括组织战力、探索地形以及——最重要的——在Bob的军队成型前将他击溃!相信Bob也是一样。

我们并没有在游戏开始前对引擎功能进行测试,因为脑海中只有火热的决胜之心,相信Bob也想夸耀自己才是第一场Warcraft多人对战的胜利者吧!除此之外,我们还经常一起在Blizzard玩Doom,在一场激烈的游戏后,Bob怒气冲冲地说不再跟我玩了,因为我总是用火箭炮秒杀他。当然,我知道他一直都在找机会报仇。

在对战中,我们加倍努力地建造单位并派遣到战场上,在找到他的基地并进攻的时候,我甚至感到胜券在握了。Bob的战略杂乱无章,我觉得能够轻易将其击溃,但是稳重起见,我还是开始更疯狂地建造单位,并且在战场上击杀他的部队。

然后……游戏崩溃了:

坏消息——DOS4GW告诉我Warcraft崩溃了

这是程序员间的常识——任何一款程序在第一次运行时成功的概率接近于0,游戏半途崩溃不足为奇。游戏的画面在不停地从屏幕上方向下滚动,伴随着DOS4W“crash screen”的字样,这对Windows之前的游戏开发者来说在熟悉不过了。现在我们能得到更详细的Windows错误提示框,玩家可以反馈游戏崩溃记录,当然也有不少玩家会遇到“蓝屏死机”状态,和老式错误提示非常相似。

在崩溃后,我几乎从椅子上跳了起来,直接冲向Bob的办公室,叫嚷着“That was awesooooommmme!”。立刻就得到了回应“… and I was kicking your ass!”我竟然听到Bob说他差点就彻底摧毁我了。

几分钟后我们才从混乱中缓过神来——我们的游戏bug不仅在于崩溃,而且还有个“同步bug”,也就是说游戏状态不完全同步:两台机器上显示着不同的战斗,虽然初始状态相同,但渐渐地就进入了两个完全不同的世界。

没有网络编程经验的人可能会认为,两个Warcraft客户端可以在游戏过程中来回发送/接收整个游戏状态;但实际上,每台计算机仅仅会发送每个单位的位置和状态。对于只有几个板块位置的慢节奏游戏,如国际象棋或者跳棋,这种想法可能还算合理,但对于Warcraft这样每个动作涉及到超过600个单位的游戏来说,不可能通过网络传输所有的状态。

我们预计会有不少玩家使用2400波特的调制解调器,每秒只能传输几百个字符的信息,没有使用过调制解调器的年轻玩家应该花点时间去学学这方面的技术。记住,我们现在讨论的是Amazon、Google、Netflix出现前的“黑暗世纪”。

因为有之前将Battle Chess从“DOS”移植到Windows上的经验,我非常熟悉多人游戏通过调制解调器通信的方式,调制解调器有限的带宽是不可能完整地传输整个游戏状态的,所以我的解决方案是仅仅发送每个玩家的命令,而每个玩家(的机器)同时执行这些命令。

我相信这个解决方案没有问题,因为计算机非常擅长执行命令。不幸的是,编程的人类却无法准确地告诉计算机应该怎样做,这就是出现bug的主要原因。虽然我们指望两台计算机做完全一样的事情,但因为bug而不一致,这就是问题所在。

之所以会出现游戏不同步的bug,是因为在模拟游戏中,两台计算机面对同一个问题却给出了不同的答案,随之时间的推移,差异越来越大。正如《Back to the Future》这部穿越电影所描述的,穿越者在过去所做的小变化会导致完全不同的未来,Warcraft的差异也是如此。在我的计算机上,我的Elvish archer(精灵弓箭手)发现了对手的Orcish peon(兽族苦工),但对手的计算机却没有注意到我的进攻,继续伐木或者采矿,由于没有错误纠正程序来处理这些分歧,于是两台机器上的差异越来越大,以至于完全不同。

所以我们的第一场战斗只能算是平局——但对于整个开发团队来说,这是一个伟大的胜利——它还给我们带来很多乐趣!团队其他成员也渐渐地加入了进来,随着游戏/测试人员的增加,更多的bug暴露了出来。虽然游戏经常会遇到崩溃,而且还有更多的问题,但我们知道,这将会是一番大事业!

我们所需要的只是去把游戏做好。

可悲的是,很快我们就发现了更糟糕的问题:虽然同步bug很多,但造成这一现象的原因却也不少。如果这些同步bug处于相同的原因出现我们早就会开始根本问题的修复工作了。但事实证明有很多引发同步bug的原因,每一种都会带来不同类型的同步bug,而且每种bug都需要不同的修复方式。

为什么会出现同步bug?


在开发Warcraft I的时候,我设计了一种最小化数据传输的方法——只发送玩家发送的命令,比如“选择单位5”、“移动到位置650,1224”、“攻击单位53”等等。很多程序员都自主设计过这样的系统,这是“不发送整个游戏状态就同步游戏变化”的一个显而易见的解决方案。

说点不相关的:这段时间有几个专利好像就是冲着这个方法去的。久而久之,我开始认为软件不应该是专利,大部分软件专利并没有什么新意,有经验的程序员都能想到并实现,而根据定义,专利应该是不平凡的。闲话就说到这里。

那个时候,我还没有实现验证两台机器间同步的方法,所以任何会导致计算机做出不同选择的bug都会导致游戏走向分叉——也就是说,他们会变成两个松耦合的世界,虽然仍有交流,但差别会随着时间的推移而加剧。

所以很明显我的下一篇文章会是关于如何发现不同步问题的。

打持久战的准备


你们都知道这个故事的结局:Warcraft最终在5个月后发布了,它成为了不朽的传奇。这离不开我们每天长时间的辛苦工作,在解决了很多问题、克服了很多障碍和挑战之后,最终发布了我们所热爱的作品。在未来的几个月里,我将继续带你们探索Warcraft的开发之道。

原文链接:Code of Honer

StarCraft系列:

  • StarCraft开发的荆棘之路
  • StarCraft开发:如何避免链表引起的游戏崩溃
  • StarCraft: Orcs in Space 在欺骗中浴火重生
拷贝或移动列表框或组合框中的内容-VB资料 利用VB5开发ActiveX控件 利用VB三维面板控件设计流动条 浅谈用VB6.0编写BO程序 巧用Visual Basic的TIMER控件 VB取得控件绝对Top值 VB如何解决VB中的Grid 控件的打印问题 VB如果自定义 MsgBox 的按钮,标题等 VB如何创建数据绑定控件。 VB如何解决VB中的Grid控件的打印问题 VB如何强制文件对话框再次读取正确的磁盘? VB如何取得RichTextBox控件中光标所在行的值? VB如何设定 MsgBox 在若干时间之后若无回应則自动关闭? VB如何使用VB控件Commom Dialog VB如何用VB6写COM组件(二) VB如何用VB6写COM组件(一) VB如何在VB中使用Delphi的控件 VB如何在运行时动态增加控件 显示和隐藏鼠标-VB资料 VB用ActiveX Control Pad VB用API函数改进ListView 控件的显示效果 用VB6.0中文版进行DHTML程序开发 用VB编写标准CGI程序 用VB编写留言板 用VB播放FLASH动画 用VB开发进程管理软件 VB用WinSock设计Chat程序 运用MSChart,生成统计图形-VB资料 向文本框等等控件的系统右键菜单里追加自己定义的菜单-VB资料 在VB中用定时控件实现长定时操作 在Visual Basic中,在GotFocus事件中快速选定文本 哪位大哥帮翻译一句话!非常感谢!!!!!!!!!! 请问一个问题:用acdsee如何把点阵图转化成矢量图? cdonts在客户端发送附件,为什么失败? 第一行,第一列错误是什么回事阿? 怎样计算php里的时间差,mysql的时间差? 关于控制台程序 BYTE型怎么 输出到文件(急) 广州IT俱乐部活动讨论 OleContainer1对象如何使打开的文件嵌在OLE里面,而不是在外部打开DOC文档. 寻兼职程序员,开发一个的屏幕取词工具软件 那里有interdev下载?在线等 小弟初学vb.net,现有一题急需帮忙. oracle9客户端连接oracle816:tns 出错: 写文件换行,再按行读出 ASP开发工具的讨论!大家都用什么开发工具!DreamWeaverMX有没人用啊?看起来功能挺强的! 哪位大哥用过toplink连接oracle数据库的,请进 如何获得给定的文件的路径,比如文件"a.txt"发路径? (((SOS)))在WebForm中怎么样用程序隐藏dataGrid由属性生成器生成的按钮列(删除。。。) 高分求帮助 请问一般在VB中,该如何维护ACCESS数据库 asp的Response.Write的问题? 你们难道没遇到过这个问题? 大虾们救命!!!在线等待.................. 在次提醒!女孩不要看! ADODB.Stream 错误 '800a0bbc' 用sql的朋友们进来看看,问题不是很难,帮帮我。谢谢。 寻兼职程序员,开发一个的屏幕取词工具软件 怎么在sdk编程中设置editbox的初始值 大虾们救命!!!在线等待................. 如何能够屏蔽WM_SIZEING的消息. 关于DataGrid的问题 找房子的问题?有办法的帮个忙! sql server 与oracle的数据类型 充分发挥网络优势和自由精神,共同开发维护我们自己的网站 遍历表单中的文本框,为何只出现第一个值 请教如何在VB中调用我在SQL中建好的带参数存储过程? 天天泡程序人生,无心向学,欲罢不能,咋办? 怎样向一个数组里面写入数据,使这些数据满足下面的条件? 请各位看看这个网站www.green-net.com.cn,一家不错的深圳通信公司,现在急缺研发人员(包括软件,测试,用服,市场人员),待遇从优。有 updete数据窗口时新insert的数据出现重复问题?紧急! 关于textbox和回车的问题 高分求一个VB源码分析工具CodeReview? 如何得到注册表的网上学习资料?拜托各位大虾指点。 我想买一个bbs论坛! 寻兼职程序员,开发一个屏幕取词工具软件 XP的IIS怪事特别多,怎么就连不上.mdb呢? cshadow(影子)大侠能不能给我 重发一次上次的没收到 用SOFTICE破解软件时怎么知道按几下F12就到了要破解程序的领空?而且对于F11的作用我也不是很理解,请明白的朋友讲一下。 请问属性和内容怎么写在这个里面,谢谢!很简单的,请看看!! fstream的标志位 侯捷译的《java编程思想》99元,太狠了吧,人家原版可是免费下载的!!! 长石和石英有什么区别 花岗闪长岩与花岗斑岩如何区分在野外如何不借助工具区分二者 建党节的说词 正长石,石英,霞石,钾纳长石的区别? 科技发展利大还是弊大,请列举事例.过了今晚就不要了 当串联电路中没有电流通过'用电压表测量用电器电压'是多少'如果测电源电压呢就是一个串联电路'没有电流通过'用电压表分别测量电源和用电器电压'结果分别是什么 如何在显微镜下区别石英,长石? 关于原电池标准电动势同一电对,两种不同浓度的电解质构成的电池的原电池的标准电动势是多少?是0吗,那么平衡常数Kθ是多少,也是0? 中国文字的发展历程?从象形文字到现在使用的汉字,中国各个朝代的通行汉字各是什么?象形文字到 甲骨文 金文 到小篆 秦隶 到汉书 后来又是什么了? 磁体上磁性强弱分布(),()磁性强,()磁性弱 电路有两个并联阻值是R的电阻,电源的内阻也是R,问其中一个电阻的功率是总功率的多少倍. 反相输入的放大电路反馈电阻上并联的电电容值如何确定 LED灯管电源坏了怎么办?我是做室内照明工程的,接了几个灯管的小工程,发现电源总会坏,而且电源坏了灯体没坏也要一起更换,非常麻烦和浪费钱,有什么办法能解决这个问题吗?我在网上查了有 原电池的电动势与什么有关?为什么?是如何影响的? 年月日的知识 LED灯管电源的好坏怎么判定? 原电池电动势的产生 暖手宝充电一节课,会不爆炸.下课给暖手宝充电,上课忘了拔了,一节课45分钟,每次充电一定时间后就不加热了 液晶显示器灯管怎么判定坏了?我的一台三星液晶显示器开一会,然后就黑了.但是电源灯是正常的,去问人说是灯管坏了,于是把显示器拆了,花了80块钱买了4根灯管,但是那个卖的人说,不一定是 西南为何如此干旱阅读答案.知道的进来... 读书笔记50--100字,有时间的就写点吧, 有两个电阻R1=10欧,R2=5欧,当它们串联在9V的电源时,把它们并联在同一个电源上,电路总功率是多少? 暖手宝里有一个类似日字形状的东西,这是电极式的暖手宝么我见网上说电极的容易爆炸,电极式的就是摸着是两根柱体,我的摸着就是一个日字形状的东西,也没有固定,网上说电热丝是环形的, 什么是语言发展关键期 科技发展利大的事例 电池标准电动势Eθ,电池电动势E,标准电极电势之间关系是什么啊能斯特方程里面E=E(标准)-(RT)/(nF)ln([Zn2+]/[Cu2+]),所求得的E是哪个电动势?电池标准电动势Eθ还是电池电动势E? 语言发展有两个特点,分别是什么? 关于科技发展利大的例子 用能斯特方程解释浓度对电极电势的影响,以铜锌原电池为例,如下在铜锌原电池中,锌电极插在硫酸锌溶液中,铜电极插在硫酸铜溶液中,中间用盐桥连接.测得电动势为1v,在硫酸铜溶液中加入浓 语言是怎样形成的?发育过程中语言有什么发展规律? 科技发展利大的例子 Zn—Cu原电池,CuSO4中加入浓氨水至沉淀消失,电极电势为什么升高.ZnSO4加入饱和Na2S,电极电势为什么降 导线中的电流是1A,导线的横截面积为1mm2. (1)在1s内,有多少个电子通过导线的横截面?(2)自由电子的平均移动速率是多大?(3)自由电子沿导线移动1cm,平均要多少时间? 石英岩和石英斑岩的区别在哪里? 原电池中电极电势高的一定是正极吗? 交流电路中的总电流与分支电流,总电压与分段电压之间有什么关系(分瞬时值,有效值进行讨论) 水沫子与玉石英岩的区别,石英岩主要成分是什么?,石英岩有一连串的气泡么? 不必太多但是是要关于春节的我急用 电容元件在交流电路中,当电流瞬时值为0时,是否电压瞬时值为0 闪长斑岩如何野外编录描述?全风化与强风化 关于春节的文化传统的介绍性文章,不少于700字 将捣碎的马铃薯块加入到过氧化氢溶液中方程式 辉绿玢岩和煌斑岩的区别? 能够答多少是多少,谢谢(有回必赞).1.亚洲季风气候的形成,主要受________影响(能够答多少是多少,谢谢(有回必赞).1.亚洲季风气候的形成,主要受________影响( )A.海陆位置 B.纬度位置 在探究导体的电阻跟哪些因素有关的实验中, 电视上说的会爆炸的暖手宝是什么样的暖手宝 什么类型的 关于春节安全知识的文章500字是安全知识,环保作文! 小芳同学在探究“决定导体电阻大小的因素”时,作出了如下猜想 请问,花岗质碎斑岩属于什么岩类?请问,花岗质碎斑岩属于什么岩类,成分、结构、构造、成因是什么?那么花岗斑岩、花岗质斑岩、碎斑岩呢?有什么区别? 山西省构筑的三条产业链依赖的本地自然资源除煤炭外还有()A、铜矿石B、石油、c、铝土矿D、...山西省构筑的三条产业链依赖的本地自然资源除煤炭外还有()A、铜矿石B、石油、c、铝土 某同学做“用电流表、电压表测电阻”的实验,可选择的器材有:电源2个(电压分别为6伏、4.5伏),滑动变阻器2个(分别标有“10Ω 3A”和“20Ω 1A”的字样),待测电阻Rx(估计阻值约为19欧), 花岗岩和斑岩,哪种更硬? 给个中粒似斑状黑云母二长花岗岩的详细描述 你认为我国想要缩小与发达国家科技上的差距,关键是什么(政治问题),请简介说明理由 请问:花岗斑岩中长石斑晶长轴呈定向排列的可能原因有哪些呀? 如何计算晶体管高频谐振放大电路的输入输出电阻 串联电路,并联电路 中含有滑动变阻器,电流和电压如何变化? 详解,是一些概念性的.帮忙总结一下!呵呵,也许我们学的快了一点 使用12V电源,3个3W的LED灯珠串联,每个灯珠电压3.5v左右,电流700HA、要用几W几欧电阻、多谢! 花岗斑岩属于岩浆岩吗 晶洞花岗岩属于花岗伟晶岩么?或者两者有什么关系?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘