● 순서를 만들어서 'O' 추가하기
첫 번째 차례를 'X' 로 시작하도록 해주기 위해 Board 컴포넌트에 초기 state를 수정하는 것으로 기본값을 설정한다.
(원래는 null로 되어있는 것을 첫번째는 'x'로 두번째는 'o'로 해준다.)
- const[] .... 이렇게 일일히 모두 쳐도 되지만 useStateSnippet을 사용하면 자동으로 코드구조가 완성되어 나타난다.
플레이어가 수를 둘 때마다 xIsNext (boolean 값)이 뒤집혀 다음 플레이어가 누군지 결정하고 게임의 state가 저장된다.
Board의 handleClick 함수를 수정하여 xIsNext 값을 뒤집는다.
저 위에서 setXIsNext( !xIsNext ) 와 setXIsNext( prev => !prev)를 둘다 사용해도 되지만 둘의 차이점은
setXIsNext( !xIsNext ) 이 코드를 2번 연속 적었을 경우 2번 적었다 해도 통으로 1번만 실행되지만
setXIsNext( prev => !prev) 를 2번 연속 적으면 원하던대로 2번 실행되는 것을 확인 할 수 있다.
즉, 만약 number를 위에서 const[number, setNumber] = useState(0); 로 0으로 초기화 시킨 다음에
setNumber(number +1);
setNumber(number +1);
이렇게 하면 2로 나와야 할 number가 1로 나오게 되고
setNumber(prev => prev + 1);
setNumber(prev => prev + 1);
이렇게 하면 number는 2로 나오게 된다.
그래서 !xIsNext 대신 prev => !prev 를 사용하고 실행해보면 x 부분을 다시 클릭했을 시 o로 변경되는 것을 확인 할 수 있다.
Board의 rendering 하는 부분에 있는 "status" 텍스트도 바꿔서 어는 플레이어가 다음 차례인지 알려주도록 해준다.
그리고 return 문으로 가서 직접 쓰여있던 Next Player:X,O 대신에 {status}를 넣어준다.
그러고 다시 실행시키면 다음 차례를 나타낼 수 있다.
● 승자 결정하기
어떤 선수가 다음 차례인지 알려주는 부분을 했으니
이번에는 승부가 나는 때와 더 이상 둘 곳이 없을 때를 알려주는 코드를 작성해본다.
- 승부 결정하는 걸 계산하는 함수 만들기
이길 수 있는 모든 경우의 수를 다 나열해준다.
X이든 O이든 한 줄로 같으면 되기에 lines에 그 경우의 수를 다 나열해 준 다음에 for문에서 만약 한 줄로 같은 줄이 나오면 한 줄로 나열된 X 혹은 O를 return 해준다.
(tabnineAI 라는 확장프로그램을 사용하게 되면 자동으로 내가 뭘 칠지 예상해서 보여준다.)
먼저 위에서 const를 사용해 winner 변수를 만들어 준다.
그리고 밑에서 함수 calculateWinner를 작성해준다.
모든 경우의 수를 작성해준 뒤 for문을 사용해 a와 b, c 를 비교해서 승자를 결정하도록 해준다.
( 이 코드는 winner 변수보다 앞에 작성되어야 const winner = calculateWinner(squares) 를 사용할 수 있다.
아니면 calculateWinner가 정의되지 않았다는 오류가 발생한다.
: 'calculateWinner' was used before it was defined no-use-before-define)
- 승자 표시해주기
위의 const winner와 const status를 if문을 사용해서 승자가 있을 경우와 없을 경우를 나누어 변경시켜준다.
모두 작성하고 실행시켜보면 한줄이 완성된 x가 winner라고 나오게 되는 것을 확인할 수 있다.
- 누군가가 승리하거나 Square가 이미 채워졌다면 Board의 handleClick 함수가 클릭을 무시하도록 설정
return; 을 해줌으로써 더 이상 코드가 작동되지 않도록 해준다.
square의 css도 변경을 해준다.
<전체코드>
- Board.js 코드
'리액트 > TicTacToe' 카테고리의 다른 글
TICTACTOE 만들기 7 ( 과거의 이동 표시하기 - map 메소드 ) (1) | 2024.09.18 |
---|---|
TICTACTOE 만들기 6 ( 동작에 대한 기록 저장하기 ) (1) | 2024.09.18 |
TICTACTOE 만들기 4 (클래스형 -> 함수형 변경) (1) | 2024.09.15 |
TICTACTOE 만들기 3 (State, Super, 불변성) (0) | 2024.07.31 |
TicTacToe 앱 만들기 2 (Props, 사용자와 상호작용) (0) | 2024.07.31 |