Build a Tic-Tac-Toe Game - Build a Tic-Tac-Toe Game

Tell us what’s happening:

I have disabled the buttons and have messages being displayed for wins and draws but steps 9, 10, 11 do not pass.

Your code so far

<!-- file: index.html -->
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>Tic-Tac-Toe</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.3.1/umd/react.development.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.3.1/umd/react-dom.development.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/7.26.5/babel.min.js"></script>
    <script
      data-plugins="transform-modules-umd"
      type="text/babel"
      src="index.jsx"
    ></script>
    <link rel="stylesheet" href="styles.css" />
</head>

<body>
    <div id="root"></div>
    <script
      data-plugins="transform-modules-umd"
      type="text/babel"
      data-presets="react"
      data-type="module"
    >
      import { Board } from './index.jsx';
      ReactDOM.createRoot(document.getElementById('root')).render(<Board />);
    </script>
</body>

</html>
/* file: index.jsx */
const { useState, useEffect } = React;

export function Board() {
  
  const [roundEnded, setRoundEnded] = useState(false);
  const [turn, setTurn] = useState("X");
  const [boardArr, setBoardArr] = useState(["", "", "", "", "", "", "", "", ""]);
  const [gameResult, setGameResult] = useState("Player X's Turn");


  function updateBoardArr(index){
    const newBoard = [...boardArr];
    newBoard[index] = turn;
    setBoardArr(newBoard);
  }
  
  function handleButtonClick(index){
    updateBoardArr(index);
    setTurn(prev => (prev === "X" ? "O" : "X"));
  }

  function handleReset(){
    setTurn("X");
    setBoardArr(["", "", "", "", "", "", "", "", ""]);
    setGameResult("Player X's Turn");
    setRoundEnded(false);
  }

  const winningConditions = [
    [0, 1, 2], // Top row
    [3, 4, 5], // Middle row
    [6, 7, 8], // Bottom row
    [0, 3, 6], // Left column
    [1, 4, 7], // Middle column
    [2, 5, 8], // Right column
    [0, 4, 8], // Diagonal-1
    [2, 4, 6]  // Diagonal-2
  ];

  function checkWinner() {
    if(roundEnded) return;
    
    for (let i = 0; i < winningConditions.length; i++) {
    const [x, y, z] = winningConditions[i];
    const a = boardArr[x];
    const b = boardArr[y];
    const c = boardArr[z];

    if (a && a === b && a === c) {
      setRoundEnded(true);
      setGameResult(`Player ${a} has Won!`);
      return;
    }
  }

  if (!roundEnded && !boardArr.includes("")) {
    setRoundEnded(true);
    setGameResult("Game has ended in a draw!");
  }
}

  useEffect(() => {
    if (!roundEnded) {
      setGameResult(`Player ${turn}'s Turn`);
    }
  }, [turn, roundEnded]);

   useEffect(() => {
    checkWinner();
  }, [boardArr]);

  return (
    <div className="content">
      <h1>A Game of Tic-Tac-Toe</h1>
      <h2>{gameResult}</h2>
      <div className="game-board">
        <button className="square" disabled={boardArr[0] !== "" || roundEnded} onClick={() => handleButtonClick(0)}>
          {boardArr[0]}
        </button>
        <button className="square" disabled={boardArr[1] !== "" || roundEnded} onClick={() => handleButtonClick(1)}>
          {boardArr[1]}
        </button>
        <button className="square" disabled={boardArr[2] !== "" || roundEnded} onClick={() => handleButtonClick(2)}>
          {boardArr[2]}
        </button>
        <button className="square" disabled={boardArr[3] !== "" || roundEnded} onClick={() => handleButtonClick(3)}>
          {boardArr[3]}
        </button>
        <button className="square" disabled={boardArr[4] !== "" || roundEnded} onClick={() => handleButtonClick(4)}>
          {boardArr[4]}
        </button>
        <button className="square" disabled={boardArr[5] !== "" || roundEnded} onClick={() => handleButtonClick(5)}>
          {boardArr[5]}
        </button>
        <button className="square" disabled={boardArr[6] !== "" || roundEnded} onClick={() => handleButtonClick(6)}>
          {boardArr[6]}
        </button>
        <button className="square" disabled={boardArr[7] !== "" || roundEnded} onClick={() => handleButtonClick(7)}>
          {boardArr[7]}
        </button>
        <button className="square" disabled={boardArr[8] !== "" || roundEnded} onClick={() => handleButtonClick(8)}>
          {boardArr[8]}
        </button>
      </div>
      <button onClick={handleReset} id="reset">Reset Game</button>
    </div>
  )
}
/* file: styles.css */
*{
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  font-family: helvetica;
}

.content{
  display: flex;
  flex-direction: column;
}

h1, h2{
  text-align: center;
  margin-top: 4%;
}

.game-board{
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
  gap: 10px;

  width: 350px;
  height: 250px; 

  margin: 5% auto 25px auto;
}

.square{
  font-weight: bold;
  font-size: 2rem;
  color: black;
  background-color: #eee;
}

button:hover{
  cursor: pointer;
}

.square:hover{
  background-color: white;
}

.square:disabled{
  background-color: initial;
  color: initial;
  cursor: initial;
}

#reset{
  width: 100px;
  height: 40px;
  font-weight: bold;
  margin: 0 auto;
}

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0

Challenge Information:

Build a Tic-Tac-Toe Game - Build a Tic-Tac-Toe Game