炉石传说卡组代码是什么原理?代码是如何对应卡牌的?

吴艺福


这里企鹅,从南极第一线为你解答


早在两年以前,炉石传说上线了全新的卡组代码。从那时起,炉石玩家便有了一个极其方便的分享卡组的方法。当然,卡组代码方便我们的同时,也有很多人好奇,卡组代码是如何生成并且准确识别的。由于其中涉及复杂的计算机知识,所以企鹅会尽量通俗的解释一下,卡组代码蕴含的意义。

代码原理

首先,你需要理解最关键的两点,炉石传说的代码在计算机编程的角度来说,属于Base64代码,这个代码有一个最为明显的特征,即你复制的代码中,以=或者==作为结尾,代表这个代码的结束。


另外一点则是作为标识符的DBF ID,这个你可以理解为,炉石传说中的独有表示系统。简单的解释来说,就是每一张卡牌都被这个ID按顺序进行了标记,早在炉石传说开发之初就已经有了这个标记方式,只不过在炉石传说上线卡组代码的系统时,这些ID就被官方开源了,才被众人所知晓。其实如果你有一定的计算机基础,挖掘炉石传说的源文件时,你就可以发现这些代码了。正是因为有顺序的标记,才让炉石传说每一张卡牌都有准确的描述以及配图,所以你可以看到如果不人为修改的话,炉石传说是不会有卡牌描述上面的错乱的。

说完这两个关键点,我们深入代码来了解一下具体含义。

代码含义

通过上文的解释,我们得知了两个信息:代码是被独立出来进行识别的,每一张卡牌都有对应的ID便于区分。

所以,企鹅再从大家可以理解的角度,解读一下其中部分代码的含义。

首先是开头部分,前四个字母代表了这套卡组所属的模式,即AAEC为标准卡组,AAEB为狂野卡组。这个是单纯从表面可以看出来的。

至于后面的一大串,当然是具体的卡牌了。不过为了简化以便于处理,这里的代码是经过base64代码进行二次转换过的。换句话说,如果你想看到其中的具体ID的话,你可以下载一个base64代码的转换工具(或者叫解码工具)把卡组代码放进去,这样你就可以看见具体的代码了。

当然,企鹅在上面说了,这是进行二次转换的代码。如果再详细的想知道卡牌的ID,这里就涉及一个新的varint代码了。这个代码并不是属于加密那种的代码,而是对卡组进行更为详细的区分,举个例子,相同名称的卡牌使用了多少张,你选用的职业是谁,这个版本的版本号,以及所属的模式(上文说的标准或者狂野模式就是用这个代码区分的)等等。这些是卡组代码必须要有的内容,否则系统会不予识别。

总结

所以,企鹅在这里再次总结一下上文所说的关键点。

一个卡组代码里面包含三个要素:base64代码,用于独立以及加密。varint代码,用于卡组的识别以及分类。DBF ID,用于标记每一张卡牌。

通过这三个要素,游戏才能识别这个代码属于哪个职业,哪个模式以及用了多少张什么卡牌。因此,卡组代码中的每一个字符都是不可或缺的,正是工程师的智慧和努力,才能让每一套卡组有了自己的名字和意义,让每个玩家都有机会分享自己的成果。

我是企鹅,如果回答对你有所帮助,记得点个关注哦:)


三千里企鹅丶


AAEBAa0GHgiGAdMBmwPIBfEFlw3aE/msAsmvArW7Aui/AqDBAprCAuPCAsjHApnIAubMAonNAujQAubTAuPpAvHqAtfrAsPsAvLsAo7uAouAA9uJA+uKAwAA # #

这段看起来乱七八糟的字符串,却描述出炉石一整套牌,很神奇是不是?

实际上这段字符是经过一些算法转化成这样的。真正程序员编码时用到的是这样的代码, ["大螺丝\

非著名程序猿


我尽可能地简单解释一下,但可能还是有些复杂,建议有一定编程基础的人看。

先说一下神秘代码的构成,神秘代码从前往后包含这么几个部分:

1. 预留字节,目前始终为0。

2. 版本号,目前始终为1。这个版本号不是指炉石版本号,而是神秘代码的版本号,意味着以后想在这个神秘代码里加一些新的功能,会启用新的版本号,告诉炉石客户端应该使用不同的方法去解析这串代码。

3. 卡组类型,标准=2,狂野=1。

4. 卡组包含的英雄数量,目前始终为1。所以也许意味着以后可能会出一些双英雄的模式?

5. 英雄ID。

6. 数量为1的卡牌的数量,举个例子,宇宙系列的牌组的这个值就是30。

7. 等于上面这个数量的数字,每个数字表示一个卡牌ID。

8. 数量为2的卡牌的数量。

9. 等于上面这个数量的数字,每个数字表示一个卡牌ID。

10. 数量大于2的卡牌的数量。这个部分和下面的部分暂时都为启用。

11. 等于上面这个数量的数字的二元组,每个二元组表示卡牌ID及其出现的数量。

上面这么一些信息就足够完整地描述一个卡组了,那为什么我们看到的是一串奇怪的字符呢,下面解释一下炉石是怎么根据上面的信息来生成一串奇怪的代码的。

两个概念需要先了解一下:

1. Base64编码。这种编码方式的好处是编码后的结果只会有0~9、大小写a-z、以及+/这两个符号,总共10+26*2+2=64种字符。它的存储效率并不高,它需要用1个字节(也就是8位)来表示区区6位的数据。但他的优势是编码后的字符都是可见字符,便于人类直接复制和传播。

2. VarInt。上面说过了,神秘代码其实就是由一堆数字构成的,如果暴雪直接使用int32来存储每一个数字,就太浪费空间了,占用空间越多,生成的神秘代码越长,越不利于传播。因为目前卡牌数量也就那么几千张,理论上用int16可能就够了。但是一旦确定用int16,万一炉石传说顺利运营了一百年,卡牌数量超过了int16的范围,那这套机制就不能用了。于是暴雪使用了VarInt,它的特点是占用的空间跟数字大小有关,数字越大,占用空间越多。比如对于127以内的数字,它只需要1个字节;对于2的14次方以内的数字,它只需要2个字节;对于2的32次方这个值,它需要5个字节,没错,比int还要多1个字节。

综上,神秘代码就是按照上面介绍的顺序,罗列出一堆数字来表示一个卡组,例如:

0(预留) 1(版本) 2(标准) 1(英雄数量) 274(德鲁伊英雄ID) 2(嗯,这个卡组里有2张牌只出现了1次) 42656(传播瘟疫的ID) 42759(终极赖皮ID) 14(还有14张卡出现了2次) 742(野蛮咆哮ID) ...(此处省略13张卡) 0(没有任何一张卡出现3次)

然后将这些数字转换成VarInt,连续地放到一个字节数组中。然后对这个字节数组进行Base64编码,得到一串神秘代码。

第一次在头条回答问题,主要是另外几个回答真的是太水了,实在是看不下去了。

参考文档: https://hearthsim.info/docs/deckstrings/

卡牌ID可以在这里查: https://hearthstonejson.com/


明月玉才


我只负责玩,这不关我事,跟我一毛钱都没关系


萌萌哒的呜喵王


这样解释吧,你有一套牌,(冰法,寒冰剑,学徒等等共计30张),炉石会把这套牌,转成唯一的一个字符串,就是你所说的套牌代码。只是方便程序阅读。


分享到:


相關文章: