1 ) 볼 처리하기
- 숫자 야구 게임 볼 처리하기.
- 저번 프로젝트 이어서 진행. ( 저번 진행은 스트라이크 처리)
- 볼 처리하는 방법.
- 처음 프로젝트를 보고 생각했던 방법
- 이중for문을 돌려 스트라이크와 볼을 동시에 처리.
- but! 스트라이크 처리 메서드와 볼 처리 메서드를 따로 생성.
- 볼만 처리하는 메서드 따로 생성.
private int countBall(int input) {
ArrayList<Integer> list = new ArrayList<Integer>();
int num = 0;
while (input > 0) { // 입력 받은 숫자를 자릿 수 마다 하나씩 저장
list.add(input % 10);
input /= 10;
}
for(int i = 0; i < list.size(); i++){
for(int j = 0; j < list.size(); j++){
if(list.get(list.size()-i-1) == ran_num[j]) { //하나씩 비교하며 값은 같으나, 위치가 다를 때 마다 ball
if(i != j) {
num++;
}
}
}
}
return num;
}
- 사용자가 입력한 3자리의 숫자를 input으로 받게 만들고 저번과 같이 입력받은 숫자를 한 자릿 수 씩 리스트에 저장.
- list에는 뒤에 자릿 수 부터 들어가기에 랜덤 난수 3자리와 자릿 수를 맞춰주기 위해.
- list.get(list.size()-i-1)을 해주어 같은 백의 자리, 십의 자리를 비교한다.
- 이때 우린 볼을 처리해야하기에. 첫번째 부터 다 비교해주는데.
- list의 값과 배열의 값을 비교. 이때 값이 같다면 if문 실행.
- 이때 i와 j의 값이 다르면 위치가 다른 거기 때문에 num++;을 해준다.
- 여기 return 값은 이제 볼 갯수로 처리.
- 처음에 백의 자리, 십의 자리, 일의 자리 위치를 맞춰주지 않으니 볼 갯수 처리하는 부분에서 오류 발생.
- ex) 143이 정답이라면 314를 한다면 원래는 3ball이 나와야하지만. 3의 위치가 서로 다름에도 List와 array의 자릿 수가 맞지 않아 스트라이크로 판별.
- 그렇게 오류 발생.
- 자릿 수를 맞춰줌으로서 오류 해결.
public class BaseballGameDisplay {
public void displayHint(int strike, int ball) {
if(strike == 0 && ball == 0){
// 스트라이크와 볼이 해당되지 않는 경우
System.out.println("out 입니다!");
System.out.println("=====================");
} else if(strike == 3){
// 정답을 맞춘 경우
System.out.println("정답을 맞추셨습니다! 승리!!");
System.out.println("=====================");
} else{
// 스트라이크와 볼 갯수 알려주기
System.out.println(strike + " 스트라이크, " + ball +" ball 입니다");
System.out.println("=====================");
}
}
}
- 스트라이크와 볼로 힌트를 주는 클래스 생성.
- 원래는 기존에 baseballgame class에 그대로 생성하여 만들었으나 클래스를 따로 만들어야 하는 것을 확인.
- 따로 만들어 클래스를 생성및 선언하여 사용하는 것은 큰 어려움이 없었다.
- 원래 3 strike의 경우 정답을 맞췄다면서 while문이 멈춰야한다.
- 기존의 방법
- break; 을 이용하여 while문 종료.
- 다른 클래스로 만들고 나서는 break; 불가
- 해결 방법.
while (flag) {
System.out.println("3자리 숫자를 입력하시오 : ");
int input = sc.nextInt();
if (input < 100 || input > 999) { // 입력 숫자가 2자리 경우 다시 입력
System.out.println("3자리를 입력해주세요!");
continue;
}
flag = validateInput(input);
// num을 return 받아 스트라이크와 볼 갯수 저장.
int strike = countStrike(input);
int ball = countBall(input);
hint.displayHint(strike, ball);
if (strike == 3) { // 3 strike의 경우 반복문 종료.
flag = false;
}
playNum++;
}
- displayHint(); 클래스가 끝나고나서 if(strike == 3) 이라면 flag를 false;를 바꿔줌으로서 while문 종료.
- 코드가 마음에 들지 않아서 더 깔끔한 방법이 있나 생각하다가 떠오르지 않아 튜터님께 도움 요청.
- 코드를 깔끔하게 하기 위해서 다른 코드들까지 건드려야 되는 상황이라 그냥 그대로 진행.
public class Main {
public static void main(String[] args) {
boolean flag = true;
while (flag) {
System.out.println("환영합니다! 원하시는 번호를 입력해주세요.");
System.out.println("1. 게임 시작하기 2. 게임 기록 보기 3. 종료하기");
Scanner scanner = new Scanner(System.in);
int input = scanner.nextInt();
switch (input) {
case 1:
Baseballgame start = new Baseballgame();
start.play();
continue;
case 2:
System.out.println("구현되지 않았습니다.");
break;
case 3:
System.out.println("게임을 종료합니다. 감사합니다 :)");
flag = false;
break;
}
}
}
}
- 메인 클래스 작성
- '1' 을 입력할 시 게임 실행, '2' 입력 시 게임 기록 확인, '3' 입력 시 게임 종료.
- 입력값을 넣을 시 특정 이벤트가 발생은 switch로 해결.
- '1'을 입력했을 시 게임을 실행하고 다시 게임 시작 문구를 띄워야 하기에 continue;
- '2'는 LV_3로 현재 구현 중.
- '3'은 입력 시 flag를 false로 바꿔준다. 그러면 while문이 종료되면서 게임 종료.
- Lv_3 진행 중인데 접근제어자를 사용하여 게임 진행 횟수를 리스트에 저장하고 싶은데 생각대로 되지 않아 아쉬움.
- 내일은 Lv_3를 마무리하고 Lv_4를 보는 것이 목표.
'TIL > Project' 카테고리의 다른 글
TIL 2024-10-26 (숫자 야구 게임 FeedBack) (1) | 2024.10.26 |
---|---|
Trouble Shooting (숫자 야구 게임) (0) | 2024.10.25 |
TIL 2024-10-21 (숫자 야구 게임 - 1) (0) | 2024.10.21 |
TIL 2024-10-16 (Calculate Project) (0) | 2024.10.16 |
[KPT 회고록] (mini project) (0) | 2024.10.08 |