Project/우아한테크코스

[프리코스 1주차] 숫자 야구 게임

hu6r1s 2023. 10. 27. 21:23

프리코스

개발에 관심이 있는 사람들은 우아한테크코스에 대해서 대충 알고 있을 것이다.

우테코 5기부터 프리코스를 전원 참여할 수 있도록 변경되었다고 하여 이번 6기를 통해 프리코스를 참여하게 되었다.

프리코스는 우테코는 주입식 강의가 아니라 미션을 부여받고 스스로 미션을 구현하면서 피드백을 받는 형식이다. 기존의 교육방식과 다르기 때문에 본 과정을 들어가기 전에 프리코스로 미리 경험하는 단계이다.

 숫자 야구 게임

백엔드에 관심이 있어 백엔드로 신청을 했고 자바를 통해 숫자 야구 게임을 구현하는 미션을 부여받았다.

게임에 대한 기능 요구사항은 이렇다.

기능 요구 사항

기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.

  • 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
    • 예) 상대방(컴퓨터)의 수가 425일 때
      • 123을 제시한 경우 : 1스트라이크
      • 456을 제시한 경우 : 1볼 1스트라이크
      • 789를 제시한 경우 : 낫싱
  • 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
  • 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
  • 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

입출력 요구 사항

입력

  • 서로 다른 3자리의 수
  • 게임이 끝난 경우 재시작/종료를 구분하는 1과 2 중 하나의 수

출력

  • 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시
1볼 1스트라이크
  • 하나도 없는 경우
낫싱
  • 3개의 숫자를 모두 맞힐 경우
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료
  • 게임 시작 문구 출력
숫자 야구 게임을 시작합니다.

실행 결과 예시

숫자 야구 게임을 시작합니다.
숫자를 입력해주세요 : 123
1볼 1스트라이크
숫자를 입력해주세요 : 145
1볼
숫자를 입력해주세요 : 671
2볼
숫자를 입력해주세요 : 216
1스트라이크
숫자를 입력해주세요 : 713
3스트라이크
3개의 숫자를 모두 맞히셨습니다! 게임 종료
게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
1
숫자를 입력해주세요 : 123
1볼
...

사용자 입력 값과 랜덤 값은 camp.nextstep.edu.missionutils에서 제공하는 Randoms 및 Console API를 사용하여 구현해야 한다.

코드

요구사항을 통해서 일단 클래스를 게임을 실행할 Application(main), 게임이 실행하는 데 필요한 설정 및 값을 위한 Game, 사용자의 입력 값과 검증을 위한 User 이렇게 3개로 나누고자 했다.

public void gameStart() {
    System.out.println(GameConstant.STARTING_STRING.getStringValue());
    computer = randomNumber();
    while (!correctFlag) {
        player = user.getNumber();
        sendMessage(computer, player);
    }
}

private List<Integer> randomNumber() {
    Set<Integer> computer = new HashSet<>();
    while (computer.size() < GameConstant.SIZE.getIntValue()) {
        int randomNumber = Randoms.pickNumberInRange(
                GameConstant.RANDOM_START.getIntValue(), GameConstant.RANDOM_END.getIntValue()
        );
        computer.add(randomNumber);
    }
    return new ArrayList<>(computer);
}

private void sendMessage(List<Integer> computer, List<Integer> player) {
    List<Integer> score = calculateScore(computer, player);
    int strikes = score.get(0);
    int balls = score.get(1);
    displayScore(strikes, balls);

    if (strikes == GameConstant.SIZE.getIntValue()) {
        System.out.println(GameConstant.ENDING_STRING.getStringValue());
        reset();
    }
}
public List<Integer> getNumber() {
    System.out.print(GameConstant.INPUT_STRING.getStringValue());
    String input = Console.readLine();

    if (!isValidInput(input)) {
        throw new IllegalArgumentException();
    }
    return stringToList(input);
}

게임을 실행하면 "숫자 야구 게임을 시작합니다."라는 문자가 출력되게 한다.

그리고 랜덤된 숫자를 randomNumber 메서드를 통해서 생성한다.

User클래스의 getNumber를 통해 사용자가 입력한 값을 리스트로 가져온다. "123" -> [1, 2, 3]

그리고 사용자 값과 랜덤 값이 일치하지 않으면 계속 반복하여 입력할 수 있도록 correctFlag를 통해 반복했다.

자세한 코드는 깃허브를 통해 확인하면 된다.