You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript井字棋place函数无法修改数组的问题排查

井字棋place函数无法修改数组的问题修正

我正在用JavaScript开发井字棋游戏,但place()函数没法修改数组。请问JavaScript里不能在函数内修改数组吗?我试过用变量替代数组也没用,到底哪里错了?

var board = ["#","#","#","#","#","#","#","#","#","X"];

//board[9] refers to whose turn it is

function move(){
    if(board[9] == "X"){
        return readLine("Make a move X").toLowerCase()
    } else if(board[9] == "O"){
        return readLine("Make a move O").toLowerCase()
    } else {
        console.log("invalid")
    }
}

function place(whoseTurn, move){
    switch(whoseTurn) {
        case whoseTurn == "X":
                if(move == "a1" && board[0] == "#"){
                    board[0] = "X";
                    board[9] = "O";
                }
                else if(move == "a2" && board[1] == "#"){
                    board[1] = "X";
                    board[9] = "O";
                }
                else if(move == "a3" && board[2] == "#"){
                    board[2] = "X";
                    board[9] = "O";
                }
                else if(move == "b1" && board[3] == "#"){
                    board[3] = "X";
                    board[9] = "O";
                }
                else if(move == "b2" && board[4] == "#"){
                    board[4] = "X";
                    board[9] = "O";
                }
                else if(move == "b3" && board[5] == "#"){
                    board[5] = "X";
                    board[9] = "O";
                }
                else if(move == "c1" && board[6] == "#"){
                    board[6] = "X";
                    board[9] = "O";
                }
                else if(move == "c2" && board[7] == "#"){
                    board[7] = "X";
                    board[9] = "O";
                }
                else if(move == "c3" && board[8] == "#"){
                    board[8] = "X";
                    board[9] = "O";
                }
                else{
                    console.log("error")
                }
            break;
        case whoseTurn == "O":
                if(move == "a1" && board[0] == "#"){
                    board[0] = "O";
                    board[9] = "X";
                }
                else if(move == "a2" && board[1] == "#"){
                    board[1] = "O";
                    board[9] = "X";
                }
                else if(move == "a3" && board[2] == "#"){
                    board[2] = "O";
                    board[9] = "X";
                }
                else if(move == "b1" && board[3] == "#"){
                    board[3] = "O";
                    board[9] = "X";
                }
                else if(move == "b2" && board[4] == "#"){
                    board[4] = "O";
                    board[9] = "X";
                }
                else if(move == "b3" && board[5] == "#"){
                    board[5] = "O";
                    board[9] = "X";
                }
                else if(move == "c1" && board[6] == "#"){
                    board[6] = "O";
                    board[9] = "X";
                }
                else if(move == "c2" && board[7] == "#"){
                    board[7] = "O";
                    board[9] = "X";
                }
                else if(move == "c3" && board[8] == "#"){
                    board[8] = "O";
                    board[9] = "X";
                }
                else{
                    console.log("error")
                }
            break;
    }
}

首先明确:JavaScript里函数完全可以修改数组,因为数组是引用类型,函数操作的是原数组的引用,不是副本。你的问题出在switch语句的语法错误上:

  • 你写的case whoseTurn == "X":是错误写法,switch(whoseTurn)会把whoseTurn的值和每个case后的表达式对比,这里whoseTurn == "X"会返回布尔值true或false,和whoseTurn的字符串值("X"或"O")永远不匹配,所以两个case都不会执行,数组自然没变化。

修正方案

把switch的case改成直接匹配值:

function place(whoseTurn, move){
    switch(whoseTurn) {
        case "X": // 直接写要匹配的值
                if(move == "a1" && board[0] == "#"){
                    board[0] = "X";
                    board[9] = "O";
                }
                else if(move == "a2" && board[1] == "#"){
                    board[1] = "X";
                    board[9] = "O";
                }
                else if(move == "a3" && board[2] == "#"){
                    board[2] = "X";
                    board[9] = "O";
                }
                else if(move == "b1" && board[3] == "#"){
                    board[3] = "X";
                    board[9] = "O";
                }
                else if(move == "b2" && board[4] == "#"){
                    board[4] = "X";
                    board[9] = "O";
                }
                else if(move == "b3" && board[5] == "#"){
                    board[5] = "X";
                    board[9] = "O";
                }
                else if(move == "c1" && board[6] == "#"){
                    board[6] = "X";
                    board[9] = "O";
                }
                else if(move == "c2" && board[7] == "#"){
                    board[7] = "X";
                    board[9] = "O";
                }
                else if(move == "c3" && board[8] == "#"){
                    board[8] = "X";
                    board[9] = "O";
                }
                else{
                    console.log("error")
                }
            break;
        case "O": // 直接写要匹配的值
                if(move == "a1" && board[0] == "#"){
                    board[0] = "O";
                    board[9] = "X";
                }
                else if(move == "a2" && board[1] == "#"){
                    board[1] = "O";
                    board[9] = "X";
                }
                else if(move == "a3" && board[2] == "#"){
                    board[2] = "O";
                    board[9] = "X";
                }
                else if(move == "b1" && board[3] == "#"){
                    board[3] = "O";
                    board[9] = "X";
                }
                else if(move == "b2" && board[4] == "#"){
                    board[4] = "O";
                    board[9] = "X";
                }
                else if(move == "b3" && board[5] == "#"){
                    board[5] = "O";
                    board[9] = "X";
                }
                else if(move == "c1" && board[6] == "#"){
                    board[6] = "O";
                    board[9] = "X";
                }
                else if(move == "c2" && board[7] == "#"){
                    board[7] = "O";
                    board[9] = "X";
                }
                else if(move == "c3" && board[8] == "#"){
                    board[8] = "O";
                    board[9] = "X";
                }
                else{
                    console.log("error")
                }
            break;
    }
}

额外优化建议

你的代码里有大量重复逻辑,可以把位置映射做成对象,简化代码:

// 先定义位置到数组索引的映射
const positionMap = {
    "a1": 0,
    "a2": 1,
    "a3": 2,
    "b1": 3,
    "b2": 4,
    "b3": 5,
    "c1": 6,
    "c2": 7,
    "c3": 8
};

function place(whoseTurn, move){
    // 先判断位置是否合法
    const index = positionMap[move];
    if (index === undefined || board[index] !== "#") {
        console.log("error");
        return;
    }
    // 落子并切换回合
    board[index] = whoseTurn;
    board[9] = whoseTurn === "X" ? "O" : "X";
}

这样代码更简洁,也更容易维护,避免了大量重复的if-else判断。

内容的提问来源于stack exchange,提问作者SiliconBasedLifeform

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:12:38