Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

이지은님의 블로그

[JAVA] 달리기반 퀘스트 - 보너스 문제: 가위 바위 보 본문

사전캠프 퀘스트

[JAVA] 달리기반 퀘스트 - 보너스 문제: 가위 바위 보

queenriwon3 2024. 12. 18. 17:55

5번의 가위바위보 게임을 해서 승리한 횟수 상당의 상품을 받아가는 게임을 만들어봐요

  1. 5번의 가위바위보를 진행합니다.
  2. 유저는 매 판마다 “가위”, “바위”, “보” 중 하나를 입력합니다.
    • 잘못된 입력을 받았다면 잘못된 입력입니다! 를 출력해주세요.
  3. 컴퓨터는 가위 , 바위, 보 중 랜덤하게 하나를 낼 수 있습니다.
  4. 매판마다 진행한 가위 바위 보의 승패에 대한 결과를 출력됩니다.
  5. 5판을 모두 마치면 승리한 횟수에 걸맞는 경품을 획득할 수 있습니다.

 

 

 구현과정 1 : 생성자 + 초기화, 사용할 변수 

private int count;
private int countLimit = 5;
private String [] rsp = {"가위","바위","보"};
private int winCount;
Map<Integer, String> gifts = new HashMap<>();

public RSPaper() {
    count = 0;
    winCount = 0;
    gifts.put(0, "꽝");
    gifts.put(1, "곰돌이 인형");
    gifts.put(2, "스파르타 랜드 입장권");
    gifts.put(3, "스파르타 캐니언 항공 투어권");
    gifts.put(4, "호텔 스파르타 숙박권");
    gifts.put(5, "스파르테이트 항공권");
}

사용할 변수는 다음과 같다.

변수 사용 설명
int count 사용한 기회 0부터 시작
int countLimit 사용할 수 있는 기회 고정된 수(final로 사용할 수 있음)
String [] rsp 가위 바위 보 문자열이 들어있는 배열 사용자가 응답할 수 있는 범위
int winCount 이긴 횟수 경품을 얻을 수 있는 기준
Map<Integer, String> gifts 경품 키: 이긴횟수, 값: 경품 이긴 횟수를 기준으로 경품을 뽑을 수 있음

생성자에 값들을 모두 초기화 한다. count는 0, winCount는 0, 그리고 맵에 경품을 넣어 둔다.

 

 

 

 구현과정 2 : 입력과 입력값 판단

System.out.println("가위 바위 보 중 하나를 입력해주세요.");
String ans = sc.nextLine();
int you = userAns(ans);
int com = comAns();
if(you == -1){
    System.out.println("잘못된 입력입니다.");
    continue;
}

사용자에게 가위바위보 문자열을 입력하게 한다. 가위 바위 보 문자열인지 아닌지는 userAns에서 판단하도록 한다.

public int userAns(String ans){
    for (int i = 0; i<rsp.length;i++){
        if(rsp[i].equals(ans)) return i;
    }
    return -1;
}

public int comAns(){
    int rans = (int) (Math.random()*rsp.length);
    return rans;
}

userAns()에서는 입력한 문자열이 가위바위보 배열에서 인덱스를 추출하도록 한다.

만약 유저가 가위를 입력했으면 0, 바위를 입력했다면 1, 보를 입력했다면 2를 반환하고, 가위 바위 보에서 해당되는 게 없다면 -1를 반환하게 해서 잘못된 입력임을 출력하도록 한다.

그리고 comAns()에서는 컴퓨터가 가위바위보 중 무엇을 내는지 랜덤 값으로 0, 1, 2중 반환하게 한다.

 

 

 구현과정 3 : 컴퓨터와 사용자의 결과 비교

System.out.print("당신은 \"" + rsp[you] + "\" 그리고 상대는 \"" + rsp[com] + "\"으로 ");

if (you == com) {
    System.out.println("서로 비겼습니다!");
} else if ((you == 0 && com== 2) ||
            (you == 1 && com == 0) ||
            (you == 2 && com == 1)) { 
    System.out.println("당신이 이겼습니다!");
    winCount++;
} else {
    System.out.println("상대가 이겼습니다!");
}
count++;

문자열끼리 비교하는 것보다는 인덱스로 비교하는 것이 코드 짜기에 훨씬 편하다. you는 사용자 가위바위보의 인덱스, com은 상대의 가위바위보 인덱스이다.(0은 가위, 1은 바위, 2는 보) 조건문을 통해 비겼거나, 이겼거나, 졌거나를 판단할 수 있다. 이때 이겼다면 winCount를 1증가 시킨다.

가위바위보 승부 판단이 끝나면 count를 1증가 시킨다.

 

 

 구현과정 4 : 결과 확인 및 경품 획득

if((countLimit-count)==0){
    System.out.println("축하합니다! 총 " + winCount + " 회 승리하여 경품으로 [" + gifts.get(winCount) + "] 을 획득하셨습니다!");
    break;
}

총 5번의 기회를 모두 사용하면 승리한 횟수를 바탕으로 map에서 키를 이용해 값을 얻는다. 이후 게임이 끝나 break로 반복문을 빠져나온다.

 

 

 

전체코드

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class RSPaper{
    private int count;
    private int countLimit = 5;
    private String [] rsp = {"가위","바위","보"};
    private int winCount;
    Map<Integer, String> gifts = new HashMap<>();

    public RSPaper() {
        count = 0;
        winCount = 0;
        gifts.put(0, "꽝");
        gifts.put(1, "곰돌이 인형");
        gifts.put(2, "스파르타 랜드 입장권");
        gifts.put(3, "스파르타 캐니언 항공 투어권");
        gifts.put(4, "호텔 스파르타 숙박권");
        gifts.put(5, "스파르테이트 항공권");
    }
    
    public int userAns(String ans){
        for (int i = 0; i<rsp.length;i++){
            if(rsp[i].equals(ans)) return i;
        }
        return -1;
    }

    public int comAns(){
        int rans = (int) (Math.random()*rsp.length);
        return rans;
    }


    public void run(){
        Scanner sc = new Scanner(System.in);
        System.out.println("*** 가위바위보 게임을 시작합니다 ***");
        while (true) {
            try{
                System.out.println("가위 바위 보 중 하나를 입력해주세요.");
                String ans = sc.nextLine();
                int you = userAns(ans);
                int com = comAns();
                if(you == -1){
                    System.out.println("잘못된 입력입니다.");
                    continue;
                } else{
                    System.out.print("당신은 \"" + rsp[you] + "\" 그리고 상대는 \"" + rsp[com] + "\"으로 ");

                    if (you == com) {
                        System.out.println("서로 비겼습니다!");
                    } else if ((you == 0 && com== 2) ||
                                (you == 1 && com == 0) ||
                                (you == 2 && com == 1)) { 
                        System.out.println("당신이 이겼습니다!");
                        winCount++;
                    } else {
                        System.out.println("상대가 이겼습니다!");
                    }
                    count++;
                }

                if((countLimit-count)==0){
                    System.out.println("축하합니다! 총 " + winCount + " 회 승리하여 경품으로 [" + gifts.get(winCount) + "] 을 획득하셨습니다!");
                    break;
                }
            } catch(Exception e){
                System.out.println("[안내] 잘못된 입력입니다. 가위 바위 보 중 하나를 입력해주세요.");
                sc.nextLine();
                continue;
            }
        }
        sc.close();
    }
}

public class run_4 {
    public static void main(String[] args) {
        RSPaper game = new RSPaper();
        game.run();
    }
}