[지난 과제] 반복문 복습
https://dev-with-gpt.tistory.com/90
[기존코드 주목해야할 부분]
이번 과제는 가위 바위 보 게임이지만, 난이도가 쉬운 코드로 이루어진 것이,
가위/바위/보 모두 비기거나 지는 경우에는 통틀어서 출력해준다..
기존에는 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();
}
}
[해결결과]