React Native井字棋游戏问题:Android虚拟设备报‘this.setState_if_Tie不是函数’且游戏逻辑异常
解决React Native井字棋游戏的终止与平局异常问题
我来帮你拆解并解决这两个异常问题,先看看代码里的核心问题:
问题根源分析
1. 获胜后游戏不终止 + this.setState_if_Tie is not a function错误
setstate_if_Win逻辑混乱:原方法里的两个if条件会同时触发,比如用户获胜时,第一个if把result设为0,第二个if因为当前result不是1,又会把result设为1,导致状态反复变化,游戏无法正确终止。- 方法调用拼写错误:你定义的平局方法是
setstate_if_Tie(小写s),但调用时写成了this.setState_if_Tie()(大写S),这直接导致了函数不存在的错误。 setstate_if_Win未绑定this:作为类组件的普通方法,直接调用会丢失this指向,可能导致setState无法正常执行。
2. 平局时白屏冻结
当游戏进入平局逻辑时,错误的状态更新可能触发componentDidUpdate的无限循环——每次setState都会重新触发这个生命周期方法,而如果没有正确判断游戏是否已结束,就会反复执行平局逻辑,导致页面卡死。
修复后的完整代码
judgeWinner(inputs){ //check the winning situation based on 'const conditions' return conditions.some(d => d.every(item => inputs.indexOf(item) !== -1)); } // 改成箭头函数绑定this,同时简化逻辑:通过参数区分用户/AI获胜 setstate_if_Win = (isUserWin) => { this.setState({ result: isUserWin ? 0 : 1 }); } setstate_if_Tie = () => { this.setState({ result: 2 }); } componentDidUpdate(prevProps, prevState) { // 优先判断:如果游戏已经结束(result不是初始值-1),直接终止后续逻辑 const { result } = this.state; if (result !== -1) { return; } const { userInputs , botInputs } = this.state; const inputs = userInputs.concat(botInputs); // 只有当至少下了5步才判断胜负(井字棋最少5步分胜负) if (inputs.length >= 5) { const userWon = this.judgeWinner(userInputs); if (userWon) { this.setstate_if_Win(true); return; // 终止后续逻辑,避免进入平局判断 } const botWon = this.judgeWinner(botInputs); if (botWon) { this.setstate_if_Win(false); return; // 同上 } } // 只有当所有格子填满且未分胜负时,才触发平局 if (inputs.length === 9) { this.setstate_if_Tie(); } }
关键修复细节
setstate_if_Win重构:- 改成箭头函数自动绑定
this,避免this丢失问题。 - 通过参数
isUserWin直接区分用户和AI获胜的情况,逻辑更清晰,不会出现状态覆盖的问题。
- 改成箭头函数自动绑定
修正拼写错误:
- 将平局方法的调用从
this.setState_if_Tie()改为this.setstate_if_Tie(),和方法定义完全匹配。
- 将平局方法的调用从
添加游戏终止判断:
- 在
componentDidUpdate开头就检查result是否为初始值(假设你的初始result是-1),如果游戏已经结束,直接返回,避免后续的判断和状态更新,彻底杜绝无限循环。
- 在
优化平局触发条件:
- 把
inputs.length >=9改成inputs.length ===9,确保平局逻辑只触发一次,避免重复调用setState。
- 把
这样修改后,游戏在用户/AI获胜时会立即终止回合,平局时也不会出现白屏冻结,同时解决了函数不存在的错误。
内容的提问来源于stack exchange,提问作者Hingusan
相关产品推荐
相关产品推荐

