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

终端版Connect Four游戏胜利检测逻辑调试求助

终端版Connect Four游戏胜利检测故障

我正在开发终端版Connect Four游戏,但无法检测到一行中四个相邻的相同元素。调试时,从diagonal1(grid)到静态方法checkWin()的代码段会直接导致程序关闭,根本无法进入checkWin()方法。最困惑的是遍历line的最内层for循环总是返回空数组,而不是预期的['X', 'X', 'X', 'X']这类结果。我需要这个循环找出一行中四个连续的相同元素并返回对应的数组。

我的代码如下:

class Myclass {
  constructor() {
    this.playerTurn = "O";
    this.grid = [[' ',' ',' ',' ',' ',' ',' '],
                 [' ',' ',' ',' ',' ',' ',' '],
                 [' ',' ',' ',' ',' ',' ',' '],
                 [' ',' ',' ',' ',' ',' ',' '],
                 [' ',' ',' ',' ',' ',' ',' '],
                 [' ',' ',' ',' ',' ',' ',' ']]

    this.cursor = new Cursor(6, 7);

    // Initialize a 6x7 connect-four grid
    Screen.initialize(6, 7);
    Screen.setGridlines(true);

    // Replace this with real commands
    Screen.addCommand('up', 'move up', this.cursor.up);
    Screen.addCommand('down', 'move down', this.cursor.down);
    Screen.addCommand('right', 'move right', this.cursor.right);
    Screen.addCommand('left', 'move left', this.cursor.left);

    this.cursor.setBackgroundColor();
    Screen.render();
  }

  diagonal1(grid) {
    let diagonals = [];

    for (let i = 0; i < grid.length; i++) {
      for (let j = 0; j < grid[i].length; j++) {
        let diagonal = [];

        let row = i;
        let col = j;
        while (row < grid.length && col < grid[i].length) {
          diagonal.push(grid[row][col]);
          row++;
          col++;
        }
        if (diagonal.length > 4) {
          diagonals.push(diagonal);
        }
      }
    }
    return diagonals;
  }

  diagonal2(grid) {
    let diagonals = [];

    for (let i = grid.length - 1; i >= 0; i--) {
      for (let j = grid[i].length - 1; j >= 0; j--) {
        let diagonal = [];

        let row = i;
        let col = j;
        while (row >= 0 && col >= 0) {
          diagonal.push(grid[row][col]);
          row--;
          col--;
        }
        if (diagonal.length > 4) {
          diagonals.push(diagonal);
        }
      }
    }
    return diagonals;
  }

  static checkWin(grid) {
    const players = ['X', 'O'];
    const columns = grid[0].map((_, i) => grid.map(row => row[i]));
    const rows = grid;
    const obj = new ConnectFour();
    const downwardDiagonals = obj.diagonal1(grid);
    const upwardDiagonals = obj.diagonal2(grid);

    if (grid.flat().every(cell => cell === ' ')) {
      return false;
    }

    for (let player of players) {
      let winner = [];
      for (let line of [...rows, ...columns, ...downwardDiagonals, ...upwardDiagonals]) {
        // find the player that takes four cells of a line consequtively
        let currentElement = [];
        let count = 0;
        let winner = [];

        for (let i = 0; i < line.length; i++) {
          if (line[i] !== ' ' && line[i] === currentElement) {
            count++;
          } else {
            currentElement = line[i];
            count = 0;
          }
          if (count >= 4) {
            winner.push(currentElement);
          }
        }
        console.log(winner)
        return winner;
      }
      // ------------------------------
      if (winner.length >= 4) return player;
      
      if (grid.flat().every(cell => cell !== ' ')) {
        return "T";
      }
    }
    return false;
  }

  static endGame(winner) {
    if (winner === 'O' || winner === 'X') {
      Screen.setMessage(`Player ${winner} wins!`);
    } else if (winner === 'T') {
      Screen.setMessage(`Tie game!`);
    } else {
      Screen.setMessage(`Game Over`);
    }
    Screen.render();
    Screen.quit();
  }
}

测试返回以下错误:

  • Connect Four 识别横向胜利:AssertionError: expected [] to equal 'X'
  • Connect Four 识别纵向胜利:AssertionError: expected [] to equal 'X'
  • Connect Four 识别右下对角线胜利:AssertionError: expected [] to equal 'X'
  • Connect Four 识别左上对角线胜利:AssertionError: expected [] to equal 'O'

问题修复方案

1. 终止逻辑错误

checkWin方法的最内层循环结束后直接return winner,导致仅检查第一条线就退出,无法遍历所有可能的胜利路径。删除该提前返回语句,仅在确认胜利时返回结果。

2. 连续计数逻辑错误

  • currentElement初始值为数组[],与单元格字符串值永远不匹配,导致计数逻辑失效,改为初始化为null。
  • 连续4个相同元素的计数条件应为streak >= 4,调整计数起始值为1,匹配时递增。
  • 找到胜利条件后直接返回当前玩家,无需继续收集元素。

3. 对角线收集逻辑错误

  • diagonal1和diagonal2中判断对角线长度的条件为>4,但胜利只需要长度≥4的线,改为>=4,避免漏掉刚好4个元素的有效对角线。
  • diagonal2的遍历逻辑会重复收集对角线,调整遍历起始点,仅从能形成有效对角线的位置开始。

4. 类实例化错误

checkWin是静态方法,内部实例化ConnectFour但类实际名为Myclass,改为new Myclass(),或把对角线方法改为静态方法。


修复后的核心代码示例

修复后的checkWin方法

static checkWin(grid) {
  const columns = grid[0].map((_, i) => grid.map(row => row[i]));
  const rows = grid;
  const obj = new Myclass();
  const downwardDiagonals = obj.diagonal1(grid);
  const upwardDiagonals = obj.diagonal2(grid);

  // 空棋盘直接返回
  if (grid.flat().every(cell => cell === ' ')) {
    return false;
  }

  // 遍历所有可能的胜利线
  const allLines = [...rows, ...columns, ...downwardDiagonals, ...upwardDiagonals];
  for (let line of allLines) {
    let currentPlayer = null;
    let streak = 0;
    for (let cell of line) {
      if (cell === ' ') {
        currentPlayer = null;
        streak = 0;
        continue;
      }
      if (cell === currentPlayer) {
        streak++;
        if (streak >= 4) {
          return currentPlayer;
        }
      } else {
        currentPlayer = cell;
        streak = 1;
      }
    }
  }

  // 检查平局
  if (grid.flat().every(cell => cell !== ' ')) {
    return "T";
  }

  return false;
}

修复后的diagonal1方法

diagonal1(grid) {
  let diagonals = [];
  const rows = grid.length;
  const cols = grid[0].length;

  for (let i = 0; i < rows; i++) {
    for (let j = 0; j < cols; j++) {
      let diagonal = [];
      let row = i;
      let col = j;
      while (row < rows && col < cols) {
        diagonal.push(grid[row][col]);
        row++;
        col++;
      }
      if (diagonal.length >= 4) {
        diagonals.push(diagonal);
      }
    }
  }
  return diagonals;
}

修复后的diagonal2方法

diagonal2(grid) {
  let diagonals = [];
  const rows = grid.length;
  const cols = grid[0].length;

  for (let i = 0; i < rows; i++) {
    for (let j = cols - 1; j >= 0; j--) {
      let diagonal = [];
      let row = i;
      let col = j;
      while (row < rows && col >= 0) {
        diagonal.push(grid[row][col]);
        row++;
        col--;
      }
      if (diagonal.length >= 4) {
        diagonals.push(diagonal);
      }
    }
  }
  return diagonals;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 01:40:33