2048

描述:当前是关于Echarts图表中的 热力图 示例。
 
            var randomData = function() {
    var index = [];
    for (i = 0; i < data.length; i++) {
        if (data[i][2] === 0) {
            index.push(i);
        }
    }
    var idx = Math.floor(Math.random() * index.length);
    i = index[idx];
    var val = (Math.round(Math.random()) + 1);
    data[i][2] = val;
};
var isOver = function() {
    for (i = 0; i < X; i++) {
        if (data[i * Y][2] === 0) {
            return 0;
        }
    }
    for (i = 0; i < X; i++) {
        for (j = 1; j < Y; j++) {
            if (data[i * Y + j][2] === 0) {
                return 0;
            }
            if (data[i * Y + j][2] == data[i * Y + j - 1][2]) {
                return 0;
            }
        }
    }
    for (j = 0; j < Y; j++) {
        for (i = 1; i < X; i++) {
            if (data[i * Y + j][2] == data[(i - 1) * Y + j][2]) {
                return 0;
            }
        }
    }
    is_over = true;
};
var vecMerge = function(i, j) {
    if (data[i * Y + j][2]) {
        if (val_vec.length) {
            if (data[i * Y + j][2] == val_vec[val_vec.length - 1]) {
                score += Math.pow(2, val_vec[val_vec.length - 1]);
                val_vec[val_vec.length - 1] += 1;
                val_vec.push(0);
                return 0;
            }
        }
        val_vec.push(data[i * Y + j][2]);
    }
};
var leftFcn = function() {
    for (j = 0; j < Y; j++) {
        val_vec = [];
        for (i = 0; i < X; i++) {
            vecMerge(i, j);
        }
        var idx = 0;
        for (k = 0; k < val_vec.length; k++) {
            if (val_vec[k]) {
                val_arr[idx * Y + j] = val_vec[k];
                idx += 1;
            }
        }
    }
};
var rightFcn = function() {
    for (j = 0; j < Y; j++) {
        val_vec = [];
        for (i = X - 1; i >= 0; i--) {
            vecMerge(i, j);
        }
        var idx = X - 1;
        for (k = 0; k < val_vec.length; k++) {
            if (val_vec[k]) {
                val_arr[idx * Y + j] = val_vec[k];
                idx -= 1;
            }
        }
    }
};
var upFcn = function() {
    for (i = 0; i < X; i++) {
        val_vec = [];
        for (j = Y - 1; j >= 0; j--) {
            vecMerge(i, j);
        }
        var idx = Y - 1;
        for (k = 0; k < val_vec.length; k++) {
            if (val_vec[k]) {
                val_arr[i * Y + idx] = val_vec[k];
                idx -= 1;
            }
        }
    }
};
var downFcn = function() {
    for (i = 0; i < X; i++) {
        val_vec = [];
        for (j = 0; j < Y; j++) {
            vecMerge(i, j);
        }
        var idx = 0;
        for (k = 0; k < val_vec.length; k++) {
            if (val_vec[k]) {
                val_arr[i * Y + idx] = val_vec[k];
                idx += 1;
            }
        }
    }
};
document.onkeydown = function(event) {
    if (is_over) {
        return 0;
    }
    if (event && (event.keyCode < 37 || event.keyCode > 40)) {
        return 0;
    }
    for (i = 0; i < X; i++) {
        for (j = 0; j < Y; j++) {
            val_arr[i * Y + j] = 0;
        }
    }
    // left
    if (event && event.keyCode === 37) {
        leftFcn();
    }
    // right
    if (event && event.keyCode === 39) {
        rightFcn();
    }
    // up
    if (event && event.keyCode === 38) {
        upFcn();
    }
    // down
    if (event && event.keyCode === 40) {
        downFcn();
    }
    var changed = false;
    for (i = 0; i < X; i++) {
        for (j = 0; j < Y; j++) {
            if (data[i * Y + j][2] != val_arr[i * Y + j]) {
                changed = true;
                data[i * Y + j][2] = val_arr[i * Y + j];
            }
        }
    }
    if (changed) {
        randomData();
        isOver();
        if (is_over) {
            score = 'OVER';
        }
    }
    option.series.data = data;
    option.title.text = score + '';
    myChart.setOption(option, true);
}

// 定义变量
var X = 4;
var Y = X;
var score = 0;
var data = [];
for (var i = 0; i < X; i++) {
    for (var j = 0; j < Y; j++) {
        data.push([i, j, 0])
    }
}
var val_arr = [];
var val_vec;
var is_over = false;

// 初始化
randomData();
randomData();

// 基于准备好的dom,初始化echarts实例
var axisType = {
    type: 'category',
    data: ['0', '1', '2', '3'],
    axisLine: {
        show: false
    },
    axisTick: {
        show: false
    },
    axisLabel: {
        show: false
    }
};
var option = {
    title: {
        text: score + '',
        left: 'center',
        top: 15
    },
    tooltip: {
        formatter: function(params) {
            return '[' + params.value[0] + ', ' + params.value[1] + ']: ' + params.value[2]
        }
    },
    // animation: false,
    grid: {
        left: 60,
        right: 60
    },
    xAxis: axisType,
    yAxis: axisType,
    visualMap: {
        min: 0,
        max: 14,
        show: false
    },
    series: {
        name: '2048',
        type: 'heatmap',
        data: data,
        label: {
            normal: {
                show: true,
                fontSize: 18,
                formatter: function(params) {
                    if (params.value[2]) {
                        return Math.pow(2, params.value[2])
                    } else {
                        return ''
                    }
                }
            }
        },
        itemStyle: {
            normal: {
                borderWidth: 1,
                borderColor: "#FFF"
            }
        }
    }
};