如何判断井字棋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
相关产品推荐
相关产品推荐

