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

《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 在欺骗中浴火重生
《程序员》杂志休刊通知 2014 TOP50最具价值CTO获奖名单揭晓! TIOBE 2014年12月编程语言排行榜:R和Swift成为年度语言候选者 免费增值应用正在“杀死”游戏开发者? 直接Mark!开源的DevOps开发工具箱 Apache Mesos联合创始人Benjamin Hindman:谈分布式应用现状 直觉不靠谱!使用移动应用分析的七个巧妙方法 屏蔽、挖角与丑闻,Uber的“创收神器”泡沫 蚁视科技发布会:三大产品与四大概念技术 盘点VS2015 预览版的5个新特性 低能的“智能” 你就是明星,第一届IBM RockStar正式启动! Kubernetes:Google分布式容器技术初体验 方法可以复制 AngularJS资源集合 那些年,微信走过的开放之路 从YunOS话阿里移动互联网云生态布局 Mobile First!苹果联合IBM发布10款企业级App iOS8.1.1越狱又惹急苹果!扒一扒黑客与苹果的斗争史! Firefox.html:用HTML重现Firefox UI Qt 5.4正式发布!引入WP,支持HTML5混合开发 2014智能硬件盘点第二弹!这次咱走暖心的 聚合数据资产,推动产业创新——2014中关村大数据日看大数据变现 拥抱开源:微软Windows 10宣布全面支持AllJoyn技术 改变App领域发展!友盟推“数据工场”战略,两款新品亮相 Cloudera正式登陆中国市场:与英特尔携手共助本土企业淘金大数据 Go 1.4正式发布 支持Android开发 【特别提醒】2014中国大数据技术大会门票全面告罄 不接受现场购票 累计4000万美元 Qualcomm在华投资5家公司 支持Android、WatchKit开发,全新RubyMotion 3面世! 快速开发移动医疗App!开源框架mHealhDroid 2014CVW﹒产业互联网大会解密未来20年 关于驱动程序开发! 在SQL-SERVER中出现数据死锁的情况一般是什么,若是由多个用户同时向数据库更新数据而导致的死锁,解决此问题的办法有那些? 寻找源代码排版软件? 有没有用VC写过短信接收程序,我在接收中文时出现乱码。 请教大虾:用mideaplayer来播放一首歌,如何用progressbar来表示进度? 我想学习驱动程序的开发,请大家帮我推荐几本这方面的书? 编译出错,不解?请高手指点。 能否用Delphi 实现类似东石公司的虚拟光驱系统。 我想学习驱动程序的开发,请大家帮我推荐几本这方面的书? include头文件的问题 急!!!为什么TBlobField 下载时大小受限制,怎么解决? 关于导出动态连接库中的类的问题,不知道这里有没有高手? 一个让我痛苦了n天的问题 关于Hook的一个问题 联合查询如何修改? 获取密码时出错???? my gf photo 我想问一下,java生成的.class文件能不能通过某种工具生成.exe文件? VC中组合框为什么不能下拉? 请问哪有最新的wise for window .net的版本可以下载 "java原型开发"指得是什么开发? 能否用VC++实现类似东石公司的虚拟光驱系统 请问会话Bean和实体Bean的区别在那?能给出例子吗? word文档如何存入SQL SERVER 2000? 请问如何才能在windows 2000 server 上装MTS? 有女朋友而且上网和别的mm聊天的入内签名! 如何显示不同的颜色... 有关网络开发和com的问题,高分征集关注和提供方案! 探讨一下safearray 的使用问题 关于QQ界面的制作? 在主界面中添加一副图片的问题被遮住的问题 有一个EXE执行时,我希望能删除它自己 如何在程序中获取IE当前浏览网页的IP地址或域名地址? 有南京的兄弟吗?我想买《delphi4编程技术内幕》,就是Charlie Calvert那本精华。 如何在工具条上加载图片作为工具条的背景 怎样来写这个数据连接? dbgrid里的赋值问题 Borland自带的ADO例子为什么也出错啊? pb 出现 maximum script size exceeded 保存错误 愿意到上海的软件高手可以来看看,真是没想到 我这里有一个链表类,我怎么在别的文件中使用它呢? CArray的问题? 编译器出问题了! 那里可以找到asp.net的一些原码,现在市面上的书没什么有深度的 修改PING数据包VB能做到么?高手来指点,中级来探讨,初级来学习,分数大大的有~ ;) 请教(qingrun,qingrun等大虾),请指教? weblogic高手请指点!这是不是设置不对造成的? 这样都行啊----老板是写软件的好沟通的很,干活痛快 标签hidden是干什么的,怎么使用 关于treeview中+/-按钮 动态创建了多个StaticText,我想实现将任意一个StaticText拖动到另一个StaticText上后交换他们的几个属性,该如何做? 应用写作复习题求答案一、单项选择题(每题1分,1.迄今所知我国最早的应用文文集是 ( )A.甲骨刻辞 B.钟鼎铭文C.《尚书》 D.《周易》2.我国第一部文体学专论是 ( )A.《文赋}》 B.《 数字电子技术练习题求解答 烷烃的沸点高低怎么判断? 谁有应用写作的题 请问:谁有09年的文秘管理与应用写作形成性考核册作业答案 烷烃沸点高低的影响如正乙烷,丙烷,正丁烷等. 某食堂发生一起食物中毒事件.食堂负责人及时撰写报告,向上级汇报情况.请问该负责人应使用哪一种类型的报告?为什么? 求最新:文秘管理与应用写作作业3和4!一、在一下五个文种中任选两个文种,进行写作练习.1、贺电(或贺信)2、请柬(要求包含“封面”与“内文”两个部分)3、感谢信(或表扬信)4、求职 关于夏天的云的初二英语作文观察夏天的云,就此写一篇100个词左右的英文短文,同时说明不同的云与下雨的关系 应用写作试卷求答案,二. 1.病文评析:(40分,(答题要求:逐条指出下面两则公文的失误之处,并提出补救措施,不要求重写.)(1)《××××学会会议纪要》时间:××××年×月××日参加人员 求电大09秋行政管理《文秘管理与应用写作》作业本答案急 描写夏天的云或雨的文章谁有?急 化学初三所有化合价! 求最新文秘管理与应用写作作业 ,40分 用带有几个比喻句的短文描写出夏天的云算了,两个比喻句就行了 初三上化学(化合价这节)某金属M的氧化物的相对分子质量为a,对应的氯化物的相对分子质量为b,该金属的化合价为多少?A.+(2b-a)/55B.+(2b-2a)/55C.+(2a-b)/55D.+(2a-2b)/55一个青少年正常情 急求文秘管理与应用写作形成性考核册答案,第一题是结合教材,从主旨、材料、结构、语言等四个方面阐述实用型文章的特征? 围绕《夏天的云》这篇短文,提出一个值得思考的问题, 初三常用的化学化合价都有什么啊 为什么夏天的云很多 夏天文章 初三一个化学问题(离子和化合价的区别)RT 能用来鉴别乙醇.乙烷.乙烯三种无色溶液的一种试剂A.金属钠 B.溴水 C.HBr D.氢氧化钠溶液 分解反应:由____种反应物生成____其他物质的反应,叫做分解反应.化合反应:我们把由___种或____物质生成____物质的反应,叫做化合反应 氧化反应:我们把物质与___发生的反应叫做氧化反应 跪求关于化合价的化学题(初三的) 初三化学 通过下列反应 不能得到单质的是 1化合 2分解 3置换 4氧化举例 在线等无解? 不能得到单质! 用两种方法证明三角形的角平分线定理 一道高中八校联考现代文阅读题目,求详解江山如画不知不觉,我们飘进了一个村庄.平静了一天的世界,果真下起了大雪.好雪的爱妻终于如愿以偿了,她兴奋得又叫又跳,想天真的小姑娘,全然忘 初三化学(水)水能和某些碱性化合物(?)酸性氧化物(?)和无水盐(?)发生化合反应 三角形角平分线定理证明方法 高中语文现代文阅读题有什么高效的解题方法 描写夏天的云的开头 三角形角平分线定理怎么证明啊? 初三化学化合式如何解答化合式 计算化合式 请给例题好吗 谢谢 证明内角平分线定理的八种方法已知△ABC,AD平分角BAC交BC于点D,求证AB/AC=BD/CD. 三角形角平分线定理的证明 初三化学材料总结(金属、复合……)请分别列举初中涉及到的材料并举例F:金属 合金 复合材料 合成材料 描写夏天的云的比喻句 已知下列四个反应在一定条件下都能发生,其中属于化合反应的是( )选项:A.水→氢气+氧气 B.氢气+氧气→水 C.酒精+氧气→水+二氧化碳D.木炭+氧气→二氧化碳 6.4克铜与足量浓硫酸反应,求浓硫酸是多少mol. 角平分线定理的证明 已知下列四个反应在一定条件下都能发生,属于化合反应的是A.水---氢气+氧气 B.氢气+氧气---水C.酒精+氧气---水+二氧化碳D.木炭+氧气---二氧化碳 音色与介质有关系吗 mol质量是什么概念.1 mol浓硫酸为几克密度为98% 怎么判断烷烃的熔沸点?第10题 双星质量为m1,m2.他们之间的距离为L.求双星运行轨道半径r1,r2,以及运行周期TF向心力=Gm1m2/L^2=m1w^2r1=m2w^2r2 r1/r2=m2/m1 r1+r2=L 这些我都懂但我不懂得下面的计算过程,通过以上各式是如何变换得到 r1 高中数学 三角形的定理及证明过程 宇宙中两颗相距较近的天体称为“双星”,它们以两者连线上的某一点为圆心做匀速圆周运动,而不致于因万有引力的作用吸引到一起.设二者的质量分别为m1和m2,两者相距为L.求(1)双星的 A星轨道半径为R1,B星轨道半径为R2,两星相距为L.则有R1+R2=L. 现代教育技术考题,电视信号的两种方式,除射频信号外还有( )A.音频信号 B.视频信号C.音、视频信号 D.彩色信号激光唱片上记录的是( )A.听觉信息的磁信号B.听觉信息的模拟信号C.听 宇宙中两颗相距较近的天体称为“双星”,它们以二者连线上某一点为圆心做匀速圆周运动,两者相距L,周期为T,万有引力常量为G,求总质量M 两颗行星的质量分别为m1和m2,他们绕太阳运动的轨道半径为r1和r2,若M1=M2,R1=4R2,则他们的周期之比是? 有没有谁有《现代教育技术》的试题? 宇宙中两个相距较近的天体称为“双星”,它们以二者连线上的某一点为圆心做匀速圆周运动,而不致因万有...宇宙中两个相距较近的天体称为“双星”,它们以二者连线上的某一点为圆心做匀 两颗行星的质量分别为m1和m2,绕太阳运行的轨道半径分别为r1和r2,若它们只受太阳的引力作用,那么这两颗行星的向心加速度之比为? 这是现代教育技术里面的题目,有没有谁会做的啊,能不能把过程写详细点额,我比较笨额.一只100w的定压式扩音机,输出端子为0v、20v、40v、100v、240v,拟配接12.5w/8欧姆的扬声器两只,16w/4欧姆的扬 《夏天的云》哪些是联想的句子 密度在数值上等于物体质量与体积的比值 这句话对么 什么叫传播手段和途径?什么叫传播规律?是现代教育技术,理论与运用63页的题. 下列烷烃中,沸点最低的是( )A、正戊烷 B、正己烷 C、异戊烷 D、新戊烷
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘