티스토리 뷰
// class
import React, { Component } from 'react';
const rspCoords = {
바위: '0',
가위: '-142px',
보: '-284px',
}
const scores = {
바위: 0,
가위: 1,
보: -1,
}
const computerChoice = (imgCoord) => {
return Object.entries(rspCoords).find(function (v) {
return v[1] === imgCoord;
})[0];
};
class RSP extends Component {
state = {
result: '',
imgCoord: '0',
score: 0,
}
interval;
componentDidMount() { // 컴포넌트가 첫 렌더링 후
this.interval = setInterval(this.changeHand, 100);
}
componentWillUnmount() {
clearInterval(this.interval);
}
changeHand = () => {
const { imgCoord } = this.state;
if (imgCoord === rspCoords.바위) {
this.setState(
{ imgCoord: rspCoords.가위, }
);
} else if (imgCoord === rspCoords.가위) {
this.setState(
{ imgCoord: rspCoords.보, }
);
} else if (imgCoord === rspCoords.보) {
this.setState(
{ imgCoord: rspCoords.바위, }
);
}
}
onClickBtn = (choice) => {
const { imgCoord } = this.state;
clearInterval(this.interval);
const myScore = scores[choice];
const comScore = scores[computerChoice(imgCoord)];
const diff = myScore - comScore;
if (diff === 0) {
this.setState({
result: '비겼습니다.',
});
} else if ([-1, 2].includes(diff)) {
this.setState((prevState) => {
return ({
result: '이겼습니다.',
score: prevState.score + 1,
});
});
} else {
this.setState((prevState) => {
return ({
result: '졌습니다.',
score: prevState.score - 1,
});
});
}
setTimeout(() => {
this.interval = setInterval(this.changeHand, 100);
}, 2000);
}
render() {
const { result, score, imgCoord } = this.state;
return (
<>
<div id="computer" style={{ background: `url(https://en.pimg.jp/023/182/267/1/23182267.jpg) ${imgCoord} 0` }}></div>
<div>
<button id="rock" className="btn" onClick={() => { this.onClickBtn('바위') }}>바위</button>
<button id="scissor" className="btn" onClick={() => { this.onClickBtn('가위') }}>가위</button>
<button id="paper" className="btn" onClick={() => { this.onClickBtn('보') }}>보</button>
</div>
<div>{result}</div>
<div>현재 {score}점</div>
</>
);
}
}
export default RSP;
state와 연관이 없는 값을 밖에다가 빼둬도 됨
class로 너무 많은 것을 묶으려하지 말 것
+
나는 실행이 안되서 this.state.imgCoord를 문자열로 했음...
728x90
'유튜브 강의' 카테고리의 다른 글
제로초 리액트 강의 7 useReducer, 성능최적화 (0) | 2021.11.17 |
---|---|
제로초 리액트 강의 6 로또 추첨기 만들기, useEffect, useMemo, useCallback (0) | 2021.11.17 |
제로초 리액트 강의 5.1 리액트 라이프 사이클, 고차 함수, useEffect (0) | 2021.11.16 |
제로초 리액트 강의 4 React 반복문, 반응속도 체크 만들기 (0) | 2021.11.15 |
제로초 리액트 강의 3.5 (0) | 2021.11.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 비주얼스튜디오코드
- 드림코딩
- vscode
- 깃
- 회고
- 저스트코드
- React
- git
- javascript
- TS
- 리액트
- js
- vue
- 김버그
- html
- 파이썬
- Typescript
- Til
- CSS
- 구름에듀
- 제로초
- 자바스크립트
- 타입스크립트
- map
- 스파르타코딩클럽
- Python
- scss
- 코딩앙마
- 코드잇
- 제이쿼리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함