이지은님의 블로그
[JAVA] 달리기반 퀘스트 - 보너스 문제: 가위 바위 보 본문
5번의 가위바위보 게임을 해서 승리한 횟수 상당의 상품을 받아가는 게임을 만들어봐요
- 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();
}
}
'사전캠프 퀘스트' 카테고리의 다른 글
[JAVA] 달리기반 퀘스트 - Lv3. 단어 맞추기 게임 (0) | 2024.12.18 |
---|---|
[JAVA] 달리기반 퀘스트 - Lv2. 스파르타 자판기 (0) | 2024.12.17 |
[JAVA] 달리기반 퀘스트 - Lv1. 랜덤 닉네임 생성기 (0) | 2024.12.06 |
[JAVA] 걷기반 퀘스트 (0) | 2024.12.06 |
달리기반 퀘스트 - Lv5. 예산이 가장 큰 프로젝트는? (0) | 2024.12.02 |