지뢰찾기 만들기(7)
Step 7
하나의 지뢰 밟으면 다른 지뢰 다 나타내기
MineSearch.jsx
case CLICK_MINE: {
const tableData = [...state.tableData];
tableData[action.row] = [...state.tableData[action.row]];
tableData[action.row][action.cell] = CODE.CLICKED_MINE;
for(let i = 0 ; i < state.gameData.row; i++) {
for(let j = 0 ; j < state.gameData.cell; j++) {
if (tableData[i][j] === CODE.MINE || tableData[i][j] === CODE.FLAG_MINE) {
tableData[i][j] = CODE.CLICKED_MINE;
}
}
...
}
꾸며주기
FontAwesome 을 사용함
npm i --save @fortawesome/fontawesome-svg-core
npm install --save @fortawesome/free-solid-svg-icons
npm install --save @fortawesome/react-fontawesome
isWin 이라는 스테이트를 새로 만들어주고 false로 초기화함
const initialState = {
tableData: [],
timer: 0,
result: '',
halted: true,
gameData: {
row: 0,
cell: 0,
mine: 0,
},
isWin: false,
}
OPEN_CELL 액션에서
이기는 조건으로 isWin을 true로 바꿔줌
그리고 result는 저렇게 바꿔줌
if (openCount === state.gameData.row*state.gameData.cell-state.gameData.mine) {
halted = true;
result = <div>You won in {state.timer} seconds!!</div>;
isWin = true;
}
렌더링 부분은 조건을 써서 이길때와 질때를 css클래스로 구분함
return (
//value = {{ tableData: state.tableData, dispatch }} 원래는 이렇게 들어가지만 useMemo로 캐싱해줌
<TableContext.Provider value = {value}>
<Form />
<div class="timer"><FontAwesomeIcon icon={faStopwatch} /> {timer}</div>
<Table />
{state.isWin?<div class="result-win"><FontAwesomeIcon icon={faSmileWink} /> {result}</div>:<div class="result-fail">{result}</div>}
</TableContext.Provider>
)
Td의 스타일과 텍스트 바꿔주는 함수도 바꿔줌
const getTdStyle = (code) => {
switch (code) {
case CODE.NORMAL:
case CODE.MINE:
return {
background: '#444',
};
case CODE.CLICKED_MINE:
return {
background: 'red',
};
case CODE.OPENED:
return {
background: 'white',
};
case CODE.QUESTION_MINE:
case CODE.QUESTION:
return {
background: 'yellow',
}
case CODE.FLAG_MINE:
case CODE.FLAG:
return {
background: 'green',
}
default:
return {
background: 'white',
};
}
};
const getTdText = (code) => {
switch (code) {
case CODE.NORMAL:
return '';
case CODE.MINE:
return '';
case CODE.CLICKED_MINE:
const boom = <FontAwesomeIcon icon={faBomb} />
return boom;
case CODE.FLAG_MINE:
case CODE.FLAG:
const flag = <FontAwesomeIcon icon={faFlag} />
return flag;
case CODE.QUESTION_MINE:
case CODE.QUESTION:
const question = <FontAwesomeIcon icon={faQuestion} />
return question;
default:
return code || '';
}
};
마지막으로 css까지 변경해주면
App.css
.App {
text-align: center;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: #282c34;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.result-fail {
font-size: 30px;
font-weight: bold;
color: #b52020;
}
.result-win {
font-size: 30px;
font-weight: bold;
color: #000000;
color: orange;
}
.result-win .fa-smile-wink {
font-size: 50px;
}
.svg-inline--fa {
font-size: 23px;
}
.fa-bomb {
font-size: 28px;
}
table {
border-collapse: collapse;
margin: 50px auto;
}
td {
border: 5px solid black;
width: 40px;
height: 40px;
text-align: center;
font-weight: bold;
font-size: 24px;
}
.fa-skull-crossbones {
font-size: 60px;
}
.timer .svg-inline--fa {
font-size: inherit;
}
.timer {
margin-top: 30px;
font-size: 40px;
}
.set-option {
display: flex;
margin: 30px auto 0;
justify-content: center;
}
.set-option input[type="number"] {
width: 9%;
height: 30px;
font-size: 22px;
margin-right: 22px;
/* padding: 0 10px; */
text-align: center;
border: 0;
/* text-indent: 17px; */
border-bottom: 4px solid #000;
}
.set-option button {
width: 10%;
font-size: 17px;
font-weight: bold;
}
Author And Source
이 문제에 관하여(지뢰찾기 만들기(7)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@whanhee97/React-지뢰찾기-만들기7저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)