초보 개발자 코드 트레이닝, Part 4. TDD 수련
야구게임을 TDD방식으로 구현해 보는 것입니다. 게시된지 좀 지났는데, 사실 TDD를 잘몰라 책부터 구입해서 보느라고 좀 늦었습니다. (나름 사정이) 다 읽은건 아니지만 대충 감은 와서 달려보았습니다.
일단 야구게임의 규칙은
- 컴퓨터는 미리 3개의 1~9 사이의 숫자를 가지고 있다(예. 1 3 5).
- 사용자는 컴퓨터가 가지고 있는 숫자를 정확히 맞춰야 한다.
- 사용자는 미리 지정된 만큼의 횟수 동안 시도할 수 있다. 지정된 횟수까지 시도해도 맞추지 못하면 "out"이다.
- 사용자는 매번 3개의 숫자를 넣고 컴퓨터는 미리 가지고 있는 3개의 숫자와 비교해 다음 응답을 해야 한다.
1) 3개의 숫자가 맞고 위치도 맞으면 "hit"
2) 1)이 아닐 경우 입력한 숫자가 컴퓨터가 가지고 있는 숫자 중 하나이고 그 위치도 맞으면 strike가 1씩 올라간다.
예를 들어 컴퓨터의 숫자가 1 3 5인데 사용자가 입력한 숫자가 2 3 4이면 "1 strike"이고 2 3 5를 입력했다면 "2 strikes"이다.
3) 숫자는 맞으나 위치가 다르면 ball이 1씩 올라간다. "1 ball", "2 balls", "3 balls"
구체적인 요구사항 목록입니다.
- BaseballGame 클래스를 메인 클래스로 작성한다.
- 완성된 코드는 여러 개의 클래스로 구성해도 상관없다.
- 게임은 여러 번 진행할 수 있다.
- 게임을 시작하려면 컴퓨터가 가진 숫자와 최대 시도 횟수가 등록되어 있어야 한다.
- 게임이 시작되면 이번이 몇 번째 게임인지 정보를 돌려준다.
- 두 번째 게임부터 컴퓨터의 숫자는 이전 게임에서 사용한 것과 똑 같은 것을 쓸 수 없다. 단 최대 시도 횟수는 같아도 상관없다.
- 게임이 종료되는 것은 "hit" 또는 "out"이 되었을 때다.
- 게임이 종료된 후 다시 게임을 시작하기 전에는 게임을 시도할 수 없다.
- 게임 중에는 게임의 현재 상태를 요청할 수 있다. 게임 상태는 최대 시도 가능 횟수, 현재 시도한 횟수, 그리고 현재까지의 최고기록 정보를 돌려준다. 최고 기록은 strike는 3점, ball은 1점으로 계산해 그 중 최고 점수를 가진 시도의 정보(몇번째 시도와 시도한 숫자)를 돌려준다. 최고 기록이 같은 경우가 두 번 이상 있으면 모두 돌려준다.
- 게임의최고 기록을 요청하면 지금까지 진행된 게임 중 가장 적은 시도로 맞춘 결과(시도 횟수)를 보여준다. 게임의 최고 기록을 요청하는것은 게임이 종료된 이후에만 가능하며 한 번도 게임을 시도하지 않았으면 결과를 요청할 수 없다.
- 모든 단서조항(...한다, ...할 수 없다, ...일 경우는)에 위배되는 경우는 적절한 Exception을 던져야 한다.
- 각 결과는 적절한 형태로(String 또는 임의의 Object) 리턴되면 된다(화면에 출력될 필요는 없다. 엔진이니까. UI는 이번 엔진을 이용해 나중에 따로 개발할 것이다).
요구사항이 단위가 크다고 생각되어 좀 잘랐습니다.
- 게임숫자는 3자리이다.
- 숫자의 범위는 1부터 9까지이다.
- 숫자를 비교할수 있어야한다. (같다와 다르다를 알수 있어야한다.)
예)1,2,3 == 1,2,3, 1,2,4 != 1,3,4
- 숫자들의 비교결과를 상세히 알수 있어야한다..(strike, ball, hit, out)
- 특정 시도 횟수 내에 맞출수도 있고, 아웃이 될수도 있다. 다시 게임을 하면 이전에 생성한 숫자는 쓸수 없다.
숫자를 다시 생성할때 이전 기록과 중복여부를 판단하고 같다면 다시 생성한다.
- 사용자가 숫자를 등록하면 컴퓨터와 비교하고 결과를 리턴, 매번 시도 횟수도 출력해야한다.
예) 현재 1strike 기회 3번시도중 1사용했습니다.
- BaseballGame이라는 클래스를 써야한다(main이 여기서 시작)
- 게임을 처음실행하면 사용자에게 입력을 받을수 있다.
콘솔에서 게임숫자를 입력받아야 한다. 1,2,3 하면 1,2,3을 파싱해서 담아야한다.
- 매번 게임은 현재 게임횟수를 출력해야한다.(시도횟수와는 다르다)
현재 첫번째 게임을 하고 있습니다.
현재 두번째 게임을 하고 있습니다.
- 게임은 hit이거나 out이 되야 한게임이 끝이 난다.
hit나 out이 나오면 게임을 다시 시작한다.
- 게임이 종료되면 다시 게임을 시작한다.
- 게임중 현재 상태를 요청할수 있다.(현재 상태를 출력해주는 루틴만 있으면 되겠다)
- 게임이 기록이 없다면 기록을 둘려줄수없다.
이어지는 내용