聊聊计算和这个世界(上)

为什么写这个

凡是计算机专业的学生,一定听说过,要学好英语和数学——英语自然是很重要的不提,那数学是为什么呢?

虽然已经有了很多非常好的书、博客、视频让人体会到了数学之美

  • 数学之美
  • Matrix67
  • 3blue1brown
  • 阿兰图灵是如何破解恩格码的

我还是愿意写一点自己的浅薄想法

高大上的开头

图灵机(英语:Turing machine),又称 确定型图灵机,是英国数学家艾伦·图灵于1936年提出的一种抽象计算模型,其更抽象的意义为一种数学逻辑机,可以看作等价于任何有限逻辑数学过程的终极强大逻辑机器。

直白的说,图灵认为图灵机就是能模拟人类所能进行的任何计算过程的机器。

他是怎么得出这个结论的我们不管,如果感兴趣请自行阅读图灵的秘密。现代计算机可以看作是图灵机的实现,所以如果我们想在计算机里创造一个世界——只要用计算来表示这个世界就可以了。

那什么是计算呢?

计算(英语:Calculation),是一种将单一或复数之输入值转换为单一或复数之结果的一种 思考过程。

又是一个分开都认识,合起来看不懂的东西——囧rz,不如用画图来理解

在把这个定义想了很多遍之前,我很狭隘的认为计算只属于数学,比如输入可以是一个/一堆苹果,输出可以是苹果10个/青苹果5个、红苹果5个/大苹果5个、小苹果5个...根据不同的计算可以有不同的输出。用数学的方式来表达就是:

  • f1(1堆苹果) = {"苹果" : 10}
  • f2(1堆苹果) = {"青苹果" : 5, "红苹果" : 5}
  • f3(1堆苹果) = {"大苹果" : 5, "小苹果" : 5}

但一个厨师看菜谱,在脑子思考用料、比例、做法也是计算,比如这里有一道红油耳片:

做法 计算过程
1. 猪耳入锅,加花椒和姜块煮熟 (猪耳,花椒,姜块) = {去腥煮熟猪耳}
2. 煮熟后猪耳切片 (去腥煮熟猪耳) = {切片的去腥煮熟猪耳}
3. 酱油、辣椒油、花椒粉、白糖、味精、食盐、醋、香油调匀 调匀(酱油、辣椒油、花椒粉、白糖、味精、食盐、醋、香油) = {调味料}
4. 拌好上桌 (调味料, 切片的去腥煮熟猪耳) = {红油耳片}

有经验的厨师可以想象得出:不加花椒和姜是什么味道;怎么切、切多大口感最好;白糖放多少才最能提鲜...在实际操作之前,可能已经想过了很多种方案,然后挑出最合适的去做——图灵机运行的就是这样的一个计算过程

万事万物之间都有联系,联系恰恰符合计算的定义,那么这个世界就可以用计算来表示,而关键就在于如何把这些联系用合适的计算表达出来。

就像如果用地心说来解释太阳系运行,不仅多了本轮/均轮的区分,而且运行轨迹过于复杂,所以假如地心说是正确的,我想天文学家也不会选择这个模型来计算。

我对计算和这个世界的理解就是这样,接下来简单举几个例子,说明软件开发中是如何用到数学模型的。

用计算运行游戏

假如存在一堆苹果,用小学数学的知识可以做这些计算:

  • 计数:0、1、2、3、4、5、6、7...
  • 增加:+ (树上落了1个苹果下来/新买了1个苹果/朋友送了1个苹果...)
  • 减少:- (丢了1个苹果/吃了1个苹果/扔了1个苹果...)
  • 计价:× (每个苹果3块钱,一共多少钱)
  • 分组:÷ (按3个装一筐)

无论是新买/捡到/收到苹果,只要是数量上有增加,都可以统一用+来表示;无论是扔了/丢了/吃了苹果,都用-来表示。

来看看格斗游戏是怎么用计算来表示的

来源:格斗游戏的精髓

红色代表攻击,蓝色代表身体,当A的红色块接触到B的蓝色块,B就扣100血。写成伪代码就是这样的:

def Collapse (A, B):
    if A.red 碰撞 B.blue:
        B.life -= 100

97里面,禁止八神在对方跳起来的时候放八稚女,就是因为碰撞框太大,SNK也因此在98里做了调整

KOF97 KOF98

还是顺便提一句,3D游戏里的碰撞检测也是同样的原理

比如这是虚幻4引擎中的碰撞模型,黄色的是角色,线框胶囊形状的包围是实际处理的碰撞检测对象!计算是到胶囊为止的,并不会对其内的三角形再进行额外的检测。这样的话一个人也就被分为了十几二十个检测,再加上包围盒和八叉树,一帧就算有数十人乱跑,所需执行的碰撞检测也就在数百次左右O(nlogn).

来源:3D游戏的碰撞检测是如何实现的?

所以格斗、回合、棋牌、MOBA、竞速...所有的游戏,看似不同,但都可以抽象成同样的+、-、×、÷...等等计算

  • 玩三国杀,荀彧卖血补牌,HP-1、手牌+n
  • 玩王者荣耀,后羿攻击距离-亚瑟攻击距离>0,所以1级的时候可以放风筝
  • ...

因此,有人说最好的游戏引擎是扑克牌,因为数字不像画面,会限制想象。

我还听人说过,PS4上的 地平线 比Swtich上的 荒野之息 画面好几千倍,但他花在 荒野之息 上的游戏时间也是 地平线 上的几千倍。

这里有一片关于荒野之息设计的文章,里面有一段写得很好

然而,作为游戏设计师,我却可以看到隐藏在水下的,更多可能被抛弃的设计。为什么冰块上限是三块,而不是两块、五块乃至无限块?为什么再次使用技能是拆毁,而不是将冰块变作一种攻击武器?为什么一定要是从水面上竖起的方形冰块,而不是凭空生成的冰块、或者像炸弹技能一样拆分成不同形状、高度的冰块?为什么冰块技能不能彼此叠加,提供林克通向更高高度的桥梁?为什么不设计出一个可以移动的冰块技能,就好像冰舟一样供林克搭乘?更进一步思考,为什么一定是冰?他们为什么不设计一个随时可以生成木块、铁块甚至力场块的技能?为什么不设计出一个能够随时生成空中落脚点的凭空生成方块的技能?为什么只有在步行的时候才能使用这个技能,如果允许在跳跃中或空中使用是否可行?为什么冰块不能移动,不能像其他技能的目标一样,静止后予以攻击然后飞出?为什么结冰技能不能对所有的冰使用?

我只用了大概15分钟,就构思了关于“结冰方块”这个技能十多套不同的设计实现方案,并且想出了其中六七套劣于现有设计的理由。剩下的设计则各有优劣,我难以断言说它们的设计就劣于现有方案,可能需要实际制作并试玩后才能决定;其中有些可能有技术难点,但也有些的技术难度乍看上去和现有的方案其实相差无几。

现在,你们可以假想自己退回到《荒野之息》“结冰方块”异能定案之前的时间点上,重新审视这个技能的设计,从中挑选出最后的定稿。你们要面对的很可能不只是十多个可行的方案,而是数倍于此的不同选择:毕竟,《荒野之息》的设计师人数要更多,他们也更加专心致志于此。这就是那“水面下的设计冰山”——它们之中的很大一部分,或是在2D的验证版中,或是在3D的验证版中,可能都被实际制作出来过。

其实这套思维方式在产品设计的时候也可以用到,比如身边用的最多的手机:为什么用玻璃后盖,为什么用异型全面屏,为什么摄像头要突出?

按思路写下去,应该说说算法是如何提高计算效率的,但我并没有想好该如何表达,再者这一篇也已经拖了够久了,所以先发布出来。

你可能感兴趣的:(思考)