You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(); 
  } 
}

关键修复细节

  1. setstate_if_Win重构:

    • 改成箭头函数自动绑定this,避免this丢失问题。
    • 通过参数isUserWin直接区分用户和AI获胜的情况,逻辑更清晰,不会出现状态覆盖的问题。
  2. 修正拼写错误:

    • 将平局方法的调用从this.setState_if_Tie()改为this.setstate_if_Tie(),和方法定义完全匹配。
  3. 添加游戏终止判断:

    • 在componentDidUpdate开头就检查result是否为初始值(假设你的初始result是-1),如果游戏已经结束,直接返回,避免后续的判断和状态更新,彻底杜绝无限循环。
  4. 优化平局触发条件:

    • 把inputs.length >=9改成inputs.length ===9,确保平局逻辑只触发一次,避免重复调用setState。

这样修改后,游戏在用户/AI获胜时会立即终止回合,平局时也不会出现白屏冻结,同时解决了函数不存在的错误。

内容的提问来源于stack exchange,提问作者Hingusan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 09:27:39