浏览器控制台开发井字棋:玩家2落子函数校验逻辑故障求助
解决井字棋
ttt_player2_turn()的位置校验问题 看起来你在浏览器控制台开发井字棋时,卡在了玩家2回合的落子校验上——is_case_free的逻辑没按预期执行对吧?结合你提到用了Lodash,我给你梳理几个排查和修复的方向:
1. 先确认is_case_free校验函数本身没问题
首先要排除校验函数的问题,毕竟如果它本身逻辑错了,后面的判断肯定失效。你可以直接在控制台单独测试它:
比如假设你的棋盘是一维数组(9个元素对应3x3格子,空位置用''/null表示),调用:
// 举个例子,假设棋盘数组是board,测试位置2是否为空 is_case_free(board, 2)
如果返回值不符合预期(比如空位置返回false,或者已占位置返回true),那得先修正这个函数。用Lodash的话,正确的实现大概是这样:
function is_case_free(board, position) { // 先确保position是合法索引(0-8),再判断对应位置是否为空 if (!_.inRange(position, 0, 9)) return false; // 这里根据你定义的"空"来调整,比如是空字符串、null或者undefined return _.isNil(board[position]) || board[position] === ''; }
2. 检查ttt_player2_turn()里的调用逻辑
接下来看玩家2回合函数里的校验分支,常见的坑有这几个:
- 传参顺序错了:比如你把
position和board的顺序搞反了,导致is_case_free拿错了值判断; - 条件判断写错:比如用了赋值符号
=而不是判断符号===,或者逻辑运算符用错(比如&&写成||); - 没有处理非法输入:比如用户输入的不是数字,或者超出0-8范围,导致校验根本没走到
is_case_free的判断。
给你一个正确的函数示例参考:
function ttt_player2_turn(board) { // 获取玩家输入,转成数字 let input = prompt("玩家2,请输入落子位置(0-8,从上到下从左到右):"); const position = parseInt(input); // 先校验输入合法性,再校验位置是否为空 if (_.isNumber(position) && _.inRange(position, 0, 9) && is_case_free(board, position)) { // 落子(假设玩家2用'O') board[position] = 'O'; // 打印更新后的棋盘 ttt_print_board(board); } else { alert("位置无效,请重新输入!"); // 递归调用,让玩家重新选择 ttt_player2_turn(board); } }
3. 额外排查点
- Lodash是否正确引入:如果控制台报错
_ is not defined,说明你没在页面里引入Lodash,得先通过script标签或者CDN引入它,否则所有Lodash相关的逻辑都跑不起来; - 棋盘数组的引用问题:如果你的函数里传的是棋盘数组的副本而不是原数组,那落子后原棋盘不会更新,看起来就像校验没生效;
- 打印棋盘函数的完整性:你贴的打印函数片段没写完,比如如果它没正确遍历数组拼接内容,可能导致你误以为落子没成功,但实际上数组已经更新了。完整的打印函数可以参考这个:
function ttt_print_board(array){ let boardStr = '\n'; // 按3行拼接棋盘 for (let row = 0; row < 3; row++) { const startIdx = row * 3; boardStr += ` ${array[startIdx] || ' '} | ${array[startIdx+1] || ' '} | ${array[startIdx+2] || ' '} \n`; // 最后一行不加分隔线 if (row !== 2) boardStr += '---+---+---\n'; } console.log(boardStr); return boardStr; }
你可以按照这个顺序一步步排查,应该能找到问题所在~
内容的提问来源于stack exchange,提问作者maxd
相关产品推荐
相关产品推荐

