본문 바로가기
비전공자코딩교실/JAVA

[비전공자코딩교실] 숫자 야구 게임을 위한 심판 기능 만들기

by 세 미 콜 론 2021. 6. 5.
728x90
반응형

지난 시간에 난수 생성까지 완료하였습니다. 이번 시간에는 미리 예고한대로 사용자로부터 숫자를 입력받는 기능과 심판 기능을 만들어 보려고 합니다. 자, 여기에서 한 가지 생각하게 되는 것은 당신이 게임의 유저라면 어떠한 형태로 숫자를 입력하느냐 하는 것입니다. 숫자 하나씩 3번을 입력할 수도 있고, 숫자 세 개를 한 번에 입력할 수도 있습니다. 우리는 숫자 하나씩 3번을 입력하여 총 3개의 숫자를 받을 예정입니다. 우선 숫자를 입력받는 메소드의 기본 틀을 만들어줍니다.

이번에도 makeNumber() 때와 마찬가지로 int배열을 통해 리턴을 받을 예정입니다. 그럼 내용을 만들어보겠습니다. 우선 간단하게 숫자를 3번 입력받아 배열에 넣는 소스를 먼저 만들어보겠습니다.

이렇게 하면 숫자를 3번 입력받을 수 있습니다. 다만 문제점이 발생합니다. 바로 중복된 숫자를 입력할 수도 있고, 범위를 벗어나는 숫자 역시 입력이 가능합니다. 따라서 제한 조건을 추가하도록 하겠습니다. 

****** while문에 hasNext()가 아닌 next()를 사용해야합니다.

변화된 점의 가장 큰 것은 for문 안에서 입력 받은 숫자를 곧바로 inputNumber 배열에 넣지 않고 int tmp라는 변수를 선언하여 해당 변수에 값을 넣어서 조건을 검사한다는 점입니다. 처음 검사는 tmp가 0보다 작거나 또는( ||로 표현합니다) 9보다 큰 경우 0부터 9까지의 숫자만 입력하라는 메세지 출력 후 i를 감소 시켜 해당 for문을 다시 돌게 만들었습니다. 그리고 범위가 맞을 경우 (else의 경우) inputNumber의 i번째 자리에 tmp에 있던 숫자를 넣어주었습니다. 그렇다면 이제 조건을 하나 더 추가하여, 범위는 맞지만 중복된 숫자를 입력한 경우에 대해서도 대응해보겠습니다.

inputNumber()이 다소 길어졌지만 대충 완성된 것 같습니다. 실행 결과를 보기위해 메인 메소드에 inputNumber()을 실행시키면서 출력까지 할 수 있도록 만들어보았습니다.

실행 결과는 아래와 같습니다. 

자, 그럼 이제 숫자를 만들었으니 심판 메소드를 만들어보겠습니다. 우선 기본형을 작성해줍니다.

심판은 컴퓨터가 만들어낸 숫자와 유저가 입력한 숫자를 비교하여 결과를 뱉어낼 예정입니다. 따라서 메소드 명 뒤에 파라미터라고 불리는 친구를 받아서 실행 예정입니다. compare를 실행할 때 컴퓨터가 만들어낸 숫자 배열 com과 유저가 입력한 숫자 배열 user를 받아서 결과는 String, 즉 문자열 형태로 반환 예정입니다.

심판 소스를 만들기 위한 프로세스를 생각해보겠습니다. 심판은 두 숫자 배열을 비교하면서 아래와 같이 판단할 예정입니다.
 - 모든 자리의 숫자가 같을 경우 성공(SUCCESS)
 - 유저가 선택한 숫자가 컴퓨터가 선택한 숫자와 같으면서 자리도 같으면 스트라이크(S)
 - 유저가 선택한 숫자가 컴퓨터가 선택한 숫자와 같지만 자리가 다를 경우 볼(B)
 - 유저가 선택한 숫자가 컴퓨터가 선택한 숫자와 하나도 같이 않을 경우 아웃(O)

해당 소스를 만들어보도록 하겠습니다. 

strike 변수와 ball 변수를 만들어 조건에 해당하면 해당 변수의 숫자를 증가시키는 소스를 만들었습니다. 계속 사용하던 함수를 사용했기 때문에 부가 설명은 필요없을 것 같습니다. 자, 이제 결과를 담을 함수 result에 값을 담을 예정인데요. 스트라이크가 3개라면 SUCCESS를, 스트라이크와 볼이 모두 0개라면 OUT을, 두 가지 모두 아니라면 현 상황을 표시할 예정입니다. 이번에도 if문을 통해 분기하도록 하겠습니다.

자, 이제 메인 메소드에 담아서 확인해보겠습니다.

이렇게 수정해서 실행해보도록 하겠습니다. 아직 정식으로 게임을 만든 것은 아니기 때문에 컴퓨터가 어떤 숫자를 만들었는지 보고 결과가 맞게 출력되는지 확인해보겠습니다.

우리가 의도한대로 결과가 나온다는 것을 확인할 수 있습니다. 그렇다면 심판은 공명정대하게 입력한 숫자에 대한 심판을 내려줄 것입니다. 이제 다음 시간에는 사용자에게 결과를 출력해주고 실제 게임을 진행할 수 있도록 main메소드에서 프로세스를 만들어보겠습니다.

728x90
반응형

댓글