241022 개인과제2 시작

물고기가자라면어그로·2024년 10월 22일
1

Java를 공부하며 두 번째 개인과제가 시작되었다.

목표는 숫자야구게임을 만드는 것이다.
숫자야구의 규칙은 시스템이 고른 임의의 숫자 3개를 이용자가 숫자를 3개씩 던져가며 힌트를 통해 맞추는 것이다.
내게는 한글 단어를 맞추는 '꼬들'(Kordle.Kr)이라는 게임으로 더 친숙한 규칙인데 이를 숫자로 바꾸어 진행해보는 것이었다.

우선 구현해야 될 기능들을 생각해보기로 했다.

  1. 프로그램이 임의의 숫자(1~9) 3개를 생성(중복 X)
  2. 숫자 3개 입력받음
  3. 임의의 숫자와 입력받은 숫자 비교
  4. 결과값 출력 : strike와 ball의 개수
    • 숫자 유무와 자리(순서)도 맞은 경우 : strike
    • 숫자 유무만 맞은 경우 : ball
    • 둘 다 맞지 않은 경우 : out (숫자 3개 모두 out일 경우에만 출력)
  5. 입력 오류 구현
    • 중복 숫자 입력
    • 0이거나 혹은 숫자가 아닐 경우
    • 세 자리 숫자가 아닐 경우
  6. 정답을 맞출 때까지 반복
  7. 시작할 때 시작과 종료 중 선택 가능 (시작메뉴기능)

우선은 이 정도였다.

핵심은 숫자를 비교하여 strike/ball/out을 판단내리는 부분같아서 이 부분을 어떻게 구현할지 계속 고민했다.

우선 중복없는 세가지 숫자를 만들고 또 입력받아야 하니 로또 번호 생성기처럼 hashsetrandom을 이용하기로 했다.
그리고 보통 set은 순서개념이 정의되어있지 않기때문에 iterator를 이용해 숫자의 자리를 구분하기로 했다.
다만, 숫자들을 모두 하나씩 필드에 저장할 것인지, 한 번에 비교를 돌릴 것인지는 계속 고민이 되었다.
만약 리스트라면 인덱스를 이용해 자리를 비교하는 것이 더 쉬울 것 같은데 이를 나중에 형변환을 해야하나?

우선 오늘은 간단하게 뼈대를 구축하기 위해 숫자를 하나씩 필드에 저장한 후 비교한다고 생각하고 클래스들을 생성한 뒤 1번부터 2번까지 정도만 구현해보기로 했다.

클래스는 다음과 같이 만들었다.

  • Main : 게임의 실행이 이루어지는 곳
  • GameApp : 게임 시작 안내 문구가 뜨고 게임 프로세스를 연결하는 곳
  • BaseballGame : 실제 게임 로직 구현 (입출력)
  • GameNumber : 숫자들을 생성/컬렉션에 저장/개별 저장
  • BadException : 오류처리

숫자를 비교하는 메서드를 Number에 넣을지 BaseballGame에 넣을지는 생각을 해봐야될 것 같고..

Main 에서는 GameWin 이라는 boolean 변수를 false로 초기화 한 후 truereturn 받으면 종료하는 메서드를 작성했다.

GameApp에서는 위에서 언급한 7번의 시작메뉴를 넣어 숫자 1을 누르면 게임이 시작(BaseballGame 객체 생성 후 메서드연결)하도록 만들었다.
(메뉴 : 1. 시작하기 2. 게임기록(구현미정) 3. 종료하기)

BaseballGame은 객체가 생성될 때 임의의 숫자 세 개가 만들어지고 이 숫자들이 각각 GameNumber의 필드 하나씩에 저장되도록 만들었다.

    public BaseballGame() {
        System.out.println("게임시작");
        GameNumber gameNumber = new GameNumber();
        gameNumber.makeGameNumber();
        gameNumber.settingEachNumbers();
    }

GameNumber에는 임의의 숫자들을 생성해서 넣을 hashset 컬렉션과 이 숫자 3개를 다시 꺼내어 각자 저장할 필드와 메서드(이 부분이 뭔가 조잡스러워서 고민을 해봐야할 것 같다.), 그리고 입력한 세 숫자를 저장할 필드를 만들어주었다.

import java.util.*;

public class GameNumber {
    //필드
    Set<Integer> gameNumbers;
    int firstNumber;
    int secondNumber;
    int thirdNumber;
    int firstInput;
    int secondInput;
    int thirdInput;

    //메서드
    //답이 될 숫자 생성하기
    public Set<Integer> makeGameNumber() {
        Random random = new Random();
        Set<Integer> gameNumbers = new LinkedHashSet<Integer>();
        while (gameNumbers.size()<3){
            gameNumbers.add(random.nextInt(9)+1);
        }
        this.gameNumbers = gameNumbers;
        return gameNumbers;
    }

    //set에서 숫자 순서대로 저장하기
    public void settingEachNumbers() {
        Iterator<Integer> iterator = this.gameNumbers.iterator();
        this.firstNumber = iterator.next(); 
        this.secondNumber = iterator.next();
        this.thirdNumber = iterator.next();
        System.out.println(firstNumber+" "+secondNumber+" "+thirdNumber);  //확인용
       
    }

    //입력값을 필드에 지정하기
    public int settingFirstInput(int firstInput){
        this.firstInput = firstInput;
        return this.firstInput;
    }
    public int settingSecondInput(int secondInput){
        this.secondInput = secondInput;
        return secondInput;
    }
    public int settingThirdInput(int thirdInput){
        this.thirdInput = thirdInput;
        return thirdInput;
    }


}

일단 여기까지 하면 처음에 안내 문구가 나오고 1을 눌러 게임을 실행시키면 세 가지 임의의 숫자가 생성되어 각각 firstNumber, secondNumber, thirdNumber 에 저장된다.

내일은 입력을 받아 이를 비교하는 메서드를 만들어봐야겠다.

1개의 댓글

comment-user-thumbnail
2024년 10월 28일

좋은 글 감사합니다.
블로그 왕은 다르시네요!

답글 달기