오늘은 문제가 술술 풀려서 나름 재밌었다.
가위바위보를 만들었던 게 2-3년전 이었던 거 같은데 이렇게 여러 조건, 함수를 주면서 푸니 더 색다른 거 같다.
보너스 문제: 가위 바위 보
5번의 가위바위보 게임을 해서 승리한 횟수 상당의 상품을 받아가는 게임을 만들어봐요
1. 5번의 가위바위보를 진행합니다.
2.유저는 매 판마다 “가위”, “바위”, “보” 중 하나를 입력합니다.
- 잘못된 입력을 받았다면 잘못된 입력입니다! 를 출력해주세요.
3.컴퓨터는 가위 , 바위, 보 중 랜덤하게 하나를 낼 수 있습니다.
4.매판마다 진행한 가위 바위 보의 승패에 대한 결과를 출력됩니다.
5.5판을 모두 마치면 승리한 횟수에 걸맞는 경품을 획득할 수 있습니다.
일단 조건들을 보아하니,
1. 잘못된 입력을 확인
2. 랜덤한 가위바위보 출력
3. 가위바위보 비교
위의 3가지가 필요하다는 걸 알 수 있다.
그리하여 3가지 함수틀을 잡고 접근할 것이다.
1. ArrayList 를 선언
static ArrayList<String> listRCP = new ArrayList<>() {{
add("가위");
add("바위");
add("보"); }};
- 자주 쓸 거 같은 배열이니 따로 선언해두었다.
2. 잘못된 입력 확인하기.
public boolean checkText(String text, ArrayList<String> listRCP){
if (listRCP.contains(text.trim())) {
System.out.println("정상적인 단어를 입력하셨습니다.");
return true;
}
else {
System.out.println("잘못된 입력입니다!");
return false;}
}
- 혹시, 입력값에 공백이 껴있을 수 있기 때문에 해당 부분을 제거하고 정상입력인지 아닌지 확인하였다.
- 위에서 이미 가위,바위,보를 선언했기 때문에 arraylist.contains() 함수를 통해 true or false형태로 반환하게끔 코딩했다.
3. 랜덤한 가위바위보 출력
// 랜덤한 가위바위보 내는 함수
public String randomRSP(){
Random random = new Random();
return listRCP.get(random.nextInt(listRCP.size()));
}
- 컴퓨터가 자동으로 가위, 바위, 보 중 하나를 출력하게끔 함수를 만들었다.
4. 가위바위보 비교하기
public int compareText(String user, String auto) {
// 1 : 유저가 승리, 2 : 유저가 패배, 3. 유저와 무승부
if (user.equals("가위")) {
if (auto.equals("가위")) {return 3;}
else if (auto.equals("바위")) {return 2;}
else {return 1;}
}
else if (user.equals("바위")) {
if (auto.equals("가위")) {return 1;}
else if (auto.equals("바위")) {return 3;}
else {return 2;}
}
else { // 보인 경우임.
if (auto.equals("가위")) { return 2;}
else if (auto.equals("바위")) {return 1;}
else {return 3;}
}
}
- 여기서 내가 한 가지 실수 했던 부분이 있는데, Java에서는 equals()
로 문자열을 비교한다는 것이다. 가위바위보의 9가지 경우를 잘 설정해두었다.
- 승리여부를 숫자로 받아 int로 함수를 선언했다.
5. 메인 함수
1) 먼저 스캐너를 불러주고, 객체 인스턴스, countWin 변수를 선언해주었다.
Scanner scanner = new Scanner(System.in);
Problem04 prob = new Problem04();
int countWin = 0;
2) for문 생성
- while문 할까 했는데. 그냥 for문으로 5회만 돌리기로 했다. 딱히 복잡한 조건이 없어서 for문을 선택했다.
for (int i=0; i<5; i++){
System.out.println("*****************");
System.out.printf("%d 번째 판입니다.",i+1);
System.out.println("가위 바위 보 중 하나를 입력해주세요.");
String userText = scanner.nextLine().trim();
String randomText = prob.randomRSP();
- 첫부분에서는 간단히 사용자의 입력을 받는 userText와 랜덤한 가위바위보를 만드는 randomText를 선언했다.
// userText가 먼저 괜찮은지 ?괜찮은 경우에만 비교 시작.
if (prob.checkText(userText,listRCP)){
- 이중 if문을 쓸건데, 여기서는 먼저 userText가 제대로 값인지 확인하고. 괜찮을 경우에만 비교함수를 사용할 것이다.
// 비교하는 함수 가져오기.
int compareInt = prob.compareText(userText,randomText);
if (compareInt == 1) {
System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
System.out.println("당신이 승리하셨습니다.");
countWin ++;
}
else if (compareInt == 2){
System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
System.out.println("당신이 패배하셨습니다.");
}
else {
System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
System.out.println("서로 비기셨습니다.");
}
}
}
System.out.println("***********************");
System.out.println("게임이 종료되었습니다. ");
System.out.printf("총 이기신 횟수는 %d 입니다. \n", countWin);
- 그 이후에는 compare함수에 userText와 randomText를 넣어, compareInt(승리,패배,무승부가 담긴 숫자)를 얻어낸다.
- compareInt를 통해서 승리, 패배, 비김을 if 문을 통해 나누어주고, 승리일 경우에만 countWin을 더해준다.
3) 마지막으로는 이긴 횟수를 알려주고, 이긴횟수에 따라 상품을 출력해준다.
System.out.println("***********************");
System.out.println("게임이 종료되었습니다. ");
System.out.printf("총 이기신 횟수는 %d 입니다. \n", countWin);
// 상금 주기
switch (countWin) {
case 5:
System.out.println("상품은 [ 스파르테이트 항공권 ] 입니다.");
break;
case 4:
System.out.println("상품은 [ 호텔 스파르타 숙박권 ] 입니다.");
break;
case 3:
System.out.println("상품은 [ 스파르타 캐니언 항공 투어권 ] 입니다.");
break;
case 2:
System.out.println("상품은 [ 스파르타 랜드 입장권 ] 입니다.");
break;
case 1:
System.out.println("상품은 [ 곰돌이 인형 ] 입니다.");
break;
default:
System.out.println("상품이 꽝입니다. ");
break;
}
5. 전체 코드
import java.util.*;
public class Problem04 {
static ArrayList<String> listRCP = new ArrayList<>() {{
add("가위");
add("바위");
add("보"); }};
// 잘못된 입력 확인하는 함수.
public boolean checkText(String text, ArrayList<String> listRCP){
if (listRCP.contains(text.trim())) {
System.out.println("정상적인 단어를 입력하셨습니다.");
return true;
}
else {
System.out.println("잘못된 입력입니다!");
return false;}
}
// 가위바위보 비교해주는 함수
public int compareText(String user, String auto) {
// 1 : 유저가 승리, 2 : 유저가 패배, 3. 유저와 무승부
if (user.equals("가위")) {
if (auto.equals("가위")) {return 3;}
else if (auto.equals("바위")) {return 2;}
else {return 1;}
}
else if (user.equals("바위")) {
if (auto.equals("가위")) {return 1;}
else if (auto.equals("바위")) {return 3;}
else {return 2;}
}
else { // 보인 경우임.
if (auto.equals("가위")) { return 2;}
else if (auto.equals("바위")) {return 1;}
else {return 3;}
}
}
// 랜덤한 가위바위보 내는 함수
public String randomRSP(){
Random random = new Random();
return listRCP.get(random.nextInt(listRCP.size()));
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Problem04 prob = new Problem04();
int countWin = 0;
for (int i=0; i<5; i++){
System.out.println("*****************");
System.out.printf("%d 번째 판입니다.",i+1);
System.out.println("가위 바위 보 중 하나를 입력해주세요.");
String userText = scanner.nextLine().trim();
String randomText = prob.randomRSP();
// userText가 먼저 괜찮은지 ?괜찮은 경우에만 비교 시작.
if (prob.checkText(userText,listRCP)){
// 비교하는 함수 가져오기.
int compareInt = prob.compareText(userText,randomText);
if (compareInt == 1) {
System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
System.out.println("당신이 승리하셨습니다.");
countWin ++;
}
else if (compareInt == 2){
System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
System.out.println("당신이 패배하셨습니다.");
}
else {
System.out.printf("당신의 [ %s ] 그리고 상대는 [ %s ] 으로 ",userText,randomText);
System.out.println("서로 비기셨습니다.");
}
}
}
System.out.println("***********************");
System.out.println("게임이 종료되었습니다. ");
System.out.printf("총 이기신 횟수는 %d회 입니다. \n", countWin);
// 상금 주기
switch (countWin) {
case 5:
System.out.println("상품은 [ 스파르테이트 항공권 ] 입니다.");
break;
case 4:
System.out.println("상품은 [ 호텔 스파르타 숙박권 ] 입니다.");
break;
case 3:
System.out.println("상품은 [ 스파르타 캐니언 항공 투어권 ] 입니다.");
break;
case 2:
System.out.println("상품은 [ 스파르타 랜드 입장권 ] 입니다.");
break;
case 1:
System.out.println("상품은 [ 곰돌이 인형 ] 입니다.");
break;
default:
System.out.println("상품이 꽝입니다. ");
break;
}
}
}
6. 출력문
*****************
1 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
바위
정상적인 단어를 입력하셨습니다.
당신의 [ 바위 ] 그리고 상대는 [ 가위 ] 으로 당신이 승리하셨습니다.
*****************
2 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
보
정상적인 단어를 입력하셨습니다.
당신의 [ 보 ] 그리고 상대는 [ 보 ] 으로 서로 비기셨습니다.
*****************
3 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
가위
정상적인 단어를 입력하셨습니다.
당신의 [ 가위 ] 그리고 상대는 [ 보 ] 으로 당신이 승리하셨습니다.
*****************
4 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
바위
정상적인 단어를 입력하셨습니다.
당신의 [ 바위 ] 그리고 상대는 [ 바위 ] 으로 서로 비기셨습니다.
*****************
5 번째 판입니다.가위 바위 보 중 하나를 입력해주세요.
보
정상적인 단어를 입력하셨습니다.
당신의 [ 보 ] 그리고 상대는 [ 바위 ] 으로 당신이 승리하셨습니다.
***********************
게임이 종료되었습니다.
총 이기신 횟수는 3회 입니다.
상품은 [ 스파르타 캐니언 항공 투어권 ] 입니다.
Process finished with exit code 0
'백엔드 부트캠프[사전캠프] > 문제풀이' 카테고리의 다른 글
[SQL 달리기반 레벨 3] 💳 이용자의 포인트 조회하기 (0) | 2025.01.31 |
---|---|
[SQL 달리기반 레벨 2] 📆 날짜별 획득포인트 조회하기 (0) | 2025.01.31 |
[내일배움캠프-사전캠프 문제풀이] JAVA 응용문제 3 (2) | 2025.01.23 |
[내일배움캠프-사전캠프 문제풀이] JAVA 응용문제 1, 2 (1) | 2025.01.22 |
[내일배움캠프-사전캠프] JAVA 걷기반 (1) | 2025.01.21 |