canvas 2048 移动方块函数的原理是怎样的?

2018 年 4 月 6 日
 geekape

看了一个 canvas2048 的源码,就移动方块函数这块特别的难懂,也可能是自己基础太差,有大神可帮忙解析下吗?

贴上移动方格相关的代码:

var keycom = { '38': [0, -1], '40': [0, 1], '37': [-1, 0], '39': [1, 0] }

var game = {
    move: function(dir) {
        //用来调整不同方向的遍历方式
        // -1 0
        function modify(x, y) {
            tx = x, ty = y;
            if (dir[0] == 0) tx = [ty, ty = tx][0];
            if (dir[1] > 0) tx = 3 - tx;
            if (dir[0] > 0) ty = 3 - ty;
            return [tx, ty];
        }
        //根据移动的方向,将地图中对应行 /列中的数字一个个压入栈中,如果第一次遇到栈顶数字和待入栈数字相等,则栈顶数字乘 2,最后用栈中数字更新地图中的对应行 /列
        for (var i = 0; i < 4; i++) {
            var tmp = Array();
            var isadd = false;
            for (var j = 0; j < 4; j++) {
                var ti = modify(i, j)[0],
                    tj = modify(i, j)[1];
                if (map[ti][tj] != 0) {
                    if (!isadd && map[ti][tj] == tmp[tmp.length - 1]){
                        score += (tmp[tmp.length - 1] *= 2);
                        isadd = true;
                        space += 1;
                    }
                    else{
                        tmp.push(map[ti][tj]);
                    } 
                }
            }
            for (var j = 0; j < 4; j++) {
                var ti = modify(i, j)[0],
                    tj = modify(i, j)[1];
                map[ti][tj] = isNaN(tmp[j]) ? 0 : tmp[j];
            }
        }
        draw.produce();  //随机产生一个方块
        if (space == 0) {
            alert("game over");
        }
        draw.block(); 

    }

}

// 事件监听
document.onkeydown = function(e) {
    dir = keycom[(e ? e : event).keyCode];
    game.move(dir);
    console.log(dir);
};
1271 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX