기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다.
같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다.
예) 상대방(컴퓨터)의 수가 425일 때
123을 제시한 경우 : 1스트라이크
456을 제시한 경우 : 1볼 1스트라이크
789를 제시한 경우 : 낫싱
위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다.
이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다.
게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다.
사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 애플리케이션은 종료되어야 한다.
우선 야구 게임에 필요한 기능 목록을 문서로 작성을 했다.
Application
main() 어플리케이션 실행
BaseballComputer
userInputNumberInGame() 사용자 입력
start() 게임시작
runGame() 게임진행
createRandomNumber() 서로 다른 3자리의 수 생성
checkHitNumber() 숫자가 맞는지 확인 후 결과값 리턴
inputRestartOrEnd() 게임 종료 또는 재시작
ChangingType
StringToInt() String타입 int타입으로 변환
StringArrToIntArr() String타입 배열 int타입 배열로 변환
FindingException
checkOutOfInputNumber() 입력값 범위 확인 기능
checkOutOfChoiceNumber() 선택 숫자 범위 확인 기능
GameMessage
printStartGameMessage() 게임 시작 메시지 출력
printEndGameMessage() 게임 종료 메시지 출력
printInputNumberToComputerMessage() 사용자 입력 메시지 출력
printRestartOrEndMessage() 재시작 또는 종료 메시지 출력
printHintMessage() 입력값에 따른 맞춘 상태 출력
우선 클래스 별 메서드로 기능 목록을 정리하였다. 하지만 이것은 잘못된 문서 작성이다.
받은 피드백으로
기능 목록을 재검토한다
기능 목록을 클래스 설계와 구현, 함수(메서드) 설계와 구현과 같이 너무 상세하게 작성하지 않는다.
클래스 이름, 함수(메서드) 시그니처와 반환값은 언제든지 변경될 수 있기 때문이다.
너무 세세한 부분까지 정리하기보다 구현해야 할 기능 목록을 정리하는 데 집중한다.
정상적인 경우도 중요하지만, 예외적인 상황도 기능 목록에 정리한다.
특히 예외 상황은 시작 단계에서 모두 찾기 힘들기 때문에 기능을 구현하면서 계속해서 추가해 나간다.
메서드로 상세히 적는 것이 아닌 그저 구현해야 할 기능 목록을 정리를 해야 했었다.
예를 들어 서로 다른 숫자 3개를 생성하는 기능은
[] 1부터 9까지 임의의 3개의 숫자를 생성한다.
이런식으로 메서드 형식이 아닌 구현해야할 목록을 정리하는 방법이 더 좋은 방향이다.
하드코딩이란 프로그램 소스코드에 데이터를 직접 넣어 사용하는 것을 말한다.
작성한 코드이다.
private void createRandomNumber() {
computerNumber.clear();
while (computerNumber.size() < 3) {
int randomNumber = Randoms.pickNumberInRange(1, 9);
if (!computerNumber.contains(randomNumber)) {
computerNumber.add(randomNumber);
}
}
}
이와 같이 직접 3과 1,9라는 숫자를 이용해 3개의 임의의 수를 생성했다.
문제점은
1. 의미를 파악하기 어렵다
2. 유지보수가 용이하지 않다
따라서 하드코딩을 피해야한다.
이번에는 상수값을 이용한 코딩이다.
static final int MAX_SIZE = 3;
static final int MIN_NUM = 1;
static final int MAX_NUM = 9;
public List<Integer> pickRandomNumbers() {
while (randomNumbers.size() < MAX_SIZE) {
int randomNum = Randoms.pickNumberInRange(MIN_NUM, MAX_NUM);
if (!randomNumbers.contains(randomNum)) {
randomNumbers.add(randomNum);
}
}
return randomNumbers;
}
이처럼 바꾸면 의미 파악이 쉽고 유지보수가 용이해진다.
아직도 배울 것이 많은 것 같다.
참고로 이번과제는 예상치 못한 git 문제로 인해 많은 시간을 소모했다.
내가 겪은 문제는 두 가지이다.
1.entirely different commit histories
2.git pull origin (branchname) --allow-unrelated-histories로 인한 커밋 증가
1번 문제는 나의 브랜치 시작점이 메인 브랜치의 시작점과 달라서 발생한 문제였다.
해결방법은 브랜치의 시작점을 일치 시켜주면 된다.
2번 문제는 git pull이 안되서 터미널에 나온 메시지를 따라 저 명령어를 쳤다.
그러자 commit이 2배로 늘어났었다.
해결방법은 명령어 치기 전으로 돌아가 강제로 푸쉬를 시켜 해결했다.
2주차를 진행하면서 좀 더 실력이 향상되는 느낌을 받았다. 문제점이 발생하면 하나하나 해결해 나가면서 뿌듯함을 느꼈다. 3주차 미션이 기대된다.
잘보고갑니다!