昨天玩王者荣耀又被队友气到了,索性直接退了游戏。
Google 了一下,王者荣耀的前端 APP 的开发语言是 c#,游戏引擎是 Unity。c#和 Unity 的关系类似于 Python 和 QGIS,我们可以用 QGIS 中封装好的工具画图计算,也可以自己写 Python 脚本之后交给 QGIS 执行。后端数据库则是用 C++ 写的(据说这是鹅厂的后端传统,都用 C++)。
前端和后端
互联网公司大都分为前端(Frontend)和后端(Backend),前端负责与用户的交互,手机上的各种 APP 都是所谓的前端界面,后端负责服务器和数据库的建构和维护,使用 APP 时用户数据会上传到后端服务器,服务器会相应 APP 请求并返回数据。
具体到王者荣耀这款游戏上,手机上的 APP 即是花里胡哨的前端界面,光有前端是不够的,我们进行游戏时操作英雄的行为数据会返回王者荣耀的服务器,服务器会接收一局游戏内所有十个人的数据并作相应的分析。这种感觉就好像我们并不是在自己的手机上打游戏,而是在腾讯远程的云服务器上打游戏。手机上的 APP 只是一个用来接收和发送信号以及展示前端界面的工具,很奇妙吧!正因为这样,当网络状况不好时,我们在手机上的操作不能及时上传到云服务器,也不能从云服务器上实时获取到游戏进程数据,这就是我们平时所谓的“游戏卡了”。
此外,我们游戏内的玩家信息也存储在了后端数据,比如拥有的英雄呀,皮肤呀,还有各种道具,好友关系等等,其实本质上应该都是远程服务器内的一串串字符。
算法
我们点击排位按钮,进入了游戏队列,这时需要游戏系统给我们匹配九个队友。具体怎么匹配呢?这时需要一个匹配算法。大家应该都知道,每个游戏玩家背后都有一个 elo(wiki 解释:Elo rating system)隐藏分。知乎上有个问题对此有比较好的解释。简而言之,腾讯会根据每个玩家的游戏表现、活跃程度和历史战绩等计算一个 elo 等级,并且根据这个值进行游戏匹配。
ELO机制通过调整双方玩家战斗力值的方差对胜负进行干预,而非调整双方玩家战斗力值的均值。
类(Class)
计算机编程语言中的类是一个宏大的概念,我甚至觉得这个设计理念背后有一丝哲学的意味。类是什么呢,它是一个抽象的概念。人就是一个类(class),我们每个人,比如你我他,是人这个抽象概念的具体实例(instance)。人是一个脑海中的抽象概念,每个活生生的个体则是现实世界中对这个抽象概念的具体实现。大家可以想想“白马非马”这个古老故事,马是一个类,白马则是马的具体实例。
很多语言,例如 Python、Java 中都有类的设计,所以被称作面向对象编程(Object-oriented programming,OOP)的语言。与此相对的是面向过程编程(Procedure Oriented Programming,POP),C 语言即是这种类型的语言,也包括我们经济学研究中用的 Stata(其实严谨来说 Stata 并不是一门编程语言)。
回到王者荣耀游戏中,英雄是一个类,我们操作的具体英雄,比如娜可露露,则是具体实例。对英雄这个类,我们需要设计它的属性,比如血量,外观(这又涉及到了 UI),攻击力,移动速度等等,当然它还有方法(methods),比如英雄技能,它可以移动、攻击等等。对每个英雄,我们可以具体赋予它的属性和英雄技能。此外,游戏中的野怪小兵,我们也可以为它们设计不同的类,比如小兵类,野怪类,也有不同的属性和方法。
两个英雄互相攻击时,涉及到了实例之间的交互。比如一个英雄的攻击导致另一个英雄血量属性的减少等等。
总结
活该王者荣耀这么赚钱,毕竟设计出这么一款游戏的背后是成千上万的心血,应用到了如此多计算机方面的知识。既然如此受欢迎也应该很赚钱。