○×React Hooks로 게임을 구현합니다.
개시하다
React 튜토리얼에서×게임을 소재로 설명했지만 변함없는 학급 기반 게임이었다.그래서 React Hooks를 사용해서 그 내용을 소개해 봤어요.
이쪽으로 했어요.교과서와는 조금 다르다.
이루어지다
디스크 어셈블리(Board) 제작
먼저 접시 부분을 만든다.테이블 변수에 다음 2차원 그룹 데이터가 포함되어 있으면 그림과 같은 표를 표시합니다.
// null, '×', '○'のどれかが入る
const table = [
[null, null, null],
[null, '×', '○'],
[null, null, null],
];
자세한 조정은 격자가
disabled
과 내용이 null
일 때만 커서를 표시하고 클릭할 수 있습니다.Board.js
const Board = (props) => {
return (
<div className="board">
{props.table.map((row, i) => (
<div key={i} className="board__line">
{row.map((col, j) => (
<div
key={j}
className={classNames('board-item', {
'-clickable': !props.disabled && col == null,
})}
onClick={() => {
if (!props.disabled && col == null) {
props.onSelectItem(i, j);
}
}}
>
<div className="board-item__content">{col}</div>
</div>
))}
</div>
))}
</div>
);
};
Board.propTypes = {
table: PropTypes.array.isRequired,
disabled: PropTypes.bool.isRequired,
onSelectItem: PropTypes.func.isRequired,
};
○×논리적 구현 구성
Board 구성 요소 사용하십시오.○×채우기
cloneDeep
이 되기 위해 변경된 내용으로 업데이트const SIZE = 3;
const PLAYERS = ['X', '◯'];
/**
* 最初の盤面データを生成する
* @param size - 縦横それぞれの方向の個数
* @return 盤面データ
*/
const createInitialBoardData = (size) => {
return Array(size).fill().map(() => Array(size).fill(null));
};
const App = () => {
const [step, setStep] = useState(0);
const [boardData, setBoardData] = useState(createInitialBoardData(SIZE));
const player = PLAYERS[step % PLAYERS.length];
return (
<div className="game">
<div className="game__item">
<Board
table={boardData}
onSelectItem={(i, j) => {
if (boardData[i][j] != null) {
return;
}
const newBoardData = _.cloneDeep(boardData);
newBoardData[i][j] = player;
setBoardData(newBoardData);
setStep(step + 1);
}}
/>
</div>
</div>
);
};
승자를 판정하다
판면 데이터를 전달하여 승자를 판정하다.수직선, 가로선, 사선에 같은 요소가 있는지 확인하세요.
승자를 판정하다
/**
* 勝者の判定をする
* @param boardData - 盤面データ
* @return 勝者(nullの場合はまだ未決定)
*/
const judgeWinner = (boardData) => {
// 横ラインの勝者判定
for (let i = 0; i < boardData.length; i++) {
const putPlayer = boardData[i][0];
// 始めが誰も置いていない場合は調べても無駄なのでスキップ
if (putPlayer == null) {
continue;
}
const isThePlayerWon = boardData[i]
.every((player) => player === putPlayer);
if (isThePlayerWon) {
return putPlayer;
}
}
// 縦ラインの勝者判定
for (let j = 0; j < boardData[0].length; j++) {
const putPlayer = boardData[0][j];
// 始めが誰も置いていない場合は調べても無駄なのでスキップ
if (putPlayer == null) {
continue;
}
const isThePlayerWon = _.times(boardData[0].length)
.map((i) => boardData[i][j])
.every((player) => player === putPlayer);
if (isThePlayerWon) {
return putPlayer;
}
}
// 右下ラインの勝者判定
{
const putPlayer = boardData[0][0];
if (putPlayer != null) {
const isThePlayerWon = _.times(boardData.length)
.map((i) => boardData[i][i])
.every((player) => player === putPlayer);
if (isThePlayerWon) {
return putPlayer;
}
}
}
// 右上ラインの勝者判定
{
const putPlayer = boardData[boardData.length - 1][0];
if (putPlayer != null) {
const isThePlayerWon = _.times(boardData.length)
.map((i) => boardData[boardData.length - 1 - i][i])
.every((player) => player === putPlayer);
if (isThePlayerWon) {
return putPlayer;
}
}
}
// 誰も見つけられなかったらnullを返す
return null;
}
상태 표시 및 재설정 기능 추가
마지막으로 승자 등의 상태 표시와 리셋 기능을 더하면 완성된다.
App.js
const App = () => {
const [step, setStep] = useState(0);
const [boardData, setBoardData] = useState(createInitialBoardData(SIZE));
const player = PLAYERS[step % PLAYERS.length];
+ const winner = judgeWinner(boardData);
+ const statusLabel = (() => {
+ if (winner != null) {
+ return `winner: ${winner}`;
+ }
+
+ if (step >= SIZE * SIZE) {
+ return 'draw';
+ }
+
+ return `next player: ${player}`;
+ })();
return (
<div className="game">
<div className="game__item">
<Board
table={boardData}
+ disabled={winner != null}
onSelectItem={(i, j) => {
if (boardData[i][j] != null) {
return;
}
const newBoardData = _.cloneDeep(boardData);
newBoardData[i][j] = player;
setBoardData(newBoardData);
setStep(step + 1);
}}
/>
</div>
+ <div className="game__item">
+ <div>{statusLabel}</div>
+ <button
+ onClick={() => {
+ setBoardData(createInitialBoardData(SIZE));
+ setStep(0);
+ }}
+ >
+ reset
+ </button>
+ </div>
</div>
);
};
끝맺다
지금까지 React Hooks를 사용했습니다.×게임의 실현.상당히 간단한 설치라 리액트 훅스의 장점은 별로 없는데 뭔가 도움이 된다면 좋겠네요.
Reference
이 문제에 관하여(○×React Hooks로 게임을 구현합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/wintyo/articles/132ada6a403ca1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)