Rumah  >  Artikel  >  hujung hadapan web  >  Tic Tac Toe mudah tetapi paling banyak ditanya dalam Pusingan Frontend! KENAPA ?

Tic Tac Toe mudah tetapi paling banyak ditanya dalam Pusingan Frontend! KENAPA ?

WBOY
WBOYasal
2024-08-05 16:26:32443semak imbas

Tic Tac Toe is simple but most asked in Frontend Rounds! WHY ?

Sebagai graduan baru, saya menemui Tic-Tac-Toe sebagai soalan temuduga yang kerap, terutamanya dalam peranan frontend. Ia adalah masalah serba boleh yang menguji kemahiran pembangunan bahagian hadapan, pemikiran logik dan kebolehan menyelesaikan masalah dengan berkesan menggunakan struktur data dan algoritma.

Saya memutuskan untuk melaksanakan Tic-Tac-Toe sendiri untuk mengukuhkan pemahaman saya. Walaupun ia mungkin kelihatan seperti permainan yang mudah, mencipta penyelesaian yang mantap melibatkan pertimbangan teliti beberapa faktor.

Saya berbesar hati untuk berkongsi kod saya dan menerangkan pendekatan saya. Saya percaya bahawa perkongsian pengetahuan adalah penting untuk pertumbuhan, dan membincangkan penyelesaian boleh membawa kepada cerapan dan penambahbaikan yang berharga.

App.jsx

import "./App.css"
import TicTacToe from "./components/TicTacToe"
const App = () => {
  return (
    <div >
        <TicTacToe />
    </div>
  )
}
export default App

TicTacToe.jsx

import useTicTacToe from "../hooks/useTicTacToe"

const TicTacToe = () => {

    const {board, handleClick, getStatusMessage, resetGame} = useTicTacToe();

    return (
        <div className="main">
            <div className="heading">
                <h1>
                    {
                    getStatusMessage()
                    }
                </h1>
                <button onClick={resetGame}>Reset Game</button>
            </div>
            <div className="board">
                {
                    board.map((player, i) => {
                        return <button key={i} onClick={() => handleClick(i)} disabled = {player !== null}>{player}</button>
                    })
                }
            </div>
        </div>
    )
}

export default TicTacToe

Kail Reaksi Tersuai

import { useState } from "react";
const intialGame = () => Array(9).fill(null);

const useTicTacToe = () => {
    const [board, setBoard] = useState(intialGame())
    const [isXNext, setIsXNext] = useState(true);
    const winning_patterns = [
        [0,1,2],
        [3,4,5],
        [6,7,8],
        [0,4,8],
        [2,4,6],
        [0,3,6],
        [1,4,7],
        [2,5,8],

    ];
    const calculateWinner = (currentBoard) => {
        for(let i = 0 ; i < winning_patterns.length ; i++) {
            const [a, b, c] = winning_patterns[i];
            if(currentBoard[a] && currentBoard[a] === currentBoard[b] && currentBoard[a] === currentBoard[c]) {
                return currentBoard[a];
            }
        }
        return null;
    }
    const resetGame = () => {
        setBoard(intialGame());
    }
    const getStatusMessage = () => {
        const winner = calculateWinner(board);
        if(winner) return `Player ${winner} Won ?`
        if(!board.includes(null)) return `It's a Draw`
        return `Player ${isXNext === true ? "X" : "O"} Turn`
    }
    const handleClick = (index) => {
        const winner = calculateWinner(board);
        if(winner) return null;
        const newBoard = [...board];
        newBoard[index] = isXNext ? "X" : "O";
        setBoard(newBoard);
        setIsXNext(!isXNext);
    }

    return {board, calculateWinner, resetGame, getStatusMessage, handleClick}
}

export default useTicTacToe;

Penggayaan

.board {
  width: 300px;
  height: 300px;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  justify-content: center;
}

.main {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  gap: 10px;
}

.heading {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 10px;
}

.board button {
  font-size: 35px;
}

Atas ialah kandungan terperinci Tic Tac Toe mudah tetapi paling banyak ditanya dalam Pusingan Frontend! KENAPA ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn