炉石传说标准模式最新冲分卡组
炉石传说卡组代码是什么原理?代码是如何对应卡牌的?
炉石传说卡组代码是什么原理?代码是如何对应卡牌的?
我尽可能地简单解释一下,但可能还是有些复杂,建议有一定编程基础的人看。
先说一下神秘代码的构成,神秘代码从前往后包含这么几个部分:
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 264种字符。它的存储效率并不高,它需要用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编码,得到一串神秘代码。
第一次在头条回答问题,主要是另外几个回答真的是太水了,实在是看不下去了。
参考文档:
卡牌ID可以在这里查:
炉石传说最新奶骑卡组?
奶骑
# 职业:圣骑士
# 模式:标准模式
# 多头蛇年
#
# 2x (1) 圣礼骑士
# 1x (1) 神圣寿司卷
# 2x (2) 圣光闪现
# 2x (2) 城建税
# 1x (2) 定罪(等级1)
# 2x (2) 武装教士
# 1x (2) 活力涌现
# 2x (2) 狂野炎术师
# 2x (2) 生而平等
# 2x (3) 正义防御
# 1x (3) 苦痛侍僧
# 1x (3) 锈烂蝰蛇
# 2x (3) 闪光翻车鱼
# 1x (4) 凯瑞尔·罗姆
# 1x (4) 剑圣萨穆罗
# 1x (6) 重拳先生
# 1x (7) 光铸凯瑞尔
# 1x (7) 吞噬者穆坦努斯
# 1x (7) 永存石中
# 1x (7) 海兽号
# 2x (10) 花园惠景