注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红楼&游戏

一位红楼爱好者&游戏策划的blog

 
 
 

日志

 
 
关于我

我们身处在一个悲哀的国家, 我们同胞的血脉中流动着短视的劣根性, 我所从事的行业正处于黑暗的时代, 我没有热血,但一息尚存。

网易考拉推荐

数学和游戏  

2007-01-18 20:56:12|  分类: 游戏设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

《龙珠》中贝吉塔有句名言——“光靠计算,是无法了解我们赛亚人的”。因为数学的精确性,很多人喜欢用数学模型来研究游戏中的一切可能。如果说早期的回合制确实可以做到这一点,那么带有策略的游戏多半难以完美地达成这一愿望。即使不是策略游戏,ARPG,如暗黑,其设定也是一个复杂体系,系统初值的任何一点细微变化都会导致最后的结果与预期值大相径庭。 只是把对个别方面的精细计算结果简单叠加,其结果必然不是 D2 的真正面貌。所以用数学模型分析游戏并不能达到控制一切的目的,真正能控制一切的,只是规则。

有人也许会说,RPG变化再多,最后形成的角色模式都差不多。这无可质疑,但原因在于,几个角色,百来种技能,XXXX种道具和怪物,所有的变数还是有限的。那根本不能跟股市比——那是一个N次方的变数。至于PVP就存在的变数,就好象玩街霸和挙王一样,两个人对战,两个都是对招式十分精练的人,他们出招的原则不是猜到对方会出什么招,而是看到对方出了什么招,知道破绽在哪再出招(除非你是蛮打)。

曾看过的最“理论”研究游戏平衡的方式,是某位美国博士,试图用图论去证明游戏选择的可能性。这不是不可以,但是其复杂性会使你深感受挫。数学对游戏设计最大的帮助,应该是对思维的启发。效用树和决策树用于判断玩家的选择。用对称性的思想对某些系统进行平衡。这些数学知识可能并非有太多实际的作用,但也说明游戏设计中其实有着很多可利用数学知识的角落。

-----------不得不分割--------

设计再完美的游戏,一旦玩的多了,一些歪门邪道就会渐渐被人们琢磨出来,有一篇著名文章叫"The Hero's Guide to A Successful Adventure"(参见:http://members.chello.nl/~j.vanthull/BG2SR/Stuff/Cheese.htm
这篇文章专门记述了上百个Baldur's Gate(博得之门)的exploit。Exploit,顾名思义就是对游戏引擎或游戏规则的盘剥,专门有一个词形容这个叫cheesy,就是指不要脸的打法。这个cheese不同于cheat,并不是对游戏规则的违反,而是在体制内通过一些意想不到的方式来达到利益最大化。平心而论Baldur's Gate从引擎到规则都已经做得相当不错了,在平衡性方面放在今天也绝对是游戏的楷模,但由于游戏setting的庞大,仍免不了被勇于探索的玩家们捅出许多漏洞,由此可见人类在大工程面前的无助。

就像刚才提到的用图论分析游戏选择的可能性,利用离散数学的知识同样可以用于分析游戏规则中的漏洞。Hero's Guide里面的提到的cheese,大致可分为两类。一类就是单纯的语义bug,只不过这里违反的不是program的逻辑,而是游戏逻辑。一个例子就是Baldur's Gate的战士类角色可以选择guard别人,让战士拿弓箭guard另一个人,再让那个人冲进敌人房间然后关上门,你就可以看到,战士的箭穿过门射击敌人。诸如此类的还有伪谈话和potionswap等trick。另一类cheese就不再是语义bug了,因为把它放在游戏规则里也未尝不可,也说不上它就一定违背了游戏逻辑,但它的存在却会破坏游戏的平衡。这样的例子多见于一些魔法的组合,原来为了平衡而给不同魔法加上的限制在组合之后就不在有效了。例如globe of blades可以让人周围被剑气包围,打架时靠近的敌人会受到伤害,而sanctuary可以让敌人只要你不打他就不打你,但如果两个魔法都施了之后,只要站到敌人身边,就见他乖乖不动直到被剑气弄死。这样的法术不能说就不符合游戏逻辑,但它的存在实在是很赖皮,破坏了游戏的平衡。

对于第一类bug,可以使用形式语义中针对语义bug采取的种种办法。但由于游戏在软件结构和程序逻辑方面的独特性,直接应用传统的方法往往并不合适。其实我本人对语义所知甚少,因此这里也就是胡乱说说。

第一个办法就是指哪打哪,给一个property然后做proof。一般这个property都是针对一类具体的bug例如overflow,memleak之类,然后找到一个proof可以证明这段代码没问题。但这个方法很难满足游戏设计的需求,因为计算机程序的逻辑相对而言比较单纯,可以一类一类bug的枚举。实际中,单单证明一个overflow free就算是杜绝了一大类隐患。但游戏逻辑可以极其丰富和多样化,虽然往往只是现实的一个抽象,但比起机器的specification,游戏逻辑要更加接近现实的多,很难通过枚举的方式来总结good/bad behavior。

第二个办法就是画地为牢,既然无法单挑掉所有的狼,咱们就圈个羊圈,牺牲一点一般性,换来不用proof的安全性。这个就类似type theory搞的,在设计PL之前先设计type system,然后好的语言也就水到渠成了,写出来的全是好程序。这当然是比较理想的情况了。对于游戏而言,这个方法的问题在于:游戏系统中找不到属于这个语言的位置。目前的游戏开发(特指rpg的开发),一般是分为engine,script和data,放下数据不说。引擎和脚本各司其职,谁也不适合作成支持游戏逻辑的type system。因此游戏逻辑的实现往往和这些东西搅和在一起,没有办法使用专门设计的type system。而脚本部分往往是文案人员写就,因此要使用接近自然语言的脚本语言。让他们用受诸多限制的为游戏定制的language也不现实。具体该怎样去设计这个专门为游戏逻辑而设计的语言,靠诸多限制来谋求安全性的type theory究竟是否强大到足以支持丰富而多样话的虚拟世界的逻辑,是否type theory先天的局限性限制了它只能胜任机器的逻辑,抽象的计算机器和演算的计算与表达能力与这个世界之间究竟有没有根本的差距,这就是language和theory要考虑的事情了。无论从性价比和实现性来看,这条道路都没有任何可行性。

第三个防cheese的办法更是一个美好的愿望。如果人们可以亲自给出整个游戏逻辑的specification,然后让机器verify游戏的代码有没有违背它,那这个问题也就解决了。但这个方法做了太多的假设,把整个model描述出来,这在工程上就是non-trivial的,而且就算描述出来了,谁又来verify这个描述是不是有问题,就算这个描述没问题,机器有没有能力去做这样一个判定。但是讨论一下不同条件下这个verification过程的可计算性和计算复杂性的确是一个有趣的理论问题。

单就一个语义bug就说了这许多,下面来谈谈第二类cheese,也就是体制内破坏游戏平衡的元素。

这个问题比语义bug要复杂,相比于语义bug这种遇见就可以枪毙的大是大非的问题,游戏平衡的定义就成问题。而且游戏逻辑是个definition,可以由设计者任意规定,但游戏的平衡性却是游戏的一个客观属性,需要人们去判定的。因此在这个问题上可做的文章也要多一点。

首先就是平衡性的定义。单纯这么提出来,似乎人人都觉得平衡与否只是一个人的感觉而已,是无法量化的。但如果把游戏的model剥离出来,就会觉得这个问题还是有讨论余地的。这里我们先把问题单纯化一点,影响游戏平衡性的因素,这里我们就只考虑游戏的规则。因此由AI等因素例如糟糕的寻路能力引起的对平衡性的破坏暂且忽略。因此所有的电脑上的AD&D rpg就都成了类似magic: the gathering一类的骰子纸牌游戏。而把游戏的规则抽象并generalize之后,其实就是game,这里的game是指game theory里面定义的一个数学结构。而平衡性就是防止“一招鲜,吃遍天”的情况,例如猜拳是平衡的,tic-tac-toe是不平衡的,因为先手有必胜策略,没有禁手的五子棋也是不平衡的。利用game theory中对game的种种characterization,其实不难给出平衡性的定义。

因此接下来的一个问题就是,有了一个game,如何去判定它的平衡性。这个问题让人联想起去年STOC的一篇paper: The Complexity of Pure Nash Equilibria。在篇paper讨论的是,给出一个game的简短描述,计算它的纯纳什均衡,这个问题的复杂度。作者Papadimitriou自称这是史上第二烦琐的归约(第一是Probabilistic Checkable Proof)。类似的对于游戏平衡性,也有相对应的理论问题。但可能从computation的角度要比Pure Nash Equilibria难,因为game balance与否关系到整个状态空间的分布,而game的action space可以呈game描述长度的指数级,直觉上就不像是会有一个polynomially checkable proof,因此可能连NP都不是。好在人们对此也只要个近似。通过在action space里面进行random walk,可以从stationary状态中估计个大概,但mixing time仍然是个问题。

即便成功的判定了game的平衡性,发现有不平衡,对游戏规则的修改也并非trivial的。目前游戏设计者采用的都是启发式的办法,通过玩家的反馈,启发式的修改游戏规则,例如Blizzard对星际争霸的支持,但这种方法的收敛性仍值得怀疑。并不能保证收敛的,也有补丁打过反倒更不平衡的。因此有个问题就是,是否存在一劳永逸的解决办法。设计游戏时就可以肯定它是平衡的,换句话说这叫游戏设计的原则,再换句话说这叫game balance的充分条件。这就已经是一个纯数学问题了。Trivial的条件有很多,non-trivial的我还不知道,我对game theory也不是很了解,以上纯粹YY。

----------再分割一次------------
凡是策略型的游戏,是否存在一种无敌的打发,或者必胜的打发,在能穷举所有打发空间的时候也许谁都没有办法下断言,就如同现在没有人能给出一种围棋必胜的打法。随着现在游戏的日趋复杂,这种结果同样难以寻找。但是不排除可能有算法能在一定范围内找到比较优越的打法,但肯定不可能是“最”。同时这些比较“优越”的打发的现实可利用问题也值得考虑,这个是理论和实践之间的差距,举个我了解的例子典型的例子如果有人知"covert channel"的话,可以明白这么多年,关于这个方面的研究很多,但是真的被利用的甚至造成危害的确少之又少。

以上说的玄而又玄的内容,似乎给人感觉游戏平衡是“Mission Impossible”,但事实上很多游戏的乐趣也在于玩家怎样通过自己的控制构造游戏不平衡的特例,而一旦某个不平衡性的特例被几乎所有的玩家所掌握,那么原本游戏设计时候的平衡性的实际意义已经变了,典型的例子是starcraft多次版本由于打法的变更而导致参数的修改,更典型的例子是现在世乒赛里面的球是越来越大了。

最为关键的一点,对于工程而言一次错误意味着严重的灾难,所以一切代价都可花在正确性的验证上。而对于游戏和其它软件来说不然,其它重要的因素更多(效果,理念……)对于这些软件来说,正确性和平衡性方面的考虑也都是没有大的过错即可,所有小的修改都可以走 bug&patch的道路。

----------必要的分割----------

归结到我们的工作中来,通常平衡游戏的步骤分为:
1、建立游戏平衡体制:为游戏制定数值平衡的方向、方法、过程和目标作出宏观上的裁定。
2、建立游戏平衡模型:选取和设计合适的游戏平衡模型。
3、建立游戏平衡方法:为游戏进行具体的数值设定。

可以看出,在数值设定中,第一步是最重要的,如果第一步是错误的话,即使建模得再精确,数学公式掌握得再多,各类游戏公式再烂熟于胸也无济于事。就像大多数日式RPG游戏的设计,对于游戏系统平衡性的拿捏大都是凭经验和感觉进行。好的策划,最重要的是能否为每款特定的游戏制定正确清晰的平衡思路和标准,而具体的建模,不过是细枝末节。对于策划而言,拥有正确的平衡观念永远比懂得一些具体的知识来得重要。知识可以现学现用,观念的转变却绝非一朝一夕。

最后用著名纸上游戏设计大师数学博士Reiner Knizia的名言来结束这一篇长长的冗文:“大部分人都害怕变化,但当你开始控制这些变化时这种恐惧就消失了。”悟到点什么没有?

  评论这张
 
阅读(664)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017