以下数据皆来自这只猫https://www.cryptokitties.co/kitty/1001,需要bn.js
const BN = require('bn.js');
const hex = '00004a52931ce4085c14bdce014a0318846a0c808c60294a6314a34a1295b9ce';
转为10进制
const bn = new BN(hex, 16));//512955438081049600613224346938352058409509756310147795204209859701881294
转为二进制
bn.toString(2);//10010100101001010010011000111001110010000001000010111000001010010111101110011100000000101001010000000110001100010000100011010100000110010000000100011000110000000101001010010100110001100010100101000110100101000010010100101011011100111001110
从右往左,5个字符为一个基因,不足5位补0。4个基因为一组
[
'01110','01110','01110','01011',
'01001','01001','01000','01001',
'00011','00101','00101','00110',
'00110','00101','00101','00101',
'00000','00011','00011','00001',
'01000','00110','01000','01101',
'00100','00100','00110','00110',
'00000','00101','00101','00000',
'01110','01110','01111','01001',
'00001','01110','00001','00001',
'00100','00111','00111','00110',
'01001','01001','01001','01001'
]
转为10进制,一个基因有0-31共32个不同特征,每一组基因第一个基因决定猫的形态,后面三个为隐藏基因,有出现在下一代的可能性,下一篇文章讲繁育小猫的遗传算法
[
14,14,14,11, //这一组决定身体
9,9,8,9, //皮毛
3,5,5,6,//眼睛的颜色
6,5,5,5, //眼睛的形状
0,3,3,1,//基础颜色
8,6,8,13,//高亮颜色
4,4,6,6,//强调颜色
0,5,5,0,//野生元素,这一个基因并未开放所有特征
14,14,15,9,//嘴
1,14,1,1,//环境,背景
4,7,7,6,//隐秘Y基因,还未开放
9,9,9,9 //未开放
]
最后,形成这只猫的数据为,身体14,皮毛9,眼睛颜色3,眼睛形状6,基础颜色0,高亮颜色8,强调颜色4,野生元素0,嘴14,背景1,以及后面两个未开放的基因4和9
最终实现代码
const BN = require('bn.js');
const _sliceNumber = function(_n, _nbits, _offset) {
_n = ((new Array(240)).join('0') + _n.toString(2)).slice(-240);
_n = _n.slice(0, _n.length - _offset);
let result = _n.slice(-_nbits);
result = ('000000000' + result).slice(-_nbits);
return parseInt(result, 2);
}
const decode = function(data) {
let result = []
for (let i = 0; i < 48; i++) {
result.push(_sliceNumber(data, 5, i * 5));
}
return result;
}
const hex = '00004a52931ce4085c14bdce014a0318846a0c808c60294a6314a34a1295b9ce';
const geneArr = decode(new BN(hex, 16));
console.log(geneArr);