0
var map = [
        ["Blank", "Blank", "Blank"],
        ["Blank", "Player", "Blank"],
        ["Blank", "Blank", "Blank"]
];

配列のループ処理に問題があります。主にこちらの機能です。「プレーヤー」をマトリックス内で1つ下に移動することを想定しています。

「プレーヤー」を試してみると、プレーヤーの位置が一番上にある場合、常に一番下の行にドロップダウンします。また、私は奇妙なバグの問題を抱えています。コードをまったく変更しない場合もあります (または、少なくとも変更すると思います)。そして、コードにはこの問題はありませんが、再び発生します。また、現在、「プレーヤー」を中央から左に移動させることはできません。最後にその関数のコードを示します。助けてくれてありがとう。

function moveDown() {
        for (y = map.length - 1; y >= 0 ; y--) {
            for (x = map[y].length - 1; x >= 0; x--) {
                var posX = map[y].indexOf("Player");

                if (posX > -1 && y == 0) {
                    map[1].splice(posX, 1,"Player");
                    map[y].splice(posX, 1,"Blank");
                    return;
                } else if (posX > -1 && y == 1) {
                    map[2].splice(posX, 1,"Player");
                    map[y].splice(posX, 1,"Blank");
                    return;
                } else if (posX > -1 && y == 2) {
                    return;
                }
            }
        }

    }

ここにすべてのコードがあります。時間がない場合は、すべてを読まないでください。現在の私の主な問題は、moveDown() 関数にあります。(おもう)

var map = [
        ["Blank", "Blank", "Blank"],
        ["Blank", "Player", "Blank"],
        ["Blank", "Blank", "Blank"]
];

var run = true;

menu();
printLoop(map);


while (run) {
    var input = prompt();

    if (input == "left") {
        movePlayer("left");
    } else if (input == "right") {
        movePlayer("right");
    } else if (input == "up") {
        movePlayer("up");
    } else if (input == "down") {
        movePlayer("down");
    }

    switch (input) {
      case "menu":
        menu(); break;
      case "quit": 
        run = false; break;
    }
    menu();
    printLoop(map);
}


function movePlayer(direction) {
    for (y=0; y<map.length; y++) {
        var playerPos = map[y].indexOf("Player");

        if (movableRight(playerPos)) {
            if (direction == "right") {
                map[y].splice(playerPos, 1,"Blank");
                map[y].splice(playerPos + 1, 1,"Player");
            }
        } else if (movableLeft(playerPos)) {
            if (direction == "left") {
                map[y].splice(playerPos, 1,"Blank");
                map[y].splice(playerPos - 1, 1,"Player");
            }
        }

        if (direction == "up") {
            moveUp();
        } else if (direction == "down") {
            moveDown();
        }

    }

}

/*function getX(obj) {
    for (x = 0; x < map.length; x++) {
        for (y = 0; y < map[x].length; y++) {
            if (map[x][y] == obj) {
                return x;
            }
        }
    }
}

function getY(obj) {
    for (x = 0; x < map.length; x++) {
        for (y = 0; y < map[x].length; y++) {
            if (map[x][y] == obj) {
                return y;
            }
        }
    }
}*/

function movableLeft(pos) {
    if (pos <= 0) {
        console.log(pos + "<= 0");
        return false;
    } else if (pos > map.length - 1) {
        console.log(pos + "> map.length - 1");
        return false;
    } else {
        console.log(pos + "true");
        return true;
    }
}

function movableRight(pos) {
    if (pos < 0) {
        return false;
    } else if (pos >= map.length - 1) {
        return false;
    } else {
        return true;
    }
}

function moveUp() {
    for (y = 0; y < map.length; y++) {
        for (x = 0; x < map[y].length; x++) {
            var posX = map[y].indexOf("Player");
                if(posX > -1) {
                    switch (y) {
                        case 1:
                            map[0].splice(posX, 1,"Player");
                            map[y].splice(posX, 1,"Blank");
                            break;
                        case 2:
                            map[1].splice(posX, 1,"Player");
                            map[y].splice(posX, 1,"Blank");
                }
            }
        }   
    }

}

function moveDown() {
    for (y = map.length - 1; y >= 0 ; y--) {
        for (x = map[y].length - 1; x >= 0; x--) {
            var posX = map[y].indexOf("Player");

            if (posX > -1 && y == 0) {
                map[1].splice(posX, 1,"Player");
                map[y].splice(posX, 1,"Blank");
                return;
            } else if (posX > -1 && y == 1) {
                map[2].splice(posX, 1,"Player");
                map[y].splice(posX, 1,"Blank");
                return;
            } else if (posX > -1 && y == 2) {
                return;
            }
        }
    }

}


function printLoop(array) {
    var line0 = "";
    var line1 = "";
    var line2 = "";

    for (y = 0; y < array.length; y++) {
        for (x = 0; x < array[y].length; x++) {
            switch (y) {
                case 0:
                    line0 += array[y][x] + ", "; break;
                case 1:
                    line1 += array[y][x] + ", "; break;
                case 2:
                    line2 += array[y][x] + ", "; break;
            }
        }
    }
    console.log(" ");
    console.log(line0);
    console.log(line1);
    console.log(line2);
    console.log(" ");

}

function menu() {
    console.log("===============================");
    console.log("up - down - right - left - quit");
    console.log("===============================");
}
4

1 に答える 1

2

私があなたの質問を誤解していない限り、あなたは物事を複雑にしすぎています。必要なのはこれだけです:

function moveDown() {
    for (y = 0; y < map.length; y++) {
        var posX = map[y].indexOf("Player");
        if (posX < 0) continue;
        if ( y == map.length-1 ) break;

        map[y][posX] = "Blank";
        map[y+1][posX] = "Player";
        break;
    }
}

プレーヤーを含む行が見つかるまで、最上位の配列を反復処理します。次に、プレーヤーを見つけたら、それが既に一番下にある場合は完了です。それ以外の場合は、 で上書き"Blank"し、次の行の対応する位置を で上書きします"Player"

于 2013-04-03T01:35:21.200 に答える