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

如何判断井字棋array棋盘是否已满及位置是否被占用?

终端井字棋:棋盘满员检测与坐标占用验证实现方案

针对你开发的终端井字棋需求,这里给出两个核心功能的实现方案,同时修正原代码中的坐标映射错误,优化代码结构使其更简洁健壮。


完整修改后代码

const prompt = require('prompt-sync')();

// 工具函数
function displayText(text) {
  console.log(text);
}

// 辅助函数:将A1/B2这类坐标转换为网格的行、列索引
function convertCoordinateToIndex(coordinate) {
  const rowMap = { 'A': 0, 'B': 1, 'C': 2 };
  const row = rowMap[coordinate[0]];
  const col = parseInt(coordinate[1]) - 1;
  // 验证坐标是否合法
  if (row === undefined || col < 0 || col > 2) {
    return null;
  }
  return { row, col };
}

// 功能1:判断棋盘是否已满
function isBoardFull(grid) {
  // 两层遍历所有单元格,检查是否还有空位置(.)
  return grid.every(row => row.every(cell => cell !== '.'));
}

// 功能2:验证指定坐标是否已被占用
function isPositionOccupied(grid, coordinate) {
  const index = convertCoordinateToIndex(coordinate);
  if (!index) return false; // 非法坐标直接返回false
  const { row, col } = index;
  return grid[row][col] !== '.';
}

function getUserInput() {
  let userMove = prompt(`${MOVE_INSTRUCTION} (如A1、B2): `).toUpperCase();
  MOVES_MADE.push(userMove);
  return userMove; // 返回输入方便后续处理
}

function checkUserInput(input) {
  // 先检查坐标是否合法
  const index = convertCoordinateToIndex(input);
  if (!index) {
    displayText(WRONG_ENTRY);
    return;
  }

  // 检查坐标是否已被占用
  if (isPositionOccupied(GRID, input)) {
    displayText("该位置已被占用,请选择其他空位");
    return;
  }

  // 执行落子(后续可扩展为玩家交替落X/O)
  const { row, col } = index;
  GRID[row][col] = "X"; // 直接赋值替代splice,更高效
  displayText(GRID);
}

// 常量定义
const INTRO_TEXT = "选择游戏模式:";
const GAME_MODES = ["1. 双人对战", "2. 随机AI对战", "3. 玩家vs随机AI", "4. 玩家vs无敌AI"];
const CHOOSE_MODES = "请输入选项前的数字:";
const GAME_MODE_TEXT = "你选择了:";
const MOVE_INSTRUCTION = "请输入你的落子位置";
const WRONG_ENTRY = "输入错误,请输入合法坐标(如A1、B2)";

// 游戏状态变量
let GRID = [
  [".", ".", "."],
  [".", ".", "."],
  [".", ".", "."]
];
let NUM_PICKED = [];
let MOVES_MADE = [];

// 主逻辑
displayText(INTRO_TEXT);
displayText(GAME_MODES.join('\n')); // 优化模式展示,每行一个选项
let playMode = prompt(displayText(CHOOSE_MODES));
NUM_PICKED.push(playMode);

// 处理模式选择
const modeNum = Number(NUM_PICKED[0]);
if (modeNum >= 1 && modeNum <= 4) {
  displayText(`${GAME_MODE_TEXT} ${GAME_MODES[modeNum - 1]}`);
  displayText(GRID);
  
  // 循环处理落子,直到棋盘满或分出胜负(后续可扩展胜负判断)
  while (!isBoardFull(GRID)) {
    const userMove = getUserInput();
    checkUserInput(userMove);
  }
  
  // 棋盘满后的提示
  displayText("棋盘已满,游戏结束!");
} else {
  displayText("输入错误:该模式不存在");
}

关键功能说明

1. 坐标转索引辅助函数

convertCoordinateToIndex 把用户输入的A1/B2这类坐标,转换成网格的行、列索引(比如A1对应行0、列0),替代了原代码中大量重复的if-else判断,同时自动验证坐标合法性。

2. 棋盘满员检测

isBoardFull 利用数组的every方法两层遍历:

  • 第一层遍历每一行,第二层遍历该行的每个单元格
  • 如果所有单元格都不是初始的.,说明棋盘已满,返回true;否则返回false

3. 坐标占用验证

isPositionOccupied 先通过辅助函数拿到坐标对应的索引,然后直接检查该位置的单元格是否不是.,如果是则说明已被占用。

4. 逻辑整合优化

  • 在主循环中,每次落子前先检查棋盘是否已满,满了就结束游戏
  • 在checkUserInput中,先验证坐标合法性,再检查是否被占用,最后才执行落子操作
  • 修正了原代码中B3、C3的索引错误(原代码B3误用了列索引1,C3误用了行索引1)

内容的提问来源于stack exchange,提问作者B. N. B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:35:36