본문 바로가기
깃허브 링크!
react

react 가위바위보

npx create-react-app test 리엑트 test 파일생성되며 해당 디렉토리안에 React프로젝트의 초기 구조생성

react에서 rafce 
"React Arrow Function Component Export" 의 약어

 

import img01 from "./가위.jpg";
import img02 from "./바위.jpg";
import img03 from "./보.jpg"

// 다수 내보낼때

export{img01,img02,img03};

 

import {useState,useEffect} from "react"
import Block from './components/Block'
import './App.css';
import { img01,img02,img03} from "./img"
// 추억의 자바스크립트
// 가위바위보
// 플레이어 하나 컴퓨터 하나
// 컴포넌트로 만들고
// 컴퓨터는 랜덤 가위 바위 보 중에 하나를 내고
// 플레이어는 선택할수 있게
// 
// 플레이어 컴퓨터
// 가위      가위 = 무승부
// 가위      바위 = 패
// 가위       보  = 승
// 바위      바위 = 무승부
// 바위      가위 = 승
// 바위       보  = 패
// 보         보  = 무승부
// 보        가위 = 패
// 보        바위 = 승
function App() {

  // 컴퓨터와 유저가 사용할 가위 바위 보의 객체를 하나 만들어주자
  // 선택 값을 담아 놓을 객체
  const scissors = "가위";
  const rock = "바위";
  const paper = "보";

  // 선택값을 다루고 있어
  // select객체 안에 데이터가 다 들어있으면
  // select 동작을 하는 프로그램을 작성할때 
  // select 객체안에 있는 값은 전부 select 동작을 하기위해 만든것이라고 알수있음

  // select 컴퓨터와 유저가 가위 바위 보를 냈을때 필요한 데이터들을 모아둘 객체
  const select = {
    scissors :{
      name : "가위",
      img : img01
    },
    rock : {
      name : "바위",
      img:img02
    },
    paper : {
      name : "보",
      img : img03
  }
  }

  // 유저가 선택한 데이터 값은 주시하자 선택하면 데이터 바뀐상태로 다시 그려줘야 하기 때문에 
  // 유저의 선택 useState
  const [userSelect, setUserSelect] = useState(null);
  // 컴퓨터의 선택 값을 담을 useState
  const [comSelect, setComSelect] = useState(null);
  // 승패 결과를 담을 useState
  const [result, setResult] = useState(null);

  function userClick(_select){
    // _select == "scissors"
    // select['scissors']
    // _select == "rock"
    // select["rock"]
    // 선택한 객체를 상태변수에 담아주자
    setUserSelect(select[_select]);

    // 컴퓨터는 랜덤으로 선택을 시켜야하는데 
    // 플레이어 선택 이후에 컴퓨터도 랜덤한 값을 가지고 가위 바위 보를 선택 시키자.
    let arr = Object.keys(select);
    // 객체의 키값만 뽑아서 배열로 반환 해준다.
    // Object.keys
    console.log(arr);
    // 소수점 제외시키고 랜덤한 정수값 0~2
    let comRandom = Math.floor(Math.random() * 3);

    // comRandom 랜덤한 값이고 0~2
    // arr = ['scissors', 'rock' , 'paper']
    // arr[comRandom] = 'scissors','rock','paper'
    setComSelect(select[arr[comRandom]]);

    let player = select[_select];
    let computer = select[arr[comRandom]];
    if(player.name === computer.name){
      // 처음에 무승부 거르고 
      setResult("무승부")
    }else if(player.name == "가위"){
      let result = computer.name == "보" ? "이겼음" : "졌다"
      setResult(result);
    }else if(player.name == "바위"){
      let result = computer.name == "가위" ? "이겼음" : "졌다"
      setResult(result);
    }
    else if(player.name == "보"){
      let result = computer.name == "바위" ? "이겼음" : "졌다"
      setResult(result);
    }
  }

  useEffect(()=>{
    console.log(userSelect);
  },[userSelect])

  return (
    <>
    <div className='App'>
    <Block data={userSelect} name={"유저"} result={result}/>
    <Block data={comSelect} name={"컴퓨터"} result={result}/>
    </div>
    <div>
      {/*버튼은 여기에*/}
      <button onClick={()=>{userClick("scissors")}}>가위</button>
      <button onClick={()=>{userClick("rock")}}>바위</button>
      <button onClick={()=>{userClick("paper")}}>보</button>
      
    </div>
    </>
  );
}

export default App;

 

 


function App() {
  const scissors = "가위";
  const rock = "바위";
  const paper = "보";

- 이 부분은 게임에서 사용되는 선택지를 나타내는 변수들 "가위","바위","보"

 

  const [userSelect, setUserSelect] = useState(null);
  const [comSelect, setComSelect] = useState(null);
  const [result, setResult] = useState(null);

- 이 부분은 상태 변수들을 정의하는 부분 userSelect은 유저의 선택 useState를 사용하여 초기값 null 설정

 

function userClick(_select){
    // _select == "scissors"
    // select['scissors']
    // _select == "rock"
    // select["rock"]
    // 선택한 객체를 상태변수에 담아주자
    setUserSelect(select[_select]);

    // 컴퓨터는 랜덤으로 선택을 시켜야하는데 
    // 플레이어 선택 이후에 컴퓨터도 랜덤한 값을 가지고 가위 바위 보를 선택 시키자.
    let arr = Object.keys(select);
    // 객체의 키값만 뽑아서 배열로 반환 해준다.
    // Object.keys
    console.log(arr);
    // 소수점 제외시키고 랜덤한 정수값 0~2
    let comRandom = Math.floor(Math.random() * 3);

    // comRandom 랜덤한 값이고 0~2
    // arr = ['scissors', 'rock' , 'paper']
    // arr[comRandom] = 'scissors','rock','paper'
    setComSelect(select[arr[comRandom]]);

    let player = select[_select];
    let computer = select[arr[comRandom]];
    if(player.name === computer.name){
      // 처음에 무승부 거르고 
      setResult("무승부")
    }else if(player.name == "가위"){
      let result = computer.name == "보" ? "이겼음" : "졌다"
      setResult(result);
    }else if(player.name == "바위"){
      let result = computer.name == "가위" ? "이겼음" : "졌다"
      setResult(result);
    }
    else if(player.name == "보"){
      let result = computer.name == "바위" ? "이겼음" : "졌다"
      setResult(result);
    }
  }
{/*버튼은 여기에*/}
      <button onClick={()=>{userClick("scissors")}}>가위</button>
      <button onClick={()=>{userClick("rock")}}>바위</button>
      <button onClick={()=>{userClick("paper")}}>보</button>

- select는 함수 userClick의 매개변수로 전달되는 값.

이 함수는 사용자가 선택한 가위,바위,보를 나타내는 값을 _select로 받아와서 처리하는 역할

 

select[_select]는 'select'객체에서 _select 변수에 저장된 값을 키로 사용하여 해당하는 객체를 선택

즉 select[_select]는 사용자가 선택한 가위,바위,보에 해당

 

 

import {useState,useEffect} from "react"
const [userSelect, setUserSelect] = useState(null);
useEffect(()=>{
    console.log(userSelect);
  },[userSelect])

- 이 부분은 userSelect의 변경을 감지하고 변경발생마다 콘솔에 userSelect의 값을 출력한다.

 

 

let arr = Object.keys(select);

- 객체의 키값만 뽑아서 배열로 변환해주는데 "가위","바위","보" 이렇게만

 

 

 

 

const [comSelect, setComSelect] = useState(null);
setComSelect(select[arr[comRandom]]);

- 컴퓨터의 상태값을 상태변수인 comSelect에 저장하는 역할(setComSelect를 통해)

arr 배열에는 ["scissors","rock","paper"]와 같은 요소들이 있고 

comRandom은 0부터2까지 랜덤 

// arr[comRandom] = 'scissors','rock','paper'

 

따라서 select[arr[comRandom]]은 select 객체에서 랜덤하게 선택된 가위 바위 보에 해당하는 객체 반환

 

 

import React from 'react'


const Block = ({data,name,result}) => {
  let temp = "";
  if(name == "유저"){
    temp = result;
  }else{
    // result == "무승부"면 문제가 없어 애는 놔둬도 상관없고
    // result == "이겼다"면 반대로 졌다를 보여줘야 하고
    // result == "졌다"면 반대로 이겼다를 보여줘야한다.
    temp = result === "무승부" ? "무승부" : result === "이겼음" ? "졌다" : "이겼음"
  }
  return (
    <div className='block'>
        <div>{name}</div>
        {/* react에서 이미지 import 해오는 방법*/}
        {/* 리액트에서 가장 많이 사용하는 조건부 렌더링 값이 있으면 값을 사용해라라는 구문*/}
        {/* 값이 없으면 페이지가 터지기 때문에 */}
        <img src={data && data.img} alt="" />
        <div>{temp}</div>
    </div>
  )
}

export default Block
import img01 from "./가위.jpg";
import img02 from "./바위.jpg";
import img03 from "./보.jpg"

// 다수 내보낼때

export{img01,img02,img03};
import {useState,useEffect} from "react"
import Block from './components/Block'
import './App.css';
import { img01,img02,img03} from "./img"
// 추억의 자바스크립트
// 가위바위보
// 플레이어 하나 컴퓨터 하나
// 컴포넌트로 만들고
// 컴퓨터는 랜덤 가위 바위 보 중에 하나를 내고
// 플레이어는 선택할수 있게
// 
// 플레이어 컴퓨터
// 가위      가위 = 무승부
// 가위      바위 = 패
// 가위       보  = 승
// 바위      바위 = 무승부
// 바위      가위 = 승
// 바위       보  = 패
// 보         보  = 무승부
// 보        가위 = 패
// 보        바위 = 승
function App() {

  // 컴퓨터와 유저가 사용할 가위 바위 보의 객체를 하나 만들어주자
  // 선택 값을 담아 놓을 객체
  const scissors = "가위";
  const rock = "바위";
  const paper = "보";

  // 선택값을 다루고 있어
  // select객체 안에 데이터가 다 들어있으면
  // select 동작을 하는 프로그램을 작성할때 
  // select 객체안에 있는 값은 전부 select 동작을 하기위해 만든것이라고 알수있음

  // select 컴퓨터와 유저가 가위 바위 보를 냈을때 필요한 데이터들을 모아둘 객체
  const select = {
    scissors :{
      name : "가위",
      img : img01
    },
    rock : {
      name : "바위",
      img:img02
    },
    paper : {
      name : "보",
      img : img03
  }
  }

  // 유저가 선택한 데이터 값은 주시하자 선택하면 데이터 바뀐상태로 다시 그려줘야 하기 때문에 
  // 유저의 선택 useState
  const [userSelect, setUserSelect] = useState(null);
  // 컴퓨터의 선택 값을 담을 useState
  const [comSelect, setComSelect] = useState(null);
  // 승패 결과를 담을 useState
  const [result, setResult] = useState(null);

  function userClick(_select){
    // _select == "scissors"
    // select['scissors']
    // _select == "rock"
    // select["rock"]
    // 선택한 객체를 상태변수에 담아주자
    setUserSelect(select[_select]);

    // 컴퓨터는 랜덤으로 선택을 시켜야하는데 
    // 플레이어 선택 이후에 컴퓨터도 랜덤한 값을 가지고 가위 바위 보를 선택 시키자.
    let arr = Object.keys(select);
    // 객체의 키값만 뽑아서 배열로 반환 해준다.
    // Object.keys
    console.log(arr);
    // 소수점 제외시키고 랜덤한 정수값 0~2
    let comRandom = Math.floor(Math.random() * 3);

    // comRandom 랜덤한 값이고 0~2
    // arr = ['scissors', 'rock' , 'paper']
    // arr[comRandom] = 'scissors','rock','paper'
    setComSelect(select[arr[comRandom]]);

    let player = select[_select];
    let computer = select[arr[comRandom]];
    if(player.name === computer.name){
      // 처음에 무승부 거르고 
      setResult("무승부")
    }else if(player.name == "가위"){
      let result = computer.name == "보" ? "이겼음" : "졌다"
      setResult(result);
    }else if(player.name == "바위"){
      let result = computer.name == "가위" ? "이겼음" : "졌다"
      setResult(result);
    }
    else if(player.name == "보"){
      let result = computer.name == "바위" ? "이겼음" : "졌다"
      setResult(result);
    }
  }

  useEffect(()=>{
    console.log(userSelect);
  },[userSelect])

  return (
    <>
    <div className='App'>
    <Block data={userSelect} name={"유저"} result={result}/>
    <Block data={comSelect} name={"컴퓨터"} result={result}/>
    </div>
    <div>
      {/*버튼은 여기에*/}
      <button onClick={()=>{userClick("scissors")}}>가위</button>
      <button onClick={()=>{userClick("rock")}}>바위</button>
      <button onClick={()=>{userClick("paper")}}>보</button>
      
    </div>
    </>
  );
}

export default App;

'react' 카테고리의 다른 글

리액트 지뢰임의의 자리에 3곳 배치  (0) 2023.07.07
react todolist  (0) 2023.07.06
react를 활용한 달력 만들기  (0) 2023.07.04
React 초기 세팅 과정  (0) 2023.07.03
로그인 로그아웃(리액트 구현 웹 페이지)  (0) 2023.06.29