프로젝트/우테코 6기

[1주차 / 숫자야구] 1. 설계

zangsu_ 2023. 10. 21. 13:21

프로젝트를 시작하며 가장 먼저 고민한 부분은 "어떻게 기능들을 분리하여 개별적인 클래스들을 구성할 수 있을까?" 라는 고민이었다.

 

아래는 README.md를 작성하기 전 생각했던 것들이다.

 

가장 먼저, 숫자 야구의 흐름을 생각해 보자.

  1. 상대방(컴퓨터)는 랜덤한 3개의 중복되지 않는 숫자를 선택한다.
  2. 사용자는 3개의 중복되지 않는 숫자를 입력한다.
  3. 상대방은 사용자의 입력과 정답을 비교하고, 결과를 알려준다.
  4. 사용자의 입력이 정답이라면 게임 종료, 그렇지 않다면 2번으로 돌아간다.

 

위의 흐름에서 3개의 큰 객체들을 분리했다.

  • Computer
    • 각 게임에서 사용될 정답을 랜덤으로 선택한다.
    • 사용자의 입력과 정답을 비교하고, 결과를 알려준다.
  • Player
    • 사용자의 입력을 처리한다.
      • 게임 중 : 3 개의 중복되지 않는 숫자.
      • 게임 후 : 재시작 / 종료
  • Game
    • 전체 게임 흐름을 제어한다.
      • Computer, Player에 구현된 각각의 메서드를 적절하게 호출한다.

 

아래는 위의 설계 직후 작성했던 README.md이다.

 

README.md

## 개요  
  
프로그램은 다음의 3 개의 객체 위주로 구성한다.  
  
### Game  
  
전체 게임을 진행할 클래스이다. <br>  
사용자와 컴퓨터 클래스의 메서드를 호출하여 게임을 진행하며, 게임의 흐름을 주관한다.  
  
### Player  
  
사용자의 입력을 처리한다.  
  
### Computer  
  
게임에서 사용할 3자리 수를 선택하고, 입력에 대한 결과를 반환한다.  
  
## 기능  
  
### Game  
- [ ] `void startGame()`  
  - 전체 게임 흐름을 진행한다.  
    - 첫 게임 실행  
    - 게임이 끝난 후 재시작/종료 여부를 파악  
    - 재시작의 경우 다시 게임을 실행  
- [ ] `void play()`  
  - 한 번의 게임을 진행한다.  
    - 컴퓨터에게 숫자를 선택하게 함  
    - 사용자가 정답을 맞힐 때 까지 다음을 반복  
      - 사용자에게 서로 다른 3개의 숫자를 입력 받음  
      - 컴퓨터에게 결과를 받아온다.  
      - 컴퓨터가 알려준 결과를 출력  
  
**주의!!** 프로그램의 종료 전에 `Console`의 `close()`메서드 호출해주기  
  
### Player  
  
- [ ] `List<Integer> getInput()`  
  - 사용자의 입력을 `List` 형태로 반환  
    - 서로 다른 3개의 숫자  
  - **throws** : 잘못된 입력의 경우 `IllegalArgumentException`  
- [ ] `int inputMenu()`  
  - 사용자의 입력을 정수로 반환  
    - 재시작 : 1  
    - 종료 : 2  
  - **throws** : 잘못된 입력의 경우 `IllegalArgumentException`  
  
### Computer  
  
- [ ] `void init()`  
  - 게임에서 사용할 3개의 숫자를 선택  
- [ ] `List<Result> getResult(List<Integer> input)`  
  - 사용자의 입력 값에 대해 `enum Result`의 리스트를 반환한다.