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

新手开发者求助:战舰小游戏舰船放置异常问题

问题分析与修复:二维数组引用错误导致的异常

核心错误点

  • 数组引用重复:你在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);

修正说明

  1. 在makeMap中,每次循环创建新的new Array(size),确保oceanMap的每一行都是独立的数组,修改某一行不会影响其他行。
  2. 将条件判断中的=改为===,实现正确的方向匹配逻辑。
  3. 给shipCoordX等变量添加let声明,避免未声明的全局变量引发潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:51:17