✌️ ✊ ✋ java 가위바위보 게임

코등어·2024년 12월 6일
0

사전캠프

목록 보기
18/19

요구사항

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

1. 5번의 가위바위보를 진행합니다.
2. 유저는 매 판마다 “가위”, “바위”, “보” 중 하나를 입력합니다.

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

    1. 스파르테이트 항공권 -> 5연승
    2. 호텔 스파 숙박권 -> 4연승
    3. 아테네 캐니언 항공 투어권 -> 3연승
    4. 스파랜드 입장권 -> 2연승
    5. 곰돌이 인형 -> 1승
    6. 꽝 -> 0승

    해결과정

    필자의 생각

    게임이 5회만 하도록 설정되었으니까 for문으로 5회만 돌도록 또는 while문으로 round를 관리하는 변수를 이용하여 게임이 돌아갈 수 있도록 해야겠다고 생각했다. 이번에는 for문을 사용하기로 했다.

    경품

    일단 승리 수 마다 지급되는 경품을 먼저 처리하려고 한다.
    이때 필요한 자료형으로 Map, List, Array 정도를 이용할 수 있을 것이라 생각했다.
    필자는 경품을 추가하지 않고 데이터가 단순하다고 생각하여 그냥 Map에다가 연승 수를 매핑하기로 하였다.

      Map<Integer, String> gifts = new HashMap<>();
            gifts.put(0, "꽝");
            gifts.put(1, "곰돌이 인형");
            gifts.put(2, "스파랜드 입장권");
            gifts.put(3, "아테네 캐니언 항공 투어권");
            gifts.put(4, "호텔 스파 숙박권");
            gifts.put(5, "스파르테이트 항공권");

    이렇게 해서 승리한 수 만큼 gifts.get(key) 메서드를 사용하여 경품을 가져오기로 생각했다.

    컴퓨터가 내는 가위바위보

    컴퓨터가 가위, 바위, 보중에서 1개를 랜덤으로 가져오게 하기위해서
    가위, 바위, 보를 담을 배열rsp을 선언하고 Random클래스를 불러와 배열의 길이를 범위의 숫자를 담은 Random int형 변수 index를 선언한 후 rsp배열의 인덱스로 넣어주면 될 것 같다.
    이것을 String rspStr로 선언했다.

    String[] rsp = {"가위", "바위", "보"};
    Random random = new Random();
    int index = random.nextInt(rsp.length);
    String rspStr = rsp[index];

    플레이어 입력과 연승

    플레이어가 가위, 바위, 보중에서 하나를 입력 할 수 있도록 Scanner클래스를 불러오고 nextLine()메서드를 통해 문자열을 입력받을 수 있도록 했다. 그리고 플레이어가 입력한 값이 올바른지 확인하기 위한 검증 로직도 포함시켰다. 딱히 좋은 생각이 나지 않아서 무식하게 조건문에다 모든 조건을 때려넣었다.
    그리고 승리한 횟수를 체크할 변수도 하나 선언했다.

    Scanner sc = new Scanner(System.in);
    int winCount = 0;
    System.out.println("가위 바위 보 중 하나를 입력하세요.");
    String input = sc.nextLine();
    
    if (!input.equals("바위") && !input.equals("가위") && !input.equals("보")) {
    	System.out.println("올바른 입력이 아닙니다.");
        continue;
    }
    

    라운드별 승패확인

    라운드별 승패 확인도 조건문 하나에 모두 집어넣었다. 핑계지만 로직이 복잡하지 않고 코드가 길지 않다고 생각하여 그랬다.
    아까 선언한rsp배열에서 Random하게 나온 String rspStr과 플레이어가 입력한 input값을 비교하여 값이 같을 땐 비김 다를 땐 조합별로 승리, 패배를 각각 조건을 주었다. 이때 승리를 할 때마다
    winCount를 하나씩 증가시켜 승리 한 횟수를 계산하도록 코드를 작성했다.

      if ((rspStr.equals("가위") && input.equals("바위")) ||
         (rspStr.equals("바위") && input.equals("보") ||
         (rspStr.equals("보") && input.equals("가위")))) {
         winCount++;
         System.out.println("승리 하셨습니다!");
         System.out.println("총 승리 횟수: " + winCount);
      } else if (rspStr.equals(input)) {
      	 System.out.println("아쉽습니다. 비겼습니다.");
      } else {
         System.out.println("패배하셨습니다.ㅜㅜ");
      }

    게임 결과

    for문안에서 게임이 다 돌아간 후 for문 바깥에다 게임 결과를 보여주기로 했다.

    String gift = gifts.getOrDefault(winCount, gifts.get(0));
    if (winCount > 0) {
    	System.out.println("축하합니다. 총 " + winCount + " 회 승리하여 [" + gift + "] 을 획득하셨습니다.");
    } else {
    	System.out.println("아쉽습니다. 0승을 하여 결과는 " + gifts.get(0) + "입니다.");
    }

    전체코드

    package sparta_test.level4;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    import java.util.Scanner;
    
    public class RockPaperScissorsGame {
        public static void main(String[] args) {
            Map<Integer, String> gifts = new HashMap<>();
            gifts.put(0, "꽝");
            gifts.put(1, "곰돌이 인형");
            gifts.put(2, "스파랜드 입장권");
            gifts.put(3, "아테네 캐니언 항공 투어권");
            gifts.put(4, "호텔 스파 숙박권");
            gifts.put(5, "스파르테이트 항공권");
    
            Random random = new Random();
            Scanner sc = new Scanner(System.in);
            String[] rsp = {"가위", "바위", "보"};
            int winCount = 0;
    
            for (int i = 0; i < 5; i++) {
                int index = random.nextInt(rsp.length);
                String rspStr = rsp[index];
    
                System.out.println(rspStr);
                System.out.println("가위 바위 보 중 하나를 입력하세요.");
                String input = sc.nextLine();
    
                if (!input.equals("바위") && !input.equals("가위") && !input.equals("보")) {
                    System.out.println("올바른 입력이 아닙니다.");
                    continue;
                }
    
                if ((rspStr.equals("가위") && input.equals("바위")) ||
                        (rspStr.equals("바위") && input.equals("보") ||
                                (rspStr.equals("보") && input.equals("가위")))) {
                    winCount++;
                    System.out.println("승리 하셨습니다!");
                    System.out.println("총 승리 횟수: " + winCount);
                } else if (rspStr.equals(input)) {
                    System.out.println("아쉽습니다. 비겼습니다.");
                } else {
                    System.out.println("패배하셨습니다.ㅜㅜ");
                }
            }
            String gift = gifts.getOrDefault(winCount, gifts.get(0));
            if (winCount > 0) {
                System.out.println("축하합니다. 총 " + winCount + " 회 승리하여 [" + gift + "] 을 획득하셨습니다.");
            } else {
                System.out.println("아쉽습니다. 0승을 하여 결과는 " + gifts.get(0) + "입니다.");
            }
        }
    }
    
    profile
    정형화되지 않은 날 것의 생각을 기록합니다.

    0개의 댓글