Java를 공부하며 두 번째 개인과제가 시작되었다.
목표는 숫자야구게임을 만드는 것이다.
숫자야구의 규칙은 시스템이 고른 임의의 숫자 3개를 이용자가 숫자를 3개씩 던져가며 힌트를 통해 맞추는 것이다.
내게는 한글 단어를 맞추는 '꼬들'(Kordle.Kr)이라는 게임으로 더 친숙한 규칙인데 이를 숫자로 바꾸어 진행해보는 것이었다.
우선 구현해야 될 기능들을 생각해보기로 했다.
- 프로그램이 임의의 숫자(1~9) 3개를 생성(중복 X)
- 숫자 3개 입력받음
- 임의의 숫자와 입력받은 숫자 비교
- 결과값 출력 : strike와 ball의 개수
- 숫자 유무와 자리(순서)도 맞은 경우 : strike
- 숫자 유무만 맞은 경우 : ball
- 둘 다 맞지 않은 경우 : out (숫자 3개 모두 out일 경우에만 출력)
- 입력 오류 구현
- 중복 숫자 입력
- 0이거나 혹은 숫자가 아닐 경우
- 세 자리 숫자가 아닐 경우
- 정답을 맞출 때까지 반복
- 시작할 때 시작과 종료 중 선택 가능 (시작메뉴기능)
우선은 이 정도였다.
핵심은 숫자를 비교하여 strike/ball/out을 판단내리는 부분같아서 이 부분을 어떻게 구현할지 계속 고민했다.
우선 중복없는 세가지 숫자를 만들고 또 입력받아야 하니 로또 번호 생성기처럼 hashset
과 random
을 이용하기로 했다.
그리고 보통 set은 순서개념이 정의되어있지 않기때문에 iterator를 이용해 숫자의 자리를 구분하기로 했다.
다만, 숫자들을 모두 하나씩 필드에 저장할 것인지, 한 번에 비교를 돌릴 것인지는 계속 고민이 되었다.
만약 리스트라면 인덱스를 이용해 자리를 비교하는 것이 더 쉬울 것 같은데 이를 나중에 형변환을 해야하나?
우선 오늘은 간단하게 뼈대를 구축하기 위해 숫자를 하나씩 필드에 저장한 후 비교한다고 생각하고 클래스들을 생성한 뒤 1번부터 2번까지 정도만 구현해보기로 했다.
클래스는 다음과 같이 만들었다.
- Main : 게임의 실행이 이루어지는 곳
- GameApp : 게임 시작 안내 문구가 뜨고 게임 프로세스를 연결하는 곳
- BaseballGame : 실제 게임 로직 구현 (입출력)
- GameNumber : 숫자들을 생성/컬렉션에 저장/개별 저장
- BadException : 오류처리
숫자를 비교하는 메서드를 Number에 넣을지 BaseballGame에 넣을지는 생각을 해봐야될 것 같고..
Main
에서는 GameWin
이라는 boolean 변수를 false
로 초기화 한 후 true
를 return
받으면 종료하는 메서드를 작성했다.
GameApp
에서는 위에서 언급한 7번의 시작메뉴를 넣어 숫자 1을 누르면 게임이 시작(BaseballGame
객체 생성 후 메서드연결)하도록 만들었다.
(메뉴 : 1. 시작하기 2. 게임기록(구현미정) 3. 종료하기)
BaseballGame
은 객체가 생성될 때 임의의 숫자 세 개가 만들어지고 이 숫자들이 각각 GameNumber
의 필드 하나씩에 저장되도록 만들었다.
public BaseballGame() {
System.out.println("게임시작");
GameNumber gameNumber = new GameNumber();
gameNumber.makeGameNumber();
gameNumber.settingEachNumbers();
}
GameNumber에는 임의의 숫자들을 생성해서 넣을 hashset 컬렉션과 이 숫자 3개를 다시 꺼내어 각자 저장할 필드와 메서드(이 부분이 뭔가 조잡스러워서 고민을 해봐야할 것 같다.), 그리고 입력한 세 숫자를 저장할 필드를 만들어주었다.
import java.util.*;
public class GameNumber {
//필드
Set<Integer> gameNumbers;
int firstNumber;
int secondNumber;
int thirdNumber;
int firstInput;
int secondInput;
int thirdInput;
//메서드
//답이 될 숫자 생성하기
public Set<Integer> makeGameNumber() {
Random random = new Random();
Set<Integer> gameNumbers = new LinkedHashSet<Integer>();
while (gameNumbers.size()<3){
gameNumbers.add(random.nextInt(9)+1);
}
this.gameNumbers = gameNumbers;
return gameNumbers;
}
//set에서 숫자 순서대로 저장하기
public void settingEachNumbers() {
Iterator<Integer> iterator = this.gameNumbers.iterator();
this.firstNumber = iterator.next();
this.secondNumber = iterator.next();
this.thirdNumber = iterator.next();
System.out.println(firstNumber+" "+secondNumber+" "+thirdNumber); //확인용
}
//입력값을 필드에 지정하기
public int settingFirstInput(int firstInput){
this.firstInput = firstInput;
return this.firstInput;
}
public int settingSecondInput(int secondInput){
this.secondInput = secondInput;
return secondInput;
}
public int settingThirdInput(int thirdInput){
this.thirdInput = thirdInput;
return thirdInput;
}
}
일단 여기까지 하면 처음에 안내 문구가 나오고 1을 눌러 게임을 실행시키면 세 가지 임의의 숫자가 생성되어 각각 firstNumber
, secondNumber
, thirdNumber
에 저장된다.
내일은 입력을 받아 이를 비교하는 메서드를 만들어봐야겠다.
좋은 글 감사합니다.
블로그 왕은 다르시네요!