井字棋获胜检测函数多循环运行触发TypeError的原因排查
井字棋获胜检测报错原因分析
数组越界访问:四子棋棋盘尺寸远大于井字棋的3x3规格,你复用四子棋的循环逻辑时,没针对井字棋的边界做适配。比如检测右向、斜向时,循环的终止条件还是沿用四子棋的(比如需要预留4个位置的空间),但井字棋只需要预留3个位置。当循环变量超出井字棋的行/列索引范围时,会访问到
undefined的棋盘元素,后续读取该元素的[0]属性就会触发报错。共享循环变量未重置:如果多个检测循环使用了同一个全局或外层作用域的循环变量(比如
i、j),前一个循环结束后变量值可能已经超出边界,后续循环直接复用这个值去访问棋盘,自然会读到undefined。边界判断逻辑遗漏:单个循环运行时,比如下向检测,只需要限制行号不超过最后一行,刚好不会触发越界;但同时运行多个循环时,某个循环的边界判断没覆盖到所有场景(比如右向检测没限制列号范围),导致越界访问不存在的棋盘元素。
举个具体的例子:四子棋右向检测的循环条件可能是for (let j = 0; j <= cols - 4; j++),但井字棋的列数cols=3,改成井字棋后应该是j <= cols - 3(也就是j只能取0)。如果没改这个条件,j会取到1,此时j+2=3超出了井字棋的列索引范围(0-2),访问board[i][j+2]得到undefined,再读取它的[0]属性就会触发Cannot read properties of undefined (reading '0')错误。
内容的提问来源于stack exchange,提问作者MikeD
相关产品推荐
相关产品推荐

