[내일배움캠프 사전캠프] 달리기반 Day6/Day7/Day8 퀘스트

맹돌이·2026년 8월 31일

사전캠프

목록 보기
10/11

가위바위보 게임 만들기

1.Lv1

package Java_preCourse.Day6.Lv1;

import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Random random = new Random();
        String[] opp_choice = {"가위","바위","보"};
        String my_choice = " ";
        while(true){
            String answer = opp_choice[random.nextInt(opp_choice.length)];
            System.out.print("가위/바위/보 중 하나를 입력하시오(그만두려면 exit를 입력) : ");
            my_choice = sc.next();
            sc.nextLine();
            if(my_choice.equals("exit")) {
                System.out.println("프로그램을 종료합니다");
                break;
            }
            if (!my_choice.equals("가위") && !my_choice.equals("바위") && !my_choice.equals("보")){
                System.out.println("가위 바위 보 중 하나만 입력할 수 있습니다");
            }
            else{
                System.out.println("컴퓨터-"+answer+" vs "+my_choice+"-플레이어");
                if(answer.equals(my_choice)){
                    System.out.println("비겼다!");
                }
                else if((answer.equals("가위")&&my_choice.equals("바위"))
                        ||(answer.equals("바위")&&my_choice.equals("보"))
                        ||(answer.equals("보")&&my_choice.equals("가위"))){
                    System.out.println("이겼다!");
                }
                else {
                    System.out.println("졌다");
                }
            }
        }


    }
}
  1. Lv2

Main.java

package Java_preCourse.Day6.Lv2;

import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        GameManager gm = new GameManager();
        gm.start();
        while (true) {
            String choice = gm.choice();
            if(choice.equals("exit")){
                System.out.println("프로그램을 종료합니다");
                break;
            }
            if (!gm.check(choice)) {
                continue;
            }

            gm.play(choice);
        }
        gm.printResult();

    }
}

GameManager.java

package Java_preCourse.Day6.Lv2;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class GameManager {
    private ArrayList<String> gameResults = new ArrayList<>();
    String[] result = {"승","패","무"};
    String[] opp_list = {"가위","바위","보"};
    Random random = new Random();
    Scanner sc = new Scanner(System.in);


    public void start(){
        System.out.println("가위 바위 보 게임을 시작합니다");
        System.out.println("가위/바위/보 중 하나만 입력해야하며");
        System.out.println("프로그램을 종료하고싶으면 exit를 입력하시오");
    }

    public String choice(){
        System.out.print("가위 바위 보 중에 입력하시오:");
        String my_choice = sc.next();
        return my_choice;
    }

    public boolean check(String my_choice){

        if(!my_choice.equals("가위") && !my_choice.equals("바위") && !my_choice.equals("보")){
            System.out.println("가위 바위 보 중에 입력해주세요");
            return false;
        }
        return true;
    }

    public String play(String player_Choice){
        String computer_Choice = opp_list[random.nextInt(3)];
        System.out.println("컴퓨터가 "+computer_Choice+"을(를) 냈습니다");
        if(computer_Choice.equals(player_Choice)){
            gameResults.add(result[2]);
            removeOldest();
            return result[2];
        }
        else if((computer_Choice.equals("가위")&&player_Choice.equals("바위"))
            ||(computer_Choice.equals("바위")&& player_Choice.equals("보"))
        ||(computer_Choice.equals("보")&&player_Choice.equals("가위"))){
            gameResults.add(result[0]);
            removeOldest();
            return result[0];
        }
        else{
            gameResults.add(result[1]);
            removeOldest();
            return result[1];
        }
    }
    public void printResult(){
        System.out.println("최근 5경기 기록입니다.");
        for(String s : gameResults){
            System.out.print(s+" ");
        }
    }
    private void removeOldest(){
        if(!gameResults.isEmpty() && gameResults.size()>5){
            gameResults.remove(0);
        }
    }

}

getter와 setter를 만들어서 어디다가 쓸 수 있을까?
-> 배웠듯이 getter와 setter를 통해서 private으로 선언된 메서드나 클래스에 접근할 수 있음.
-> 명시적으로 구현은 가능하지만 사용해야 할 이유는 잘 모르겠다.

public ArrayList<String> getGameResults(){
        return gameResults;
    }

    public void setGameResults(ArrayList<String> gameResults){
        this.gameResults = gameResults;
    }

removeOldest 메서드가 너무 중복되어 사용되는 느낌이다
->

public String play(String player_Choice){
        String computer_Choice = opp_list[random.nextInt(3)];
        System.out.println("컴퓨터가 "+computer_Choice+"을(를) 냈습니다");
        String gameresult; //gameresult라는 문자열 변수를 선언
        if(computer_Choice.equals(player_Choice)){
            gameresult = result[2];
        }
        else if((computer_Choice.equals("가위")&&player_Choice.equals("바위"))
            ||(computer_Choice.equals("바위")&& player_Choice.equals("보"))
        ||(computer_Choice.equals("보")&&player_Choice.equals("가위"))){
            gameresult = result[0];
        }
        else{
            gameresult = result[1];
        }
        //각 조건문 마다 문자열을 저장해주고 마지막에 한 번에 처리
        gameResults.add(gameresult);
        removeOldest();
        return gameresult;
    }
  1. Lv3

RSP.java

package Java_preCourse.Day6.Lv3;

public class RSP {
    public enum rsp{
        가위,바위,보
    }
}

result.java

package Java_preCourse.Day6.Lv3;

public class result {
    public enum WLD{
        승,패,무
    }
}

allinfo.java

package Java_preCourse.Day6.Lv3;

public class allInfo {
    String player_choice;
    String cpu_choice;
    String result;
    int round;

    public void setPlayer_choice(String player_choice) {
        this.player_choice = player_choice;
    }

    public void setCpu_choice(String cpu_choice) {
        this.cpu_choice = cpu_choice;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public void setRound(int round) {
        this.round = round;
    }


    public String getPlayer_choice() {
        return player_choice;
    }

    public String getCpu_choice() {
        return cpu_choice;
    }

    public String getResult() {
        return result;
    }

    public int getRound() {
        return round;
    }
    public void printAll(){
        System.out.println("사용자 선택 : "+this.player_choice);
        System.out.println("컴퓨터 선택 : "+this.cpu_choice);
        System.out.println("결과 : "+this.result);
        System.out.println("판수 : "+this.round);
    }
}

gameManager.java

package Java_preCourse.Day6.Lv3;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class GameManager {

    Random random = new Random();
    Scanner sc = new Scanner(System.in);

    result.WLD[] WLD = result.WLD.values();
    RSP.rsp[] rsp = RSP.rsp.values();

    private ArrayList<allInfo> gameRecords = new ArrayList<>();

    int round = 1;

    public void start(){
        System.out.println("가위 바위 보 게임을 시작합니다");
        System.out.println("가위/바위/보 중 하나만 입력해야하며");
        System.out.println("프로그램을 종료하고싶으면 exit를 입력하시오");
    }

    public String choice(){
        System.out.print("가위 바위 보 중에 입력하시오:");
        String my_choice = sc.next();
        return my_choice;
    }

    public boolean check(String my_choice){

        if(!my_choice.equals("가위")
                && !my_choice.equals("바위")
                && !my_choice.equals("보")){
            System.out.println("가위 바위 보 중에 입력해주세요");
            return false;
        }

        return true;
    }

    public String play(String player_Choice){

        allInfo information = new allInfo();

        String computer_Choice =
                String.valueOf(rsp[random.nextInt(3)]);

        System.out.println("컴퓨터가 " + computer_Choice + "을(를) 냈습니다");

        String gameresult;

        if(computer_Choice.equals(player_Choice)){
            gameresult = String.valueOf(WLD[2]);

        } else if((computer_Choice.equals("가위") && player_Choice.equals("바위"))
                || (computer_Choice.equals("바위") && player_Choice.equals("보"))
                || (computer_Choice.equals("보") && player_Choice.equals("가위"))){

            gameresult = String.valueOf(WLD[0]);

        } else {
            gameresult = String.valueOf(WLD[1]);
        }

        information.setCpu_choice(computer_Choice);
        information.setResult(gameresult);
        information.setPlayer_choice(player_Choice);
        information.setRound(round++);

        gameRecords.add(information);

        information.printAll();
        return gameresult;
    }

    public void printWinResult(){
        gameRecords.stream().filter(info -> info.getResult().equals("승")).forEach(info -> info.printAll());
    }
}

Main.java

package Java_preCourse.Day6.Lv3;

public class Main {
    public static void main(String[] args) {
        GameManager gm = new GameManager();
        gm.start();
        while (true) {
            String choice = gm.choice();
            if(choice.equals("exit")){
                System.out.println("프로그램을 종료합니다");
                break;
            }
            if (!gm.check(choice)) {
                continue;
            }

            gm.play(choice);
        }
        gm.printWinResult();

    }
}
  • RSP,result파일로 가위/바위/보, 승/무/패에 대한 enum을 구성해둔다
  • gameManager에서 Lv2에서 enum에 들어있는 값을 사용하는 부분을 모두 enum에서 받아서 사용하도록 변경한다
  • 각종 게임기록을 저장할 수 있는 allinfo를 작성한다
    -> 퀘스트에서 제시된 사용자가 낸 것, 컴퓨터가 낸 것, 결과, 판 수를 저장한다.
  • 해당 정보들을 저장하는 ArrayList를 하나 생성하고 제너릭을 사용해서 해당 클래스의 정보를 받도록 한다.
  • 매 판 해당 정보를 출력하는 printAll을 allInfo 클래스 안에 정의한다.
  • 승리에 해당하는 판만 출력하는 printWinResult메서드를 gameManager클래스에 저장한다.
  • 람다식과 스트림을 이용하는데 filter()기능을 통해서 "승"으로 저장된 기록만 가져오고 출력한다.
  • 특정 선택에 관한건 마찬가지로 filter내에서 비교기능을 통해서 사용하면 가능할 것

0개의 댓글