4 回答

TA贡献1859条经验 获得超6个赞
您需要添加一个不渲染任何内容的状态。例如,只需将 cpu 选择设置为 4 并更新渲染函数。然后你可以像这里一样添加睡眠功能。我做了一些我认为你想要的工作示例
我对你的代码所做的主要更改是
this.sleep(1500).then(() => {
const index = getRandomInt(3);
this.setState({
houseChoice: index
});
const results = this.getResults(choiceName, index).toUpperCase();
this.setState({
results: results
});
/*****************calling setScore()********************/
if (results === "WIN") {
this.props.setScore(1);
} else if (results === "LOSE") {
this.props.setScore(-1);
} else {
this.props.setScore(0);
}
});
其中handleClick执行超时。
在结果页面中我添加了
this.state.houseChoice === 2 ? (
/*3*/
<div
className="elem-container result-container"
style={{
borderColor: "hsl(349, 71%, 52%)",
color: "hsl(349, 70%, 56%)"
}}
>
<img src={rock} className="choice-image" alt="img" />
</div>
) : null

TA贡献1786条经验 获得超13个赞
人类玩家选择一步棋后,不要立即让 CPU 选择一步棋。实现componentDidUpdate生命周期函数并将CPU的选择逻辑移到那里。这也需要移动对获胜逻辑的检查。
/*function that handles the user choice*/
handleClick = (
choiceName,
choiceImage,
choiceBorderColor,
choiceExtraBorderColor
) => () => {
this.setState({
onScreen: false,
choiceName,
choiceImage,
choiceBorderColor,
choiceExtraBorderColor
});
};
一旦人类玩家选择了一个动作,就获得房子的随机动作,但不要立即将状态更新排入队列,而是稍后使用进入setTimeout更新状态。
仅当两个玩家都选择了移动但结果尚未计算并存储在状态中时才检查胜利。
componentDidUpdate(prevProps, prevState) {
if (
prevState.choiceName !== this.state.choiceName &&
this.state.choiceName
) {
function getRandomInt(max) {
return Math.floor(Math.random() * Math.floor(max));
}
const index = getRandomInt(3);
setTimeout(() => {
this.setState({
houseChoice: index
});
}, 2000);
}
if (
this.state.choiceName &&
[0, 1, 2].includes(this.state.houseChoice) && // We want 0 to be truthy :)
!this.state.results
) {
const results = this.getResults(
this.state.choiceName,
this.state.houseChoice
).toUpperCase();
this.setState({
results: results
});
/*****************calling setScore()********************/
if (results === "WIN") {
this.props.setScore(1);
} else if (results === "LOSE") {
this.props.setScore(-1);
} else {
this.props.setScore(0);
}
}
}
有条件地渲染“等待 CPU”UI
<h4 className="result-title">
{this.state.houseChoice === ""
? "THE HOUSE CHOOSING"
: "THE HOUSE PICKED"}
</h4>
{this.state.houseChoice === "" ? (
<div>...</div>
) : this.state.houseChoice === 0 ? (
/*1*/
<div
className="elem-container result-container"
style={{
borderColor: "hsl(230, 89%, 62%)",
color: "hsl(230, 89%, 65%)"
}}
>
<img src={paper} className="choice-image" alt="img" />
</div>
) : this.state.houseChoice === 1 ? (
/*2*/
<div
className="elem-container result-container"
style={{
borderColor: "hsl(39, 89%, 49%)",
color: "hsl(40, 84%, 53%)"
}}
>
<img src={scissors} className="choice-image" alt="img" />
</div>
) : (
/*3*/
<div
className="elem-container result-container"
style={{
borderColor: "hsl(349, 71%, 52%)",
color: "hsl(349, 70%, 56%)"
}}
>
<img src={rock} className="choice-image" alt="img" />
</div>
)}
有条件地渲染结果并重试按钮。
<div className="final-result-container">
{this.state.results && (
<>
<h1 className="bold">YOU {this.state.results}</h1>
<TryAgain onClick={this.handleTryAgainClick} />
</>
)}
</div>
再次玩时不要忘记重置所有状态
handleTryAgainClick() {
this.setState({
onScreen: true,
choiceName: "",
choiceImage: "",
choiceBorderColor: "",
choiceExtraBorderColor: "",
houseChoice: "",
results: ""
});
}

TA贡献1784条经验 获得超7个赞
我不确定我的问题是否正确,但这里是,如果要在渲染上设置延迟,那么在做出选择之前不要渲染。如果应用程序必须在玩家输入后执行某些操作,请使用 async wait 异步执行以下操作。

TA贡献1806条经验 获得超5个赞
如果我猜对了,也许 lodash 的 Debounce 会为你提供答案。我在我的井字游戏应用程序中使用它来延迟计算机移动。只需从 NPM 添加即可
npm install lodash —save-dev
然后导入到你的文件中
import {debounce} from 'lodash';
不断创建将去抖的内容,您从 lodash 中调用了它。500 是时间,您想要移动延迟多少时间。在这种情况下,它将是 0.5 秒。
const debounceComputerMove = debounce(()=>{ computerMove(); },500);
然后当你想调用computerMove函数时,调用debounceComputerMove而不是computerMove()
添加回答
举报