Javascript/React์™€ Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ

[React + Node ๊ฐ™์ด ๋•Œ๋ ค์žก๊ธฐ] (2) ๋ฆฌ์•กํŠธ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„

Rainbow๐ŸŒˆCoder 2022. 12. 4. 21:31
728x90

ํ”„๋กœ์ ํŠธ ๊ตฌ์ถ•

 

 

๋ฆฌ์•กํŠธ ๊ฐ€์œ„๋ฐ”์œ„๋ณด ๊ฒŒ์ž„

 

 

 

Box 2๊ฐœ ๋งŒ๋“ค๊ธฐ(๋‚˜ ๋ฒ„์ „, ์ปดํ“จํ„ฐ ๋ฒ„์ „)

src ์•„๋ž˜์— component ํด๋” ๋งŒ๋“ค๊ณ  Box.js ๋งŒ๋“ค์–ด์คŒ

์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ๋‹จ์ถ•ํ‚ค : 

  • ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“œ๋Š” ๋‹จ์ถ•ํ‚ค : rafce
  • ๋‹จ์ถ•ํ‚ค๊ฐ€ ์•ˆ๋‚˜์˜ฌ ๊ฒฝ์šฐ ์„ค์น˜ extention

  • ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค์‹œ ์ฃผ์˜์‚ฌํ•ญ:
    • ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ๋ฐ˜๋“œ์‹œ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘
      ๋ฆฌ์•กํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ์™€ ์ผ๋ฐ˜ HTMLํƒœ๊ทธ(<div>,<p>๋“ฑ..)์„ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํƒœ๊ทธ๊ฐ€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ด๋‹ค ๋”ฐ๋ผ์„œ ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘์„ ํ•˜๋ฉด ์ผ๋ฐ˜ HTMLํƒœ๊ทธ๋กœ ๋ถ„๋ฅ˜ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์ฒซ ๊ธ€์ž๋Š” ๋Œ€๋ฌธ์ž๋กœ!

 

App.js / Box.js / App.css ์ฝ”๋“œ

(1) ์œ ์ €๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์œ„, ๋ฐ”์œ„, ๋ณด ๋ฒ„ํŠผ

(2) ์œ ์ €๊ฐ€ ์„ ํƒํ•œ ๊ฐ€์œ„, ๋ฐ”์œ„, ๋ณด ์ด๋ฏธ์ง€๊ฐ€ ๋ณด์—ฌ์ง€๋Š” UI ์„ธํŒ…

(3) ์ปดํ“จํ„ฐ ์ถœ๋ ฅ ๊ฐ€์œ„, ๋ฐ”์œ„, ๋ณด ์ด๋ฏธ์ง€๊ฐ€ ์œ ์ € ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๋žœ๋คํ•˜๊ฒŒ UI ์„ธํŒ…

 

App.js

import { useState } from 'react';
import Box from "./component/Box";
import './App.css'

const chioce = {
	rock: {
		name: 'Rock',
		img: "https://us.123rf.com/450wm/grgroup/grgroup1705/grgroup170505604/78932529-%EB%B0%94%EC%9C%84-%EB%B2%A1%ED%84%B0-%EC%9D%BC%EB%9F%AC%EC%8A%A4%ED%8A%B8-%EB%A0%88%EC%9D%B4-%EC%85%98%EC%9D%98-%EB%8D%A9%EC%96%B4%EB%A6%AC%EC%99%80-%EC%BB%AC%EB%9F%AC-%EB%B0%B0%EA%B2%BD.jpg",
	},
	scissors: {
		name: 'Scissors',
		img: "https://static.vecteezy.com/system/resources/previews/003/240/783/original/scissor-illustration-in-flat-design-vector.jpg",
	},
	paper: {
		name: 'Paper',
		img: "https://llllline.com/images/thumbs/0000017701_hand-palm-graphic-ai-vector_800.jpeg",
	},
}
function App() {

	const [userSelect, setUserSelect] = useState(null);
	const [computerSelect, setcomputerSelect] = useState(null);

	const play = (userChoice) => {
		setUserSelect(chioce[userChoice]);
		let computerChoice = randomChoice();
		setcomputerSelect(computerChoice);

	}

	const randomChoice = () => {
		let itemArray = Object.keys(chioce); //๊ฐ์ฒด์— ํ‚ค๊ฐ’๋งŒ ๋ฝ‘์•„์„œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜
		let randomItem = Math.floor(Math.random() * itemArray.length);
		let final = itemArray[randomItem];
		return chioce[final];
	}
	return (
		<div>
			<div className='main'>
				<Box title="You" item={userSelect} />
				<Box title="Computer" item={computerSelect} />
			</div>
			<div className='main'>
				<button onClick={() => play('scissors')}>๊ฐ€์œ„</button>
				<button onClick={() => play('rock')}>๋ฐ”์œ„</button>
				<button onClick={() => play('paper')}>๋ณด</button>
			</div>
		</div>
	);
}

export default App;

 

Box.js

import { React } from 'react';

function Box(props) {
	return (
		<div>
			<div className='box'>
				<h1>{props.title}</h1>
				<img className="item-img" src={props.item && props.item.img}></img>
			</div>
			<div><h1>Win</h1></div>;
		</div>

	);
}

export default Box;

App.js

.box {
  border: 1px solid black;
  width: 500px;
  height: 500px;
}

.item-img {
	width: 400px;
}

.main {
	display: flex;
	justify-content: center;
}

 

์Šน์ž ๊ฐ€๋ฆฌ๊ธฐ

App.js

import { useState } from 'react';
import Box from "./component/Box";
import './App.css'

const chioce = {
	rock: {
		number: 0,
		name: 'Rock',
		img: "https://us.123rf.com/450wm/grgroup/grgroup1705/grgroup170505604/78932529-%EB%B0%94%EC%9C%84-%EB%B2%A1%ED%84%B0-%EC%9D%BC%EB%9F%AC%EC%8A%A4%ED%8A%B8-%EB%A0%88%EC%9D%B4-%EC%85%98%EC%9D%98-%EB%8D%A9%EC%96%B4%EB%A6%AC%EC%99%80-%EC%BB%AC%EB%9F%AC-%EB%B0%B0%EA%B2%BD.jpg",
	},
	scissors: {
		number: 1,
		name: 'Scissors',
		img: "https://static.vecteezy.com/system/resources/previews/003/240/783/original/scissor-illustration-in-flat-design-vector.jpg",
	},
	paper: {
		number: 2,
		name: 'Paper',
		img: "https://llllline.com/images/thumbs/0000017701_hand-palm-graphic-ai-vector_800.jpeg",
	},
}
function App() {

	const [userSelect, setUserSelect] = useState(null);
	const [computerSelect, setcomputerSelect] = useState(null);
	const [result, setResult] = useState("");
	const [computerResult, setComputerResult] = useState("");

	const play = (userChoice) => {
		setUserSelect(chioce[userChoice]);
		let computerChoice = randomChoice();
		setcomputerSelect(computerChoice);
		setResult(judgement(chioce[userChoice], computerChoice));
		setComputerResult(computerJudgement(chioce[userChoice], computerChoice));
	}

	const judgement = (user, computer) => {
		if (user.number == computer.number) {
			return "Tie";
		} return user.number > computer.number ? "Win" : "Lose";
	}

	const computerJudgement = (user, computer) => {
		if (user.number == computer.number) {
			return "Tie";
		} return user.number > computer.number ? "Lose" : "Win";
	}



	const randomChoice = () => {
		let itemArray = Object.keys(chioce); //๊ฐ์ฒด์— ํ‚ค๊ฐ’๋งŒ ๋ฝ‘์•„์„œ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํ•จ์ˆ˜
		let randomItem = Math.floor(Math.random() * itemArray.length);
		let final = itemArray[randomItem];
		return chioce[final];
	}
	return (
		<div>
			<div className='main'>
				<Box title="You" item={userSelect} result={result} />
				<Box title="Computer" item={computerSelect} result={computerResult} />
			</div>
			<div className='main'>
				<button onClick={() => play('scissors')}>๊ฐ€์œ„</button>
				<button onClick={() => play('rock')}>๋ฐ”์œ„</button>
				<button onClick={() => play('paper')}>๋ณด</button>
			</div>
		</div>
	);
}

export default App;

Box.js

import { React } from 'react';

function Box(props) {
	return (
		<div>
			<div className='box'>
				<h1>{props.title}</h1>
				<img className="item-img" src={props.item && props.item.img}></img>
			</div>
			<div><h1>{props.result}</h1></div>;
		</div>

	);
}

export default Box;
728x90