《世界·领主》开发日志[01]

来源:互联网 发布:女生冬天帽子知乎 编辑:程序博客网 时间:2024/04/27 20:21

   其实很早就想写下开发日志了,可是每次都不知道怎么怎么地就忘记了。到现在《世界·领主》已经进入Coding阶段,才有这第一篇的开发日志。因为是第一篇,而且经历了这么多,所以要写的东西有点多。先闲话一下历史吧。

  这个游戏最早的构想开始于2006年12月8号,但是我只写了一点介绍然后就去疯狂地打了一周多的游戏。我有一个朋友打电话来问我在做什么的时候,我回答说“我在打游戏”,然后她惊叫“你租着房子打游戏啊!”,让我无言以对。我现在的房租650元一个月,收入为零。那之后我稍微收敛了点,开始工作了。所以正式的设计是2006年12月16号吧。

  关于这个游戏灵感的来源我在《第一次的BLOG》中有介绍,这里就不多写了。虽然灵感是那时候涌现的,但是这个游戏的整体框架却是在我制作我的“Alpha3D”游戏引擎的时候想好的。“Alpha3D”是一个战棋的游戏,但是这只是负责战斗的场面,我在想这样一个战斗的引擎应该放到什么地方来演绎呢?最后想来想去决定以世界战争的形式来表现。

  说简单点就是类似于《魔法门之英雄无敌》。说来也奇怪,这个游戏最终的构想酷似《英雄无敌》,而且我也是《英雄无敌》的爱好者,但是我在设想的时候却从来没有用《英雄无敌》来做过比较,就连我在写这篇文章之前都没有想到我的游戏跟《英雄无敌》这么像。当然,其实要说也是有原因的,因为我在设计的时候大部份的灵感和参照物都来源于《荣誉骑士》(Knights of Honor),而且行动和建造也都不是回合制,而是即时的。

  这次的项目让我觉得有很大的改变。以前我做任何项目,都是报着一种学习的目的,我每走一路都会面临着无数的难题,这些难题都是技术上的,程序构架上的,各种各样的。克服着一个个难题,就让我更进一步,可以说这就是我这多年来的编程写照吧。

  记得有这样一件事情。我的一个朋友刚刚了解面向对象编程,然后整天说着那些专家们说的,一个优秀的程序应当如何如何,类的结构应该怎样设计,我是那样跟他说的:“专家们说得对,但是他们说的东西跟你现在都没有关系。要设计出一个优秀的程序,最重要的是对于程序的理解,而现在我和你都是初学者,我们如果要做一个东西,根本搞不清楚它是怎么做的,我们要实现一样东西,也只有等到编程,学习,解决问题的时候才能知道它是怎么实现的,所以,我们根本就不可能在一开始设计出一个完善的程序结构,因为我们对我们要做的东西是什么也不清楚!”

  可是,这次有些不一样。我面临的问题和以往都不相同,我一开始就要设计出一个完整的软件。我将不会使用任何新的东西,所有的一切都在我已经拥有的能力上进行设计。可以说这是我第一次不是“学习”,而是“制作”了。在进行游戏设计的这些天中,我的脑子就像暴风雨中的大海。我也是第一次体验到了构架一个程序是什么事情。

  软件工程和设计模式我都只是看了看,在我设计的时候也没有把他们用到。但是一个程序的构架在自己心中渐渐成型的感觉我再也忘记不了了。感觉有点像电视里面的3D模型构建的慢动作,一条条线画出来,先是一个大体的轮廓,然后线条渐渐增多,模型也变得越来越真实,嘿嘿。

  我的BLOG的第一位留言者说的第一句话就是“战神你也能做??”。语气中充满了对我的怀疑。那时候,我还没有怎么在意这句话,后来我在另一个论坛上看到策划抨击程序的一段话:“程序员经常性会说的东西:这个我也可以做啊。”才知道我说的“我也能做”的那句话就如同许多狂妄的程序员说的话一样,让人看起来觉得很幼稚。

  至于我到底是不是幼稚,这个结论也不应该由我自己来下。虽然我现在给自己的定位是程序员,但是我觉得自己更有策划的天份,或许说,我其实最想做的就是策划。因为我的理想就是做最好的游戏,而在所有的游戏制作人员中,只有策划最有资格说:“这是我的游戏”。在我多年的学习和游戏过程当中,“如何设计一个好的游戏”这一个问题始终没有离开过我的脑海,而现在,就是鉴定我的成果的时候了。

  不知不觉就说得太多了,一篇开发日志好像就变成了心情日记。还是转回来说一下游戏方面的事情吧。我一开始设计好整个游戏的框架,整个游戏的运行模式在我的心中建立起来(当然也在纸上建立了起来)。我的心中仿佛就有一个这样的游戏在运行,我仿佛就是一个正在进行游戏的玩家,玩着这样的游戏。这个时候,游戏跟程序还没有一点的关系。

  我写了几段游戏的功能简介,写了一下游戏大体的动作之后,就开始设计表了。这时候,我的脑中有一种与“暴风雨中的大海”感觉完全不同的感觉。我感觉一个复杂的网路在我的脑中展开了,一瞬间所有的事情都变得复杂起来,有种自己简直不知道自己在什么地方的感觉。因为自己的每一点设计都与整个程序的实现有关了。每一个列的增长,自己都要考虑:这个列是用来做什么的,什么地方要用到它?

  我一张张表地写下来,一张张表地设计,没有写其它的东西。但是,随着表的慢慢形成,整个游戏的构架也渐渐清晰起来。我发觉这样一个奇怪的事情,因为我的项目是基于SQL的,所有的数据都要表来存储,而为了读取,每张表中又需要必然的关系,所以数据结构的设计不像以往所有的程序设计。以前我是使用程序内部的结构来存储数据,所以数据的结构想怎样就怎样。虽然这样做非常不自由,但是这种约束却让自己的数据结构更加清晰起来,虽然开始的时候不知道怎么下手,但是最终设计出来的时候,一切都井井有条。每一份表,每一个字段的增长,都让整个程序结构更加清楚起来。最后,当整个数据表设计完成的时候,程序的构架居然了然于胸了。我简直可以立刻拿起VS2005就把它做出来!

  我身兼策划和程序之职,所以每设计一点东西的时候,就会立刻去想它到底如何实现。对于我来说,我深感这种思考模式的好处,我简直无法想象不能理解程序的策划将会是一个什么样子。因为,就连我自己,也受到这两种身份的冲突。我头脑中的风暴没有随我设计完成而结束,反而变得更加猛烈了。

  之后的几次大删大改都让我感受深刻。最大的改动是战争,游戏在设计之初是没有战争的原素的,只有贸易和合作。但是想了很久,最终决定加入了战争。这几乎使游戏的系统复杂了将近一倍,而且当它最终定案时几乎改变了游戏的格局。决定了之后,就开始加入表。最初的设计中,以军队为单位,每一个军队单一兵种,但是有武器和防具之分,武器和防具共分五级,一级比一级强。每一个军队有一个指挥官。玩家控制的命令以军队为单位。每个城市最多能够拥有20只部队。

  设计好了之后,我想了一下,觉得20只部队操作太复杂了,于是便设计了一个军团的概念,用来整合军队。军团也拥有指挥官。但是后来表设计出来之后,感觉非常丑,既可以用军团控制,又可以用军队控制,战斗时又要计算军队指挥官的影响,又要计算军团指挥官的影响,操作十分复杂。所以我又想了想,把军团这个Idea枪毙了,只使用军队。

  可是事情又过了不久,我觉得20只军队还是太多了,玩家也不可能同时要20只部队分别去做其它的事情。所以我又把军团的Idea提了出来,然后斩掉了军队的指挥官,玩家只能用军团来执行命令,每个城市最多能够拥有5只军团。

  战争中让我绞尽脑汁的还有兵种,直到现在,还有些问题在困扰着我。游戏中一共有6种兵种。最初只设计了5种——戟兵、剑士、骑兵、弓箭手、法师。最后为了解决攻城的问题,加入了攻城兵。兵种只有6种,但是可以生产不同的装备来给兵种装备,以实现不同的兵种力量。但是这个实现的方法实在有些繁琐,最后我把这个装备的替换系统给枪毙掉,用不同的装备来生产不同的等级的兵种。比如说,普通的戟兵就用长戟和铠甲来生产,而更强大的兵种就换一种名字,比如说皇家戟兵,他们的生产需要皇家长戟和全身铠甲。在XML文件的结构中,表达会十分方便,我在后面会说的。

  虽然兵种的数量增加了许多(我取消了原来五级的装备,装备的等级只分三级),但是基本的兵种类型没有改变。普通戟兵和皇家戟兵只是攻防上的不同,但是他们在战争中的意义是一样的。战争中的6种兵种都有基独特的特点。这里就不写了,直接拷贝我的设计文档。

  戟兵 戟兵是战场上最通用的兵种,它各方面的性能都平均。并且部队所组成的防御阵形对于骑兵的冲刺来说是致命的。它在受到敌方骑兵冲刺的时候,有最低50%的概率(部队经验、士气和指挥官能力还会让这个值变高)发动“防守反击”,给骑兵部队巨大的伤害。
  剑士 剑士装备有盾与剑,它拥有非常出色的防御能力,尤其是对于来自弓箭和魔法的打击。它在受到魔法和弓箭等远程打击的时候,有最低50%的概率(部队经验、士气和指挥官能力还会让这个值变高)发动“格挡”,将伤害减少到50%。
  骑兵 骑兵是战场上的王者,它拥有迅捷的行动力和强大的攻击力。它的冲刺能力更是令人战栗。它在攻击的时候有最低50%的概率(部队经验、士气和指挥官能力还会让这个值变高)发动“冲刺”,使自己的攻击力暴增。
  射手 射手拥有出色的远程打击能力,它能在很远处就对敌人进行打击,但是它几乎没有多少近战的能力。它在攻击的时候有最低50%的概率(部队经验、士气和指挥官能力还会让这个值变高)发动“神射”,攻击平时无法攻击到的远程部队(对法师尤其致命)。
  法师 法师是战场上十分珍贵的部队,它拥有强大的火力以及各种各样特殊的技能,几乎拥有扭转战局的能力。但是它的近战能力却几乎等于零。它除了第一回合能实施远程打击之外,在剩下的两回合之中也会随机增强自己队伍的能力。
  攻城兵 攻城兵是专门训练用来进攻城堡的,他们主要配备有各种重型的武器,诸如弩车、投石器之类,他们能给城堡以巨大的破坏。但除此之外一无是处。并且,因为装备笨重的原因,他们无法像其它部队一样撤退,必然会被敌军歼灭。

  可见,每个部队都有其相克的关系,戟兵克骑兵,骑兵克剑士,剑士克戟兵。剑士也克射手和法师。但是,真正在战斗中的关系不是这么简单,下面摘一段关于野战的介绍:

  每一场战斗共进行3回合,3回合之后双方都要停战休息一周。
  第一回合将收弓箭手或法师来实施远程的先制攻击。远程打击每场战斗仅能实施一次。接下来再由战近部队进行2回合的相互攻击。在普通情况下,任何远程部队都不会受到远程的打击。因为他们一开始就站在射程之外(有例外的情况,请见“兵种”)。
  如果其中一方的近战部队在第2回合便被歼灭,剩下的一回合中远程部队将任由近战部队宰割。如果一方一开始便没有近战部队,那么在第一次回合的时候有50%的机率受到敌方近战部队的奇袭,不仅无法实施远程打击,而且还要再受两回合的攻击。在通常的情况下是实施了远程打击之后,再受到两次攻击。
  攻城队不能参于野战。
  一周之后这样的战斗将继续,直到一方撤退或是被歼灭。

  以上的设计就是目前采用的最终方案,但是,这个方案并不是一开始就形成的。在最初的设想中,战场分开为6格(从左到右6列),双方各站一边,弓箭手和法师站在最边上,近战部队站在倒数第二格。战斗一共分7回合(为什么是7回合?那是因为一星期才进行一次战斗的计算),部队可以选择前进或是进行攻击。当然,一开始的时候当然是弓箭手和法师开始攻击,但是他们也只能攻击一回合了。因为第一回合的时候,近战部队已经向前移动一步,在第二回合的时候,他们就可以开始交战了。这里有一个“误伤”的概念,近战部队已经展开白刃战,远程打击就不能进行了,因为要射也只会两边的人一起射,这样毫无意义。如果一方的近战部队被消灭,另一方的近战部队将继续推进,再过两回合就可以到达远程部队面前,所以,在自己没有近战部队的情况下,远程部队能进行最多三次的打击(当敌人走到面前的时候,远射部队只有任人宰割)。

  这样的设定导致了一些严重的问题。远程部队的攻击应该如何设定?一场战斗持续7回合,在近战部队存在的情况下,远程部队的攻击只能进行一次,如果攻击力很弱,那么他便没有存在的价值。与其招募弓箭手,还不如多招些步兵。近战部队在普通情况下要交战六次,而弓箭手的威力应该相当与几次步兵攻击的威力呢?如果太弱,那么起不到作用,如果太强,那么在没有步兵的情况下,三次打击将是相当致命的。

  我想来想去,想了不少的方案。但是总感觉不是很满意。在我的心中,最理想的情况下应该是远近配合,各个兵种都要在战斗中发挥力量,而不是出现哪种兵种或是哪种组合就能独霸天下的。

  我在最初的时候还设定了骑兵可以一次移动两格,所以可以快速地接近对方兵队,这样可以减少弓箭的打击。但是这也被枪毙了,骑兵冲得快,后面的步兵跟不上,只有死路一条。这样的设计很无聊。设计到最后,原来的战斗方法全部被推翻了。新的方法更简单,但是能实现目的。我觉得这是设计中最关键的一点,游戏的进行模式并不是越复杂才越精彩,能够实现最终的目的才是好的,如何演绎还是其次。Simple is bast。

  战斗的设计固然麻烦,但是整个世界的战争如何进行才是最痛苦的。战争的设定影响了整个游戏世界的格局。我在那几天中简直被逼到了走头无路的地步,如何才能设计出一个好的系统?我想了很多的系统,但是都被枪毙掉,无论是哪个系统我都感觉有严重的缺陷。

  在最初的设定中,游戏拥有国家的概念,国家拥有边界的概念。玩家可以选择边疆城市或是内部城市。边疆城市主要进行战争,内部城市主要发展经济,提供玩家两种不同的玩法。这里给了一个优惠政策。边疆城市的军事设施和军费都是半减的,如果要在内部城市召兵买马,代价是加倍的。

  游戏的坐标是100X100的,采用X,Y坐标。一共有一万个城。我开始时想分成四个国家,然后每个玩家进入的时候可以选择国家。然后国家与国家之间的交界处就是边疆。问题在这里就出现了,边界线这么长,玩家一开始又不可能很多,打仗的时候往哪儿打呢?最终我得出结论——这样不好玩!

  而且,我在开始设定的时候,有国家优势这一个概念。国家优势由玩家共同创造,一个国家的城市越发达,国家优势也越高,玩家如果在这个国家,也将会提供更多的好处。但是这样就会导致新人都往一个国家里面涌……我也设计了联盟,但是……但是……

  我最终把这些概念全部斩于马下。虽然在技术上也能实现,但是这些概念不仅使游戏变得更复杂,而且也没有提供任何好玩的成份!我的第二套决定采用的系统是这样的。没有国家的概念,玩家的城市分布在地图上,然后可以随便攻击哪一个城市。在这样的系统下,路线的问题好解决了,因为在以前的系统下,处理边界线的问题十分复杂,因为不能去攻击内部城市。但是,随意攻击城市也需要建立复杂的行进路线,虽然技术上实现也是可能的,而且也可以采取更简单的路线算法,但是,我始终觉得可玩性并不是那么好。在这样自由的环境下,游戏的平衡性很难控制。强大的玩家可以随便欺负弱小的玩家。

  于是我又想出了另一种解决方案。每个城市只能进攻和支援自己旁边的城市!最开始的时候我设定为四方向(东南西北),最后改成了八方向。在这样的基础下,我又改进了城市的新建系统,虽然可以在任何地方新建城市,但是,每离自己城市远一格,建筑的费用就要提升一倍!这样的话,玩家就要以自己的城市为中心向外扩展,这样的游戏进行方式既有意思,也符合现实。

  还有和原来设计不同的就是商品系统,最初我打算在数据库中给每种商品新建一个列,但是我想了很久,还是决定撕毁这张表。因为我考虑到这样的设计非常难于扩展。到最后,我用几张XML表格构建出了完整的商品构造体系,几乎将商品的细节和程序架构分离了开来,商品是可以随便设计的。兵种等等都是一样。XML真的很强大,而且就像数据表一样,你在设计的时候,它就给予了你一种思考的模式,一种特别的,形容事物的方法。当然,这到底是XML的功劳还是我自己的思想就是这样的,现在的我也不是很清楚。

  大概就写这么多吧,现在已经开始Coding了,有什么有趣的进展再写。从一个游戏的起点,到最终设计的完成,这其中要经历过许多的风暴,策划就像一个手持巨剑的战士,在战场上大砍大杀……

  嘿嘿……

原创粉丝点击