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

《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资料 谈变VB中APP.PAHT的注意事项 探讨高效的排序合并算法-VB资料 剔除INI文件中的注释部分-VB资料 提取可执行文件中的图标-VB资料 添加记录到文档菜单-VB资料 突破 SendKeys 的限制-VB资料 突破SendKeys的限制 -VB资料 圖面背景透明的技巧-VB资料 退出并关闭 Windows-VB资料 托盘程序详解(二) -VB资料 托盘程序详解(一) -VB资料 我怎样确定我的程序是否在运行?-VB资料 无重复随机数序列产生器 -VB资料 显示打开方式对话框建立文件的关联 -VB资料 显示动画鼠标图标-VB资料 修复VB5启动时可能出现的一个bug 修改IE的环境菜单-VB资料 修改安装向导生成的缺省安装目录 -VB资料 修改屏保口令 -VB资料 修改屏幕保护的口令 -VB资料 旋转字体 -VB资料 延时函数-VB资料 一个关于乘法溢出问题的探讨 -VB资料 一组VB实用小程序 一组VB应用技巧 隐藏和显示任务栏-VB资料 应用 WSH 读写注册表和建立快捷方式 -VB资料 VB用 IIF 和 SWITCH 以精减代码 VB用BASIC语言设计Windows风格的用户接口 VB用Form 的 Mouse_Move事件来检查鼠标是否在窗口内: 哪位E文好的同志能把这段话翻译出来,是RFC1928中的一段。 一个比较低级的问题-vb里面的回车换行孵的ASCII码是多少?? 奇怪!!!奇怪!!!奇怪!!!奇怪!!!快来看看! 谁知道windows的按文件名排序是怎么回事阿? ie问题 如何从一个框架调用另一个框架的方法?有办法吗?(在线) 突然觉得计算机语言有个误区 请问我用depends打开了dll文件,看到了里面的函数,但是参数表和返回值类型没有啊 水晶报表急问,大家帮帮忙看看! 请教文件查找的问题。 谁知道windows的按文件名排序是怎么回事阿? oracle难学吗 <jsp:getProperty name="userInfor" property="*"/> 出错!!(在线等待) 如何在vb中设置Combo的默认值?立刻给分 点击按纽,打开应用程序文件,并获得应用程序的窗口标题,怎么实现??? Linux遇到CORBA问题——高分有送! 新的IBM 60G硬盘(7200转)在PII上检测不到(硬盘没问题,在其他上能正常使用,有没有解决办法?) 21世纪合格人材必备7大技能 对加密感兴趣的同志请进,介绍一下有关书籍和代码。 word中的特殊数学符号无法在Authorware中显示 windows 下刪除文件是怎麼刪除的用什麼函數??? 找一部电影,《国家的敌人》 高分送高人:一个OLE和数据库的小问题 父子表的更新怎么办? 电话拨号程序,给点提示 关于调用存储过程的问题!在线,搞定就结 求问,关于BEA weblogic 7.0 100分求助Windows Server 2003 的cdk! 那位大侠帮忙谢谢! hello 大家好!不好意思又有问题了 我一直想学会的一个简单问题,谢谢! 问一个参数传递的超菜问题? 怎样才能将资源文件中的 图片 二进制文件 保存到磁盘上 请教这句是什么意思? 关于页面设计的问题?高手请教!! 100分求助Windows Server 2003 的cdk! 那位大侠帮忙谢谢! matlab s-矩阵(若回答满意加100分,每题25分) 关于页面设计的问题,求助? TListView中某一行字体的大小、字体的颜色如何改变? 各位高手给小弟指点指点吧!(DELPHI请教) fastreport中Picture控件的问题? DataGrid动态添加列的问题?? 在线等待...... 如何在视图中排除重复记录? 总是报错,但是又查不出是哪里的问题,各位帮忙看看 如何根据当前日期求出上一周的第一天和本周的第一天? 新人的COMBOBOX问题 女孩在记事单上写"恋爱"两个字,有什么含义啊…… 小问题,接分~~ 请教一句sql语法 请问,把繁体转成简体用什么软件? 有南京的朋友一起考scjp的吗? 真理属于客观范畴 还是主观范畴 2个8欧姆50W的喇叭并联后是多少欧姆多少W的? 造成陆地自然带景观地区差异的主要原因是A植物B气候C动物D地形 有首歌有句歌词:离开你我好舍不得 叫什么歌名谁唱的? 三个4欧姆的喇叭串联再并联之后阻抗是多少欧姆我把,怎么上图啊 精品的精字是什么意思 “林子大了什么鸟都有”含义请说出深层意思,最好把“贬义”的意思表达出来. 藤野先生课后习题第四大题答案400字 精打细算的精字是什么意思? 英语时态99/93 为什么选那个答案,不是有in the year么? 已知梯形ABCD,角C等于100度,叫D等于115度,求角A,B的度数.梯形AB在上 谁知道这句古话的出处和原文?大概意思是和一个品行好的人同在一屋檐下,久而久之也变好,和品行不好的人呆一块,久不闻其臭出处应该不是诗,是文言文,请将原文翻译下谢谢! 英语时态99/104为什么不能选B? 什么动物像鸟 一个石子从足够高处释放做自由落体运动,它在2s内的位移大小为20m,第2s内的平均速度大小为多少m/s 英语时态98/97A,B两个的用法区别是什么为什么选A?翻译下句子 必修一地理.季风降水的特点,19,20题, 一个饲养场共养鸡和鸭1500只,已知养鸡只数的1/3与养鸭只数的50%相等,一个饲养场养鸡和鸭各多少只? 英语时态96/61 - -为什么选A解释下句子的意思 马克思是神吗东西? 已知点A(2,3)B(-4,8),直线l经过原点,且A、B两点到直线l的距离相等,求直线l的方程 英语时态96/63 - -为什么用过去进行时?解释下句子的意思 动物修成的“仙家”,在佛教里怎样解释? 等腰直角三角形ABC斜边AB所在直线3x-y+5=0的直角顶点C坐标(4,-1),求两直角边所在的直线方程 欲把西湖比西子,淡妆浓抹总相宜.蕴藏的成语 我要篇作文是写关于春节的欢乐的,500字左右 已知反比例函数图像上有一点P(m,n),且m+n=5,试写出一个满足条件的反比例函数式.反比例函数熟的拜托教教我= =我就这一张不会.快抓狂了= =考试还要考! 欲把西湖比西子 淡妆浓抹总相宜中的成语 “林子大了,什么鸟都有”这句话是什么意思 已知反比例函数Y=1/X的图像经过P(M,N),则简化(M-1/M)(N+1/N)的结果 欲把西湖比西子,淡妆浓抹总相宜 中隐藏的成语是什么? 林子大了,什么鸟都有.21657 反比例函数y=k/x的图像上有一个点P(m,n),已知m+n=3且P道远点的距离为根号13,则反比例函数的表达式() 欲把西湖比西子,淡妆浓抹总相宜里隐藏着什么成语欲把西湖比西子,淡妆浓抹总相宜里隐藏着什么成语欲把西湖比西子,淡妆浓抹总相宜里隐藏着什么成语欲把西湖比西子,淡妆浓抹总相宜里隐 上面一个除号,下面一个减号,这个符号怎么打 马克思辨析题 普遍联系只存在思想之中 为什么"真理的内容是客观的,认识的内容是主观的"是错误的? 2个英语上的疑问这句,Dolly's DNA is exactly the same as that of the sheep she was cloned from.里面为啥会要突然出现个of ?去掉of不行么?还有What is ink used for ? It's used for writing in. 为啥句尾要有个in ?麻烦 巾帼女英雄人和事例~ 主观真理和客观真理区别? q b是什么意思 第二亚欧大陆桥沿线自然带具有明显的变化规律,这种地域差异应属什么?为什么 汤姆·索亚历险记《当海盗去》 本章主要运用了什么描写方法?1.《当海盗去》 本章主要运用了什么描写方法?2.《“海盗”生活》本章描写了大自然三个时期景色,是哪三个时期?分别具有什么 W Y W M Z Y Q.. 有四只电阻分别是1欧姆2欧姆3欧姆4欧姆,因已无标注,现需将其测出,请只用二次欧姆表测出其阻值,问怎么测? 林子大了什么鸟都有,这句话是不是骂人的话?我的一个朋友说是骂人的话! 俗语:林子大了,什么鸟都有 的意思 [佛]家中放动物标本好不好?如果要渡这些动物应该怎么做? 与林子大了,什么鸟都有相同意思的句子 自然带从沿海向内陆的分布规律最显著的地区是? 一个现代女英雄的故事100字 隋唐时期有哪些盛世除了开皇之治,贞观之治,开元盛世,那武则天的“政启开元,治宏贞观”算不算也是一个盛世? 从沿海向内陆的地域分布规律的形成原因是什么?形成基础是什么?地球上最典型的地区在哪里?如何分异? 已知自由落体经过的路程S米与时间t秒的函数关系是S=2分之1gt²,其中,g约等于9.81(米/秒²)是常数.若石子从200米高的悬崖上以自由落地的方式落到地面上,需经多长时间?(保留三位 真理究竟是客观的还是主观的? 56.Many Europeans ________ the continent of Africa in the 19th century.A) explodedB) exploredC) exposedD) expanded57.The police are ________ the records of all those involved in the crime.A) looking intoB) looking afterC) looking outD) looking on58.B 离散数学的证明题,若f:A→B是双射,则f-1:B→A是双射若f:A→B是双射,则f-1:B→A是双射,要有证明过程,考试用的 欲把西湖比西子 淡妆浓抹总相宜的英文怎么翻译 再帮我找个喇叭等效于三个8欧姆10的三个喇叭并联的来? 证明:映射f:X→Y是双射当且仅当对于X的任一子集A有f(X-A)=Y-f(A) 美国六大互联网巨头致信国会要求改革监美国被指反咬欧洲国家是监控活动合作方联合国敦促美方遵守国际法准则美大使称马来西亚民众隐私将不受监听影美财政部制裁俄流行歌手 称其涉嫌跨国格鲁吉亚称俄未被列入总统就职典礼受邀澳大利亚使馆被曝替美监听亚洲 澳总理斯诺登最新照:在莫斯科乘游览船 未戴以色列攻击叙利亚军事基地 目标是俄制默克尔遭美国监听 德议员称斯诺登愿协国际新闻早报:美国务卿将访沙特修补关美媒:日本大幅升级预警机应对中俄海南乐东退休局长房屋夜半遭强拆 警方初三女生因学习压力大 屡次到超市偷零宁波红光集团等6企业涉税违法被罚23浙江省省级28个部门三公经费(附表)海南乐东退休局长房屋夜半遭强拆 警方思鑫坊曾是杭城近代建筑代表 如今成无新消法引入\"举证倒置\" 经营者需前3季度国内渔业产值达5362亿元 上海自贸试验区营造“宽进严管”的营商(深度)京张冬奥正式转入筹办阶段,3全球票房TOP10:万万没想到冠军居首发:HTC Desire 728 涨姿势:反腐追回的钱到底去哪里了!!美警惕中国两大超级武器:歼-31可与在香港投行工作究竟有多辛苦?谈谈年轻「看不见」的小米:雷军和他的云版图中国人都看看啥叫洗脑 《洗脑》原来只澜梦水世界:直播邓州微友团体验夏日清王健林:你知道中国人为什么会仇富吗?历史:谁说宋朝是一个积弱的时代?巴菲特“执掌伯克希尔50年”致股东信搭建网络平台实现“互联网+”时代转型三块七,没法请你吃早餐,只能请看电影北京申奥成功的这件事,品牌们有话说柴静:这个世界上谁最想过三八妇女节你不可不知的,文玩鉴定的3大基本规律PA Group面向亚洲推出创新型投最近有12句话,将影响我们的投资支付宝们被搞残之后 P2P们面临崩盘央行降息关P2P们什么事?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘