JavaScript井字棋胜负判断函数异常问题排查
问题原因分析
你的代码之所以不管落子情况如何都判定X获胜,核心是完全误解了逻辑运算符&&的作用,以及includes()的正确使用方式:
1. 逻辑与&&的运算逻辑理解错误
你写的1 && 4 && 7这类表达式,并不是用来表示“同时包含1、4、7”,而是JavaScript的逻辑与运算:
- 逻辑与会依次判断每个值,只要遇到假值就返回假值;所有值都是真值时,返回最后一个真值。
- 比如
1 && 4 && 7的运算结果是7,4 && 5 && 6的结果是6,1 && 2 && 3的结果是3。
2. 两段代码的实际错误行为
第一段代码
includes()的参数是一个大的逻辑或表达式,逻辑或||会返回第一个为真的值,这里第一个为真的就是7,所以这段代码等价于:
if (moves_counter_x.includes(7)) { console.log("x won") }
只要数组里有7就会判定X赢,完全没检查获胜组合。
第二段代码
你把每个&&表达式的结果作为includes()的参数,实际逻辑变成了检查数组是否包含7、8、9、3、6、9中的任意一个:
if (moves_counter_x.includes(7) || moves_counter_x.includes(8) || ... || moves_counter_x.includes(6))
你的测试数组[1,5,6]里包含6,所以条件成立,直接输出了“x won”,这和“凑齐三子连线获胜”的逻辑完全不符。
正确的实现方式
先定义所有井字棋的获胜组合,再检查玩家落子数组是否包含某一组合的全部元素:
function result_check() { // 定义所有获胜组合(包含你之前遗漏的斜线组合) const winCombos = [ [1,4,7], [2,5,8], [3,6,9], // 竖线 [1,2,3], [4,5,6], [7,8,9], // 横线 [1,5,9], [3,5,7] // 斜线 ]; // 检查是否有一个组合的所有元素都在X的落子数组中 const xWon = winCombos.some(combo => combo.every(num => moves_counter_x.includes(num))); if (xWon) { console.log("x won"); } }
some():只要有一个组合满足条件就返回trueevery():验证组合里的每一个数字是否都存在于落子数组中
这样就能准确判断X是否凑齐了获胜的三子连线。
内容的提问来源于stack exchange,提问作者Zek Nogueira
相关产品推荐
相关产品推荐

