爐石傳說卡組代碼是什麼原理?代碼是如何對應卡牌的?

吳藝福


這裡企鵝,從南極第一線為你解答


早在兩年以前,爐石傳說上線了全新的卡組代碼。從那時起,爐石玩家便有了一個極其方便的分享卡組的方法。當然,卡組代碼方便我們的同時,也有很多人好奇,卡組代碼是如何生成並且準確識別的。由於其中涉及複雜的計算機知識,所以企鵝會盡量通俗的解釋一下,卡組代碼蘊含的意義。

代碼原理

首先,你需要理解最關鍵的兩點,爐石傳說的代碼在計算機編程的角度來說,屬於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張),爐石會把這套牌,轉成唯一的一個字符串,就是你所說的套牌代碼。只是方便程序閱讀。


分享到:


相關文章: