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
相关产品推荐
相关产品推荐

