본문 바로가기
카테고리 없음

야구 숫자 게임 트러블 슈팅

by 차리하루일기 2024. 9. 23.

1. Collections.shuffle(list)와 Math.random() 서칭 필요

문제:

무작위 숫자 생성을 위해 Collections.shuffle(list)와 Math.random()에 대한 이해가 필요했다. 

해결 :

  • Collections.shuffle(list)
  • 리스트 안에 있는 요소들의 순서를 무작위로 섞어주는 자바 내장 메서드
List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 9; i++) {
    list.add(i);
}
Collections.shuffle(list);
  • Math.random()
  • 무작위 실수를 생성하는 메서드로, 0.0 이상 1.0 미만의 값을 반환
int randomNumber = (int) (Math.random() * 9) + 1;  // 1부터 9까지의 랜덤 숫자 생성

 

2.유효성 검사

문제:

입력된 숫자가 규칙에 맞지 않으면 게임이 정상적으로 진행되지 않음. 올바른 유효성 검사가 필요.

체크 영역이 많아서 고민을 많이 했던 부분. 

해결 :

유효성 검사는 사용자가 입력한 숫자가 다음 조건을 만족하는지 확인

  1. 3자리의 숫자인가?
  2. 중복된 숫자가 없는가?
  3. 1부터 9 사이의 숫자인가?
public static boolean isValid(String input) {
        // 3자리 수인지 확인
        if (input.length() != 3) {
            return false;
        }

        // 숫자로만 구성되어 있는지 확인
        if (!input.matches("[1-9]+")) {
            return false;
        }

        // 중복된 숫자가 없는지 확인
        char[] chars = input.toCharArray();
        if (chars[0] == chars[1] || chars[1] == chars[2] || chars[0] == chars[2]) {
            return false;
        }

        return true;
    }

 

3. 결과값 출력 문구

문제:

단순히 스트라이크 볼 아웃으로 삼단구성을 하려 했었음. x 

 

해결:

if 문을 활용해야 함.

 if (strike == 3) {
                System.out.println("3스트라이크! 정답입니다!");
                return "정답을 맞추셨습니다! 시도 횟수: " + attempts + "번"; // 게임 기록 반환
            } else if (strike > 0 || ball > 0) {
                System.out.println(strike + " 스트라이크, " + ball + " 볼");
            } else {
                System.out.println("아웃");
            }

 

5. while 문을 이용한 프로그램 안내 문구 출력

문제:

규칙에 대한 잘못된 이해로 인해서 while문을 쓴다는 생각을 하지 못했었음. 

실제 야구 느낌으로 3아웃이면 공수교대 느낌이라 생각했었음.

 

해결:

( 시작 문구 part) 

 출력문구를 while 문을 통해 루프시킴. 

환영합니다. 1. 게임 시작 2. 기록. 3 종료   

while 문 안에 switch 문을 넣었음. 

 

(게임 시작 및 정답 확인 메서드 part)

while (true)를 통해서 조건이 항상 참이길 바라며 ....

만약 isValid(input) 메서드를 사용해 입력된 값이 올바른지 확인.

만약 유효하지 않다면, **"잘못된 입력입니다"**라는 메시지를 출력하고 continue를 사용하여 다음 반복으로 넘어감. 

결과값 출력part 도 여기 while문에 넣었음. 

 

6. 클래스를 분화시키는 것

문제 :

어떤식으로 이름을 정해야 할지, oop는 어떤식으로 적용해야 할지 총체적 난국이였다. 

 

해결:

책임별로 클래스를 분리하고, 

GameRecord  

Game

Inputvaildator

main2

로 클래스를 분화하였다.

 

public class GameRecord {
    private List<String> records;
    ...
    
    public List<String> getRecords() {
        return records;
public class Game {
    //정답 숫자와 시도 횟수 캡슐화
    private List<Integer> answer;
    private int attempts;
    ...
    ..
    .
    // answer와 attempts에 접근할 수 있게 캡슐화
    public List<Integer> getAnswer() {
        return answer;
    }

    public int getAttempts() {
        return attempts;
    }

 

이상 lv2 까지 베이스볼 게임을 실행하면서 생긴 문제점과 구글링을 통해 알아본 것 들이였다.