Реагирование, создание счета в игре камень, ножницы, бумага

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я пытаюсь добавить счет в игру «Камень, ножницы, бумага», используя React. Я очень новичок в react, поэтому не совсем уверен, правильно ли я его реализую.

 class App extends Component {
state = {
    playerOne: weapons[0],
    computer: weapons[0],
    winner: "",
    playerWins: 0,
    computerWins: 0,
    draws :0

};

startGame = () => {
    let counter = 0;
    let gameInterval = setInterval(() => {
        counter   ;
        this.setState({
            computer: weapons[Math.floor(Math.random() * weapons.length)],
            winner: "",
            playerWins: 0,
            computerWins: 0,
            draws :0
        });
        if (counter > 5) {
            clearInterval(gameInterval);
            this.setState({
                winner: this.Winner()
            });
        }
    }, 250);
};

Winner = () => {
    const { playerOne, computer } = this.state;

    if (playerOne === computer){
        draws  ;
        return "It's a Draw!!";

    } else if (
        (playerOne === "rock" amp;amp; computer === "scissors") ||
        (playerOne === "scissors" amp;amp; computer === "paper") ||
        (playerOne === "paper" amp;amp; computer === "rock")
    ) {
        playerWins  ;
        return "Player One Wins!"
        
    } else {
        computerWins  
        return "The computer Wins!"
    }
};

selectWeapon = weapon => {
    this.setState({
        playerOne: weapon,
        winner: "",
        score: 0
    });
};

render() {
    const { playerOne, computer, winner, score } = this.state;
    return (
      <>
        <h1 style={{ textAlign: "center" }}>Rock Paper Scissors</h1>

        <div>
          <Player weapon={playerOne} />
          <Player weapon={computer} />
        </div>
        <div>
          <button
            className="weaponBtn"
            onClick={() => this.selectWeapon("rock")}
          >
            rock
          </button>
          <button
            className="weaponBtn"
            onClick={() => this.selectWeapon("paper")}
          >
            paper
          </button>
          <button
            className="weaponBtn"
            onClick={() => this.selectWeapon("scissors")}
          >
            scissor
          </button>
        </div>
        <div className="winner">{winner ? this.Winner() : null}</div>
        <div className="winner">Player One: {score ? null: playerWins}</div>
        <div className="winner">Computer: {score ? null: computerWins}</div>
        <div className="winner">Draws: {score ? null: draws}</div>
        <button type="button" onClick={this.startGame}>
          Start!
        </button>
      </>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);**strong text**
 

У меня возникла проблема, когда счет увеличивается на два, если это ничья, победа компьютера или победа игрока. Я не уверен, почему он увеличивается на 2 каждый раз, когда игра заканчивается. Я еще не совсем понимаю свойство «реквизит», поэтому, думая, что это может быть как-то связано с этим, я был бы очень признателен за любую помощь.

Спасибо.

Комментарии:

1. Всякий раз, когда компонент будет повторно отображать, функция Winner() будет выполняться. Я думаю, что это причина увеличения на два.

Ответ №1:

вместо ничьих , выигрышей игрока , выигрышей компьютера вы должны устанавливать их в состояние.

Вот как установить состояние.

 this.setState( prev => ({ ...prev, draws: prev.draws 1}))

this.setState( prev => ({ ...prev, playerWins: prev.playerWins 1}))

this.setState( prev => ({ ...prev, computerWins: prev.computerWins 1 }))
 

Кроме того, вы не объявили «счет» в своем состоянии. Как вы получили оценку?

Вы должны хранить все в состоянии.