Javascript 减少代码的重复性

Javascript 减少代码的重复性,javascript,simplify,Javascript,Simplify,我在一个游戏中写了一部分关于角色移动的代码,这段代码非常重复(对于4个方向几乎都是一样的) 我看不出如何使它更简单,因为在所有“如果”条件下都会进行测试,因为在另一种情况下,我会创建一个带有正/负变量的系统,我可以乘以位置变化 谢谢你的帮助 for (var i = 0; i < boxArray.length; i++) { var box = boxArray[i]; if (controller.left && currentLevel[this.i

我在一个游戏中写了一部分关于角色移动的代码,这段代码非常重复(对于4个方向几乎都是一样的)

我看不出如何使它更简单,因为在所有“如果”条件下都会进行测试,因为在另一种情况下,我会创建一个带有正/负变量的系统,我可以乘以位置变化

谢谢你的帮助

for (var i = 0; i < boxArray.length; i++) {
    var box = boxArray[i];

    if (controller.left && currentLevel[this.id - this.moveHorizontal] != 1) {
        // Enregistrement de la position dans le tableau d'undo/redo
        this.index++;
        var array = [this.x, this.y, this.id];
        this.undoArray.push(array);
        // Si box à côté et pas de collision possible 
        if (box.id == this.id - this.moveHorizontal && currentLevel[this.id - this.moveHorizontal * 2] != 1 && currentLevel[this.id - this.moveHorizontal * 2] != 2) {
            // Décalage de la position du player 
            this.x -= this.boxWidth;
            this.id -= this.moveHorizontal;
            currentLevel[this.id] = 8;
            currentLevel[this.id + this.moveHorizontal] = 0;
            // Décalage de la position de la box
            box.x -= this.boxWidth; 
            box.id -= this.moveHorizontal;
            currentLevel[this.id - this.moveHorizontal] = 2;
            controller.left = false;
        }
        // Sinon si aucun objet à côté  
        else if (currentLevel[this.id - this.moveHorizontal] == 0 || currentLevel[this.id - this.moveHorizontal] == 3) {
            // Décalage de la position du player
            this.x -= this.boxWidth;
            this.id -= this.moveHorizontal;
            currentLevel[this.id] = 8;
            // Décalage de la position du sol
            currentLevel[this.id + this.moveHorizontal] = 0;
            controller.left = false;
        }
    }
    else if (controller.right && currentLevel[this.id + this.moveHorizontal] != 1) {
        this.index++;
        var array = [this.x, this.y, this.id];
        this.undoArray.push(array);
        if (box.id == this.id + this.moveHorizontal && currentLevel[this.id + this.moveHorizontal * 2] != 1 && currentLevel[this.id + this.moveHorizontal * 2] != 2) {
            this.x += this.boxWidth;
            this.id += this.moveHorizontal;
            currentLevel[this.id] = 8;
            currentLevel[this.id - this.moveHorizontal] = 0;
            box.x += this.boxWidth; 
            box.id += this.moveHorizontal;
            currentLevel[this.id + this.moveHorizontal] = 2;
            controller.right = false;
        }
        else if (currentLevel[this.id + this.moveHorizontal] == 0 || currentLevel[this.id + this.moveHorizontal] == 3) {
            this.x += this.boxWidth;
            this.id += this.moveHorizontal;
            currentLevel[this.id] = 8;
            currentLevel[this.id - this.moveHorizontal] = 0;
            controller.right = false;
        }
    }
for(变量i=0;i
沿着这些思路的东西

for (var i = 0; i < boxArray.length; i++) {
    var box = boxArray[i];

    var direction = {
        'left': -1,
        'right': 1
    }; 

    for (var d in direction) {
        var mh = this.moveHorizontal * direction[d];

        if (controller[d] && currentLevel[this.id + mh])] {
            this.index++;
            var array = [this.x, this.y, this.id];
            this.undoArray.push(array);

            if (box.id == this.id + mh && currentLevel[this.id + mh * 2] != 1 && currentLevel[this.id + mh * 2] != 2) {
                this.x += this.boxWidth * direction[d];
                this.id += mh; 
                currentLevel[this.id] = 8;
                currentLevel[this.id + this.moveHorizontal] = 0;
                // Décalage de la position de la box
                box.x += this.boxWidth * direction[d]; 
                box.id += mh; 
                currentLevel[mh] = 2;
                controller[d] = false;
            } else if (currentLevel[this.id + mh] == 0 || currentLevel[this.id + mh] == 3) {
                // Décalage de la position du player
                this.x += this.boxWidth * direction[d];
                this.id += mh; 
                currentLevel[this.id] = 8;
                // Décalage de la position du sol
                currentLevel[this.id + (mh * -1)] = 0;
                controller[d] = false;
            }
        }
    }
} 
for(变量i=0;i
我认为您完全可以简化此代码。 例如,将对象设置为:

var moves = {
    moveLeft: function() { ... },
    moveRight: function() { ... }
};
然后你可以说喜欢

moves[side](...);
其中side是表示moveLeft或moveRight的字符串

除此之外,您还可以对重复的功能进行分组,例如在左侧和右侧重复的功能:

function initMovement() {
   var array = [this.x, this.y, this.id];
   this.index++;
   this.undoArray.push(array);
}

你能把它的一部分封装到一个函数中吗?也许吧,但问题是,如果我想的好的话,我总是会有同样重量的代码。分开的函数的目的是最小化重复的代码;我只是不确定javascript中是否传递语义。javascript中是按引用传递语义,还是按值传递语义。如果有传递re引用语义,然后你可以减少重复代码。你的意思是我可以让另一个函数有一个参数“direction”,为每个方向定义一个特定的值吗?基本上,你不想使用条件来决定你是要加还是减。你可以很容易地分配一个值为+amount\u to\u cha的变量nge或-amount_to_更改,然后在所有计算中使用该变量。您缺少的是他的许多条件,如“if(a+b==someValue){\\add a bunch of stuff}或if(a-b==someValue){\\subtract a bunch of stuff},这很容易推广。