Я пытаюсь преобразовать Javascript игру, которую я узнал от Udemy, в приложение для реагирования. Очевидно, оно называется Pig-Game. вы можете бросить кубик и добавить его значение в свой банк, пока не наберете 1, а затем наступит очередь вашего оппонента бросить кубик. вы можете сохранить значение и добавить его к своей сумме, прежде чем проиграть ход. Я написал функцию для «btn-roll», чтобы обновить кубик и добавить его значение в мои состояния. вот код (исключая ненужные части):
const App = () => {
const [dice, setdice] = useState(null);
const [current, setCurrent] = useState(0);
const [activePlayer, setactivePlayer] = useState(0);
const diceHandler = () => {
if (dice !== 1) {
setdice(() => {
const _dice = (Math.floor(Math.random() * 6) + 1);
setCurrent(current + _dice);
console.log(_dice);
return _dice;
}
);
} else {
activePlayer === 0 ? setactivePlayer(1) : setactivePlayer(0);
setdice(() => {
setCurrent(0);
return null;
})
}
}
return (
<button className="btn-roll" onClick={diceHandler}><i className="ion-ios-loop"></i>Roll dice</button>
{dice ?
<img src={require(`./dice-${dice}.png`)} alt="Dice" className="dice" /> :
<></>
}
);
}
первая проблема заключалась в том, что «игральные кости» и «текущий» отставали на 1 шаг. каждый раз, когда я нажимал кнопку, он показывал случайное изображение игральных костей, но фактическое значение для кубиков и тока отставало на 1 шаг. Я исправил это с помощью кода, свидетелем которого вы сейчас являетесь. Теперь проблема в том, что после того, как я нажму «1», он прибавит значение к текущему, затем мне нужно щелкнуть еще раз, чтобы инициировал setCurrent (0) и переключился activePlayer. Я тоже пробовал эту функцию, но результат тот же:
const diceHandler = () => {
setdice(() => {
if (dice !== 1) {
const _dice = (Math.floor(Math.random() * 6) + 1);
setCurrent(current + _dice);
console.log(_dice);
return _dice;
} else {
activePlayer === 0 ? setactivePlayer(1) : setactivePlayer(0);
setdice(() => {
setCurrent(0);
return null;
})
}
}
);
}
я хочу знать, есть ли лучшее решение для моей существующей функции (для обновления состояний) и почему мне нужно нажимать кнопку очередной раз. Я неправильно использую крючки? заранее спасибо