🧑‍💻복습/자바

자바 프로그래밍 ex04_과제02_test02 과제풀기 (가위/바위/보 게임)

우동한그릇 2023. 5. 30. 19:49
반응형

[지난 과제] 반복문 복습

https://dev-with-gpt.tistory.com/90

 

자바 프로그래밍 ex04_과제02_test01 과제풀기 (사칙연산 계산기 앱)

[지난 과제] 배열 복습 https://dev-with-gpt.tistory.com/81 자바 프로그래밍 ex04_과제01_test02 과제풀기 (배열) # 과제 ex04_01 사용자로부터 5명의 성적 데이터를 (이름, 국어, 영어, 수학) 입력 받고 합계와 평

dev-with-gpt.tistory.com

 

 

[기존코드 주목해야할 부분]

이번 과제는 가위 바위 보 게임이지만, 난이도가 쉬운 코드로 이루어진 것이,

가위/바위/보 모두 비기거나 지는 경우에는 통틀어서 출력해준다..

기존에는 1. 이기는 경우 2. 지는 경우 3. 비기는 경우. 3가지 경우에 가위/바위/보 3가지 행동이 있어서

3X3 = 9가지 경우를 코딩해야했으나 각 이기는 경우 외에 모든 경우를  비기거나 지는 경우로 만들면

4가지 경우의 수만 코딩을 하면 되기 때문이다. 

 

그러면 사용자는 가위,바위,보를 입력하는 값에 따라 문자열을 변환해주고

컴퓨터는 랜덤 함수를 0,1,2로 주고 각 값에 따라 가위,바위,보를 주면된다.

그러면 IF문에서는 사용자가 이기는 경우를 IF문으로 3가지를 따지고,

나머지의 모든 경우는 Else 로 한 가지의 경우로 나오게 될 수 있다.

 

[기존코드]

 

1. Class 파일 패키지 경로 설정과 Scanner import

package bitcamp.assignment2;
import java.util.Scanner;

2. 사용자로부터 출력할 값을 문자열로 입력받고 다시 출력해주기

public class Test02 {
  public static void main(String[] args) {
    // 컴퓨터의 가위, 바위, 보 계산하기
    Scanner keyScan = new Scanner(System.in);
    
    System.out.print("가위,바위,보? ");
    String user = keyScan.nextLine();
    System.out.printf("사용자: %s\n", user);

3. random 을 통해서  0,1,2 각각의 값에 따라 computer 문자열에  "가위","바위","보" 입력

 

여기서 int random = (int)(Math.random() * 3); 는 매우 중요하다.

Math.random()은 0 이상 1 미만의 난수를 생성하는 메소드이다. (0 <= 난수 < 1)
이 난수에 3을 곱하면 0 이상 3 미만의 실수가 된다. (0 <= 실수 < 3)


(int)를 사용하여 실수를 정수로 변환하면 소수점 이하의 값을 버리고 정수 부분만 남게 된다.
따라서 random 변수에는 0, 1, 2 중 하나의 정수가 저장된다.


즉, 위 코드는 0, 1, 2 중 하나의 정수를 랜덤하게 얻는 것을 목적으로 한다.

 

자 그러면 여기서 혼자만의 첫 번째 의문이 생긴다. 난수를 생성하고

굳이 실수 값을 만든다음 int를 통하여 정수를 얻어내야할까.. ?

 

    int random = (int)(Math.random() * 3);
    String computer;
    if (random == 0) 
      computer = "가위";
    else if (random == 1) 
      computer = "바위";
    else 
      computer = "보";
    
    System.out.printf("컴퓨터: %s\n", computer);

4. 사용자가 입력한 값과 컴퓨터의 값을 비교하여 이기는 경우를 출력

여기서도 두 번째 의문이 생긴다. 

굳이 else if 를 사용하는 이유가 있는 지에 대한 의문이다.

 

왜냐하면 사용자가 가위를 내는 상황에서 else if 로 그 상황 안에서 비기거나 지는 경우를 비교한다면 옳지만

굳이 사용자가 다른 것을 내는 상황에서 else if 를 사용 할 이유가 없다고 생각한다.

 

    if (user.equals("가위")) {
      if (computer.equals("보")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      }
    } else if (user.equals("바위")) {
      if (computer.equals("가위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      }
    } else {
      if (computer.equals("바위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      }
    }
    
    System.out.println("=> 당신은 비기거나 졌습니다.");
    
    keyScan.close();
  }
}

 

[기존결과]


의문점 및 해결방안

 

나의 의문점은 총 3가지이다.    

 

1. int random = (int)(Math.random() * 3); 을 랜덤 함수를 통해 바꿔보기

2. else if 코드를 수정하여  하나는 if문 코드로 출력하는 것

3. else if 를 활용하여 모든 경우의 수를 출력해보기

 

 

첫번째 해결 (int random = (int)(Math.random() * 3); 을 랜덤 함수를 통해 바꿔보기)

 

정수의 난수값이 생선된다. 이 경우 Class 를 import 하는 것으로 해결한 방법이다.

import java.util.Random;
        Random random = new Random();
        int randomNumber = random.nextInt(3); // 0 이상 3 미만의 정수 반환

 

두번째 해결 else if 코드를 수정하여   if문 코드로 출력 

 

이 코드는 else if 를 없애고 if문 만으로 출력한 것이다.

    if (user.equals("가위")) {
      if (computer.equals("보")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      }
    } 
    if (user.equals("바위")) {
      if (computer.equals("가위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      }
    } 
    if (computer.equals("바위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      }

 

세번째 해결 else if 코드를 수정하여  가위바위보 모든 경우의 수 출력

 

이렇게 수정해주면 else if 를 통해서  하나의 수 (가위/바위/보)마다

하나의 수(이기는경우/비기는 경우/지는 경우)를 출력해서 모든 경우를 출력할 수 있다.

    if (user.equals("가위")) {
      if (computer.equals("보")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      } else if (computer.equals("바위")) {
        System.out.println("=> 당신이 졌습니다.");
        return;
      } else {
        System.out.println("=> 비겼습니다.");
        return;
      }
    } 
    if (user.equals("바위")) {
      if (computer.equals("가위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      } else if (computer.equals("보")) {
        System.out.println("=> 당신이 졌습니다.");
        return;
      } else {
        System.out.println("=> 비겼습니다.");
        return;
      }
    } 
    if (user.equals("보")) {
      if (computer.equals("바위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      } else if (computer.equals("가위")) {
        System.out.println("=> 당신이 졌습니다.");
        return;
      } else {
        System.out.println("=> 비겼습니다.");
        return;
      }
    }

 

 

모든 경우의 수를 출력하는 가위바위보 게임 생성

사실 내가 이렇게 하는 방법보다 기존의 방법이 다수가 더 선호하는 올바른 코딩 방식이라면

내가 그 방식에 맞추는 것이 맞다고 생각한다. 아직은 배우는 과정에서 혼자 여러가지 방식을 시도하고

효율적인 방법을 추구하다보면서 차츰 모든 사람들이 추구하는 방향에 스스로 다가가는 것도 큰 도움이되지 않을까 싶다.

package bitcamp.assignment2;
import java.util.Scanner;
import java.util.Random;

public class ag_2_Test02 {
  public static void main(String[] args) {
    // 컴퓨터의 가위, 바위, 보 계산하기
    Scanner keyScan = new Scanner(System.in);
    
    System.out.print("가위,바위,보? ");
    String user = keyScan.nextLine();
    System.out.printf("사용자: %s\n", user);


    Random random = new Random();
    int randomNumber = random.nextInt(3); // 0 이상 3 미만의 정수 반환

    String computer;
    if (randomNumber == 0) 
      computer = "가위";
    else if (randomNumber == 1) 
      computer = "바위";
    else 
      computer = "보";
    
    System.out.printf("컴퓨터: %s\n", computer);
    
    if (user.equals("가위")) {
      if (computer.equals("보")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      } else if (computer.equals("바위")) {
        System.out.println("=> 당신이 졌습니다.");
        return;
      } else {
        System.out.println("=> 비겼습니다.");
        return;
      }
    } 
    if (user.equals("바위")) {
      if (computer.equals("가위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      } else if (computer.equals("보")) {
        System.out.println("=> 당신이 졌습니다.");
        return;
      } else {
        System.out.println("=> 비겼습니다.");
        return;
      }
    } 
    if (user.equals("보")) {
      if (computer.equals("바위")) {
        System.out.println("=> 당신이 이겼습니다.");
        return;
      } else if (computer.equals("가위")) {
        System.out.println("=> 당신이 졌습니다.");
        return;
      } else {
        System.out.println("=> 비겼습니다.");
        return;
      }
    }
    
    
    keyScan.close();
  }
}

 

[해결결과]

반응형