우아한 테크코스]프리코스 1주차 숫자 야구 - 미션 요구사항 분석(기능 요구 사항)

손지민·2023년 10월 22일
0

기능 요구 사항

기본적으로 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볼
...

2. 기능 요구 사항 분석

2.1. 라이브러리 조건 준수하기

  • camp.nextstep.edu.missionutils에서 제공하는 Randoms 및 Console API를 사용하여 구현해야 한다.
    • Random 값 추출은 camp.nextstep.edu.missionutils.RandomspickNumberInRange()를 활용한다.
    • 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.ConsolereadLine()을 활용한다.

사용 예시

List<Integer> computer = new ArrayList<>(); // 난수를 담을 List<Integer>computer생성
while (computer.size() < 3) { // computer list사이즈가 3보다 작은 동안 반복
    // 정해준 Randoms 라이브러리사용하여 1-9 난수 구하해서 randomNumber 에 담기
    int randomNumber = Randoms.pickNumberInRange(1, 9); 
    // computer List 에 지금 randomNumber 의 숫자를 포함하지 않는다면 리스트에 담기
    if (!computer.contains(randomNumber)) { 
        computer.add(randomNumber); // 리스트에 담기
    }
}

2.2. 프로그래밍 요구사항, 과제 진행 요구사항 지키기

  • 기능을 구현하기 전 docs/README.md 에 구현할 기능 목록을 정리해 추가한다.
  • 프로그램 종료 시 System.exit()를 호출하지 않는다.

2.3. 랜덤값 3자리 수 추출 방법 2가지 중 고민

  1. 중복을 피하면서 3자리 숫자 생성
  • 이 방법은 1부터 9까지의 각 자리에 대해 중복을 확인하고, 중복이 발생할 경우 다시 난수를 생성하여 중복을 피하도록 설계됩니다.
  • 이 방법은 중복을 미리 방지하므로 세 자리 숫자를 얻을 때까지 루프를 반복해야 할 수 있지만, 중복된 숫자가 발생하지 않습니다.
  1. 1부터 999까지 랜덤 숫자 생성 후 중복 확인
  • 이 방법은 1부터 999까지의 범위에서 무작위로 숫자를 생성하고, 중복을 확인하여 중복된 숫자를 피도록 설계됩니다.
  • 이 방법은 범위 내에서 숫자를 생성하고 중복 확인을 통해 중복을 피합니다.

ChatGpt에서 확인 결과 두 방법 사이의 성능 차이는 미미하므로 가독성, 유지보수성에 따라 선택하면 된다고 합니다.
코드를 읽는 입장에서는 각 자리를 하나씩 중복체크해 추가해 나가는 것이 더 직관적이라고 생각되어 1번 방식을 선택하여 구현하도록하겠습니다.

2.4. 입력값, 출력값 정확히 확인하기

  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

2.5. 종료

  • 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 종료됩니다.

  • 프로그램 종료 시 System.exit()를 호출하지 않는다.

  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.

    main 메서드는 이 예외를 처리하지 않습니다. 대신, 예외는 main 메서드가 포함된 프로그램 전체에서 전파됩니다. Java 프로그램은 기본적으로 예외를 처리하는 메커니즘이 내장되어 있어, 해당 예외가 처리되지 않으면 프로그램이 중단됩니다.

    예외를 처리하고 종료하려면 System.exit(o)를 사용하고싶은데, 요구사항에 System.exit(o)은 사용하지 말라고 되어있어서, 처리하지 않고 알아서 종료하도록 뒀다.

profile
Developer

0개의 댓글