🚀 기능 요구 사항
기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임입니다.
- 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리합니다.
- 예) 상대방(컴퓨터)의 수가 425일 때
- 123을 제시한 경우 : 1스트라이크
- 456을 제시한 경우 : 1볼 1스트라이크
- 789를 제시한 경우 : 낫싱
- 예) 상대방(컴퓨터)의 수가 425일 때
- 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 합니다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택합니다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력합니다.
- 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료됩니다.
- 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있습니다.
- 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 합니다.
✏️ 구현할 기능 목록
위의 기능들을 구현하기 전에 다음과 같이 구현할 기능 목록을 정리하였습니다.
- 게임 시작 기능을 구현합니다.
- 랜덤으로 서로 다른 숫자 3개로 구성된 값을 생성합니다.
- 사용자로부터 수를 입력받습니다.
- 입력받은 수가 올바른 값인지 검증합니다.
- 잘못된 값을 입력했다면 IllegalArgumentException 예외 발생 후 애플리케이션을 종료합니다.
- 수가 아닌 값을 입력한 경우
- 1 ~ 9 사이 범위가 아닌 숫자로 이루어져 있는 경우
- 3자리가 아닌 수를 입력한 경우
- 각 자리의 숫자 중에 중복된 숫자가 있는 경우
- 입력한 수에 대한 결과를 볼과 스트라이크의 개수로 표시합니다.
- 일치하는 숫자가 하나도 없는 경우
- 볼만 있는 경우
- 스트라이크만 있는 경우
- 볼과 스트라이크 둘 다 있는 경우
- 3개의 숫자를 모두 맞힌 경우, 게임을 종료하고 게임 재시작 여부를 묻습니다.
- 1 -> 게임 재시작
- 2 -> 애플리케이션 종료
- 1과 2가 아닌 다른 값을 입력한 경우에는 IllegalArgumentException 예외 발생 후 애플리케이션을 종료합니다.
🤔 고민한 점
1. 기능 및 메서드 분리
한 함수 안에 여러 기능을 넣지 않고 하나의 함수는 하나의 기능만 하도록 신경쓰면서 코드를 작성했습니다.
먼저 패키지를 크게 game, model, util로 나누었고 각각 기능에 맞게 클래스를 생성했습니다.
이 때, 싱글톤으로 동작하기 위해 model을 object로 생성하였습니다.
- Game : 게임 시작 및 재시작 수행
- GameResult : 두 수를 비교하여 게임 결과 출력
- Computer : 랜덤으로 서로 다른 숫자 3개로 구성된 값 생성
- Player : 사용자로부터 수와 재시작 여부 입력받음
- Constants : 문자열 및 상수 선언
- Validation : 입력한 값이 올바른지 검증
2. 코드 컨벤션
다음의 코드 컨벤션 문서를 보면서 최대한 지키면서 코드를 작성하고자 했습니다.
변수/클래스/함수명도 신경쓰면서 네이밍했고 Indent depth도 최대 2 이하로 구현하도록 노력했습니다.
💡 느낀 점
- 기능 명세를 먼저 작성하고 기능을 작은 부분으로 나눠 구현하니 더 효과적으로 작업할 수 있었습니다.
- 기능별로 함수를 분리하고 코드 컨벤션을 지켜가면서 코드를 짜다 보니 이전보다 코드가 더 읽기 쉽고 유지보수하기 좋아졌습니다.
728x90
반응형
'기타 > 우테코' 카테고리의 다른 글
[우테코] 프리코스 4주차 미션 - 크리스마스 프로모션 (0) | 2023.11.16 |
---|---|
[우테코] 프리코스 3주차 미션 - 로또 (0) | 2023.11.10 |
[Kotlin] JUnit의 Assert 함수 사용하기 (0) | 2023.11.09 |
[Kotlin] JUnit으로 테스트 코드 작성하기 (0) | 2023.11.07 |
[우테코] 프리코스 2주차 미션 - 자동차 경주 (0) | 2023.11.03 |