新手开发者求助:战舰小游戏舰船放置异常问题
问题分析与修复:二维数组引用错误导致的异常
核心错误点
- 数组引用重复:你在
makeMap函数中,将同一个oceanY数组赋值给oceanMap的每一项。由于数组是引用类型,oceanMap的所有行实际上指向同一个数组,修改任意一行的元素都会同步到所有行,这就是打印数组时所有行内容一致的原因。 - 条件判断语法错误:
if(direction = "vertical")使用了赋值运算符=而非相等判断运算符===,这会导致无论传入什么direction,都会强制赋值为"vertical",且条件永远为真。
修正后的代码
var oceanMap = []; function makeMap(size){ oceanMap.length = size; // 循环创建独立的数组,避免引用共享 for(let i = 0; i < oceanMap.length; i++){ oceanMap[i] = new Array(size); } } makeMap(15) // 用let声明变量,避免全局污染 let shipCoordX = 7; let shipCoordY = 5; let shipLength = 5; let shipDir = "vertical" function placeShip(shipX, shipY, shipL, direction) { // 使用严格相等判断方向 if(direction === "vertical"){ let shipYDraw = shipY; for(let i = 0; i < shipL; i++){ oceanMap[shipX][shipYDraw] = 1; console.log("ship placed at "+shipX+"X, "+shipYDraw+"Y"); shipYDraw += 1; } } } placeShip(shipCoordX,shipCoordY,shipLength, shipDir); function attack(x, y){ if(oceanMap[x][y]){ console.log("Hit!"); oceanMap[x][y] = 0; } else{ console.log("Miss!"); } } console.log(oceanMap); // 现在attack(8,5)会输出Miss!,因为只有第7行对应位置有船 attack(8,5);
修正说明
- 在
makeMap中,每次循环创建新的new Array(size),确保oceanMap的每一行都是独立的数组,修改某一行不会影响其他行。 - 将条件判断中的
=改为===,实现正确的方向匹配逻辑。 - 给
shipCoordX等变量添加let声明,避免未声明的全局变量引发潜在问题。
内容的提问来源于stack exchange,提问作者Mitchell Lemieux
相关产品推荐
相关产品推荐

