cssCopy code
import React, { useState } from "react";
import "./styles.css";
const BOARD_SIZE = 3;
const EMPTY_CELL = "";
const TicTacToe = () => {
const [board, setBoard] = useState(Array(BOARD_SIZE).fill(Array(BOARD_SIZE).fill(EMPTY_CELL)));
const [player, setPlayer] = useState("X");
const [winner, setWinner] = useState(null);
const handleClick = (row, col) => {
if (!board[row][col] && !winner) {
const newBoard = board.map((rowArray, rowIndex) =>
rowIndex === row ? rowArray.map((cell, colIndex) => colIndex === col ? player : cell) : rowArray
);
setBoard(newBoard);
setPlayer(player === "X" ? "O" : "X");
checkWinner(newBoard);
}
};
const checkWinner = (board) => {
// Check rows
for (let i = 0; i < BOARD_SIZE; i++) {
if (board[i][0] && board[i][0] === board[i][1] && board[i][1] === board[i][2]) {
setWinner(board[i][0]);
return;
}
}
// Check columns
for (let i = 0; i < BOARD_SIZE; i++) {
if (board[0][i] && board[0][i] === board[1][i] && board[1][i] === board[2][i]) {
setWinner(board[0][i]);
return;
}
}
// Check diagonals
if (board[0][0] && board[0][0] === board[1][1] && board[1][1] === board[2][2]) {
setWinner(board[0][0]);
return;
}
if (board[0][2] && board[0][2] === board[1][1] && board[1][1] === board[2][0]) {
setWinner(board[0][2]);
return;
}
// Check for a tie
if (board.every(row => row.every(cell => cell))) {
setWinner("Tie");
return;
}
};
const resetGame = () => {
setBoard(Array(BOARD_SIZE).fill(Array(BOARD_SIZE).fill(EMPTY_CELL)));
setPlayer("X");
setWinner(null);
};
return (
<div className="game">
<div className="board">
{board.map((row, rowIndex) => (
<div key={rowIndex} className="row">
{row.map((cell, colIndex) => (
<div key={colIndex} className="cell" onClick={() => handleClick(rowIndex, colIndex)}>
{cell}
</div>
))}
</div>
))}
</div>
<div className="status">
{winner ? `Winner: ${winner}` : `Next player: ${player}`}
<button onClick={resetGame}>Reset</button>
</div>
</div>
);
};
export default TicTacToe;