본문 바로가기

프로그래밍&IT/React & CSS

[Fast Campus , React] 10. TicTacToe 앱 만들기 (5) 순서 체크 및 O,X 교체 표시 / 승자 결정 / 다시 두기 방지

플레이어의 순서 체크

컴포넌트에 초기 state를 수정하는 것으로 기본값을 설정할 수 있다.

Board.js

- 플레이어가 수를 둘 때마다 다음 플레이어가 누군지 결정하는 state를 저장 위해서

그리고, 두는 순서에 따른 표시 [ X , O ] 교체를 위한 수

const [xIsNext, setXIsNext] = useState(true);
    const handleClick = (i) => {
        const newSquares = squares.slice(); // slice로 통째 복사
        newSquares[i] = xIsNext ? "X" : "O";
        setSquares(newSquares);
        setXIsNext(current => !current);

삼항연산자 사용해서,

중첩 if를 쓰지 않고, 한 줄에 if ~ else ~ 구문을 넣을 수 있다.

a = xIsNext? "X" : "0";

xIsNext가 true이면 "X" 아니면 "O"를 a 변수에 넣는다.

 

승자 결정하기

승부를 계산하는 함수 만들기.

X든 O든 한 줄로 같으면 되기에 lines에 그 경우에 수를 다 나열해 둔 후

for문에서 만약 한 줄로 같은 줄이 나오면 한 줄로 나열된 X / O를 return 해준다.

 

const calcWiner = (squares) => {
        const lines = [
            [0,1,2],
            [3,4,5],
            [6,7,8],
            [1,4,7],
            [2,5,8],
            [0,4,8],
            [2,4,6]
        ]
        for (let i = 0; i < lines.length; i++) {
            const [a,b,c]=lines[i];
            if(squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
                return squares[a];
            }
        }
        return null;
    }
 
    const winer = calcWiner(squares); // 승자계산 결과 값

 

승자 표시

const winer = calcWiner(squares);
    let status;
    if (winer) {
        status = "Winner: " + winer;
    } else {
        status = "Next Player: " + (xIsNext? "X" : "O");
    }

    return (
        <div>
            <div className="status">{status}</div>

승부가 결정 & 같은 위치에 놓으려 하는 것을 방지하기.

const handleClick = (i) => {
        const newSquares = squares.slice(); // slice로 통째 복사
        if(calcWiner(newSquares) || newSquares[i]) {
            return;
 }