From 39a2a68d6029b2a1e19f29229142f3bb56ef3105 Mon Sep 17 00:00:00 2001 From: kimeunji Date: Thu, 25 Apr 2024 10:11:39 +0900 Subject: [PATCH] 240425 --- src/main/java/baseball/Application.java | 3 +- .../java/baseball/BallStrikeEvaluator.java | 28 +++++++++ src/main/java/baseball/BaseBallGame.java | 42 +++++++++++++ src/main/java/baseball/InputView.java | 59 +++++++++++++++++++ src/main/java/baseball/NumberGenerator.java | 23 ++++++++ src/main/java/baseball/OutputView.java | 32 ++++++++++ 6 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/BallStrikeEvaluator.java create mode 100644 src/main/java/baseball/BaseBallGame.java create mode 100644 src/main/java/baseball/InputView.java create mode 100644 src/main/java/baseball/NumberGenerator.java create mode 100644 src/main/java/baseball/OutputView.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..d072eb72ff 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + BaseBallGame baseBallGame = new BaseBallGame(); + baseBallGame.play(); } } diff --git a/src/main/java/baseball/BallStrikeEvaluator.java b/src/main/java/baseball/BallStrikeEvaluator.java new file mode 100644 index 0000000000..6f47ebabfa --- /dev/null +++ b/src/main/java/baseball/BallStrikeEvaluator.java @@ -0,0 +1,28 @@ +package baseball; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class BallStrikeEvaluator { + public Map evaluate(List answer, List userBalls){ + + int strike = 0; + int ball = 0; + + for (int i = 0; i < answer.size(); i++) { + for (int j = 0; j < userBalls.size(); j++) { + if (answer.get(i) == userBalls.get(j) && i == j ) { // 인덱스 위치가 같고, 숫자가 같으면 스트라이크 + strike++; + } else if(answer.get(i) == userBalls.get(j) && i != j) { // 숫자만 같으면 볼 + ball++; + } + } + } + + Map result = new HashMap<>(); + result.put("strike", strike); + result.put("ball", ball); + return result; + } +} diff --git a/src/main/java/baseball/BaseBallGame.java b/src/main/java/baseball/BaseBallGame.java new file mode 100644 index 0000000000..f80a3efe56 --- /dev/null +++ b/src/main/java/baseball/BaseBallGame.java @@ -0,0 +1,42 @@ +package baseball; + +import java.util.List; +import java.util.Map; + +public class BaseBallGame { + + void play() { + + OutputView outputView1 = new OutputView(); + outputView1.startMessage(); + + // 컴퓨터 세자리 숫자 랜덤 생성 + NumberGenerator playComputer = new NumberGenerator(); + List randomNumber = playComputer.makeThreeRandomNumber(); + + int replay = 0; + + while(replay != 2) { + + if(replay == 1) { + playComputer = new NumberGenerator(); + randomNumber = playComputer.makeThreeRandomNumber(); + } + + InputView inputView = new InputView(); + List inputNumbers = inputView.inputNumbers(); + + BallStrikeEvaluator evaluator = new BallStrikeEvaluator(); + Map evaluate = evaluator.evaluate(randomNumber, inputNumbers);// 볼, 스트라이크 판단 + + OutputView outputView = new OutputView(); // strike, ball 개수 판단 + outputView.printResult(evaluate); + + //3스트라이크가 아니면 다시 입력해 주세요 + if(evaluate.get("strike") == 3) { + replay = inputView.selectNewGameOrQuitGame(); + + } + } + } +} diff --git a/src/main/java/baseball/InputView.java b/src/main/java/baseball/InputView.java new file mode 100644 index 0000000000..ba7de42fff --- /dev/null +++ b/src/main/java/baseball/InputView.java @@ -0,0 +1,59 @@ +package baseball; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static camp.nextstep.edu.missionutils.Console.readLine; + +public class InputView { + public List inputNumbers() { + + System.out.print("숫자를 입력해주세요 : "); + + String inputNumber = readLine(); + // 입력된 값이 숫자로 변환 가능한지 확인 + try { + Integer.parseInt(inputNumber); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("유효한 숫자를 입력해주세요."); + } + + // 입력된 숫자 중복 확인 + Set nonDuplicatedNumbers = new HashSet<>(); + for (char number : inputNumber.toCharArray()) { + if (!Character.isDigit(number)) { + throw new IllegalArgumentException("숫자만 입력해주세요."); + } + nonDuplicatedNumbers.add(Character.getNumericValue(number)); + } + + // 중복된 숫자가 없고 3개의 숫자인지 확인 + if (nonDuplicatedNumbers.size() != 3) { + throw new IllegalArgumentException("3개의 중복되지 않는 숫자를 입력해주세요."); + } + + return new ArrayList<>(nonDuplicatedNumbers); + } + + + //역할: 사용자로 부터 게임을 새로 시작하려면 1, 종료하려면 2를 입력받는 기능 구현 + public int selectNewGameOrQuitGame() { + System.out.println(); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String inputNumber = readLine(); + try { + int number = Integer.parseInt(inputNumber); + if(number != 1 && number != 2) { + throw new IllegalArgumentException("1 또는 2를 입력해주세요."); + } + return number; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("유효한 숫자를 입력해주세요."); + } +// //정수값으로 반환 +// int number = Integer.parseInt(inputNumber); +// return number; + } +} diff --git a/src/main/java/baseball/NumberGenerator.java b/src/main/java/baseball/NumberGenerator.java new file mode 100644 index 0000000000..68b426a957 --- /dev/null +++ b/src/main/java/baseball/NumberGenerator.java @@ -0,0 +1,23 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class NumberGenerator { + // 기능: 컴퓨터의 서로 다른 세자리 숫자 선택 + public List makeThreeRandomNumber() { + + List randomNumbers = new ArrayList<>(); + + while (randomNumbers.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + if (!randomNumbers.contains(randomNumber)) { + randomNumbers.add(randomNumber); + } + } + System.out.println(randomNumbers); + return randomNumbers; + } +} diff --git a/src/main/java/baseball/OutputView.java b/src/main/java/baseball/OutputView.java new file mode 100644 index 0000000000..c59f59fb5c --- /dev/null +++ b/src/main/java/baseball/OutputView.java @@ -0,0 +1,32 @@ +package baseball; + +import java.util.Map; + +public class OutputView { + public void startMessage() { + System.out.println("숫자 야구 게임을 시작합니다."); + } + + //역할: 스트라이크, 볼, 낫싱을 반환하는 역할 + public void printResult(Map result) { + Integer strike = result.getOrDefault("strike", 0); + Integer ball = result.getOrDefault("ball", 0); + + if (strike == 0 && ball == 0) { + System.out.print("낫싱"); + } + if (ball != 0 && strike == 0) { + System.out.print(ball + "볼"); + } + if (strike != 0 && ball == 0) { + System.out.print(strike + "스트라이크"); + } + System.out.println(); + + if (strike == 3) { + System.out.println(); + System.out.print("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println(); + } + } +}