From 11ed4af07881589e802cd5fa1b997b4dc2fc0c44 Mon Sep 17 00:00:00 2001 From: dhkim Date: Wed, 30 Nov 2022 14:59:28 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 ++++ src/main/java/baseball/Application.java | 5 ++ .../controller/BaseballGameController.java | 35 +++++++++++ src/main/java/baseball/model/Ball.java | 26 +++++++++ src/main/java/baseball/model/BallNumber.java | 37 ++++++++++++ src/main/java/baseball/model/Balls.java | 58 +++++++++++++++++++ .../model/ComputerBallsGenerator.java | 29 ++++++++++ src/main/java/baseball/model/GameResult.java | 41 +++++++++++++ src/main/java/baseball/model/Position.java | 37 ++++++++++++ .../java/baseball/model/RestartCommand.java | 25 ++++++++ .../java/baseball/view/InputValidator.java | 24 ++++++++ src/main/java/baseball/view/InputView.java | 31 ++++++++++ src/main/java/baseball/view/OutputView.java | 31 ++++++++++ .../java/baseball/model/BallNumberTest.java | 23 ++++++++ src/test/java/baseball/model/BallsTest.java | 50 ++++++++++++++++ .../java/baseball/model/PositionTest.java | 26 +++++++++ 16 files changed, 488 insertions(+) create mode 100644 src/main/java/baseball/controller/BaseballGameController.java create mode 100644 src/main/java/baseball/model/Ball.java create mode 100644 src/main/java/baseball/model/BallNumber.java create mode 100644 src/main/java/baseball/model/Balls.java create mode 100644 src/main/java/baseball/model/ComputerBallsGenerator.java create mode 100644 src/main/java/baseball/model/GameResult.java create mode 100644 src/main/java/baseball/model/Position.java create mode 100644 src/main/java/baseball/model/RestartCommand.java create mode 100644 src/main/java/baseball/view/InputValidator.java create mode 100644 src/main/java/baseball/view/InputView.java create mode 100644 src/main/java/baseball/view/OutputView.java create mode 100644 src/test/java/baseball/model/BallNumberTest.java create mode 100644 src/test/java/baseball/model/BallsTest.java create mode 100644 src/test/java/baseball/model/PositionTest.java diff --git a/docs/README.md b/docs/README.md index e69de29bb2..fc2c175940 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,10 @@ +## 기능 목록 + +### 데이터 처리 +- [x] 컴퓨터 수 생성 + - [x] 1 ~ 9 범위의 랜덤 수 한 개 생성 + - [x] 중복되지 않는 수 3개 생성 + - [x] 생성된 수로 컴퓨터 수 생성 +- [x] 비교 결과 생성 + - [x] 볼, 스트라이크 개수 구하기 + - [x] 공 한 개가 볼인지 스트라이크인지 판정하기 \ No newline at end of file diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..422287e5e5 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,12 @@ package baseball; +import baseball.controller.BaseballGameController; +import baseball.model.ComputerBallsGenerator; + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + BaseballGameController baseballGameController = new BaseballGameController(new ComputerBallsGenerator()); + baseballGameController.run(); } } diff --git a/src/main/java/baseball/controller/BaseballGameController.java b/src/main/java/baseball/controller/BaseballGameController.java new file mode 100644 index 0000000000..5894b0f59d --- /dev/null +++ b/src/main/java/baseball/controller/BaseballGameController.java @@ -0,0 +1,35 @@ +package baseball.controller; + +import baseball.model.Balls; +import baseball.model.ComputerBallsGenerator; +import baseball.model.GameResult; +import baseball.view.InputView; +import baseball.view.OutputView; + +public class BaseballGameController { + private final InputView inputView = InputView.getInstance(); + private final OutputView outputView = OutputView.getInstance(); + private final ComputerBallsGenerator computerBallsGenerator; + + public BaseballGameController(ComputerBallsGenerator computerBallsGenerator) { + this.computerBallsGenerator = computerBallsGenerator; + } + + public void run() { + outputView.printStart(); + do { + playAGame(); + } while (inputView.inputRestart().isRestart()); + } + + private void playAGame() { + GameResult gameResult = null; + Balls computerBalls = computerBallsGenerator.generate(); + do { + String inputNumbers = inputView.inputNumbers(); + Balls user = new Balls(inputNumbers); + gameResult = computerBalls.compare(user); + outputView.printResult(gameResult); + } while (!gameResult.isRight()); + } +} diff --git a/src/main/java/baseball/model/Ball.java b/src/main/java/baseball/model/Ball.java new file mode 100644 index 0000000000..a2b0628d87 --- /dev/null +++ b/src/main/java/baseball/model/Ball.java @@ -0,0 +1,26 @@ +package baseball.model; + +public class Ball { + private final BallNumber ballNumber; + private final Position position; + + public Ball(BallNumber ballNumber, Position position) { + this.ballNumber = ballNumber; + this.position = position; + } + + public boolean isBall(Ball other) { + if (position == other.position) { + return false; + } + return ballNumber == other.ballNumber; + } + + public boolean isStrike(Ball other) { + return position == other.position && ballNumber == other.ballNumber; + } + + public BallNumber getBallNumber() { + return ballNumber; + } +} diff --git a/src/main/java/baseball/model/BallNumber.java b/src/main/java/baseball/model/BallNumber.java new file mode 100644 index 0000000000..d11c4b8acd --- /dev/null +++ b/src/main/java/baseball/model/BallNumber.java @@ -0,0 +1,37 @@ +package baseball.model; + +import java.util.HashMap; +import java.util.Map; + +public class BallNumber { + public static final int NUMBER_LOWER_BOUNDS = 1; + public static final int NUMBER_UPPER_BOUNDS = 9; + private static final Map CACHE = new HashMap<>(); + private final int ballNumber; + + static { + for (int number = NUMBER_LOWER_BOUNDS; number <= NUMBER_UPPER_BOUNDS; number++) { + CACHE.put(number, new BallNumber(number)); + } + } + + private BallNumber(int ballNumber) { + validate(ballNumber); + this.ballNumber = ballNumber; + } + + private static void validate(int ballNumber) { + if (ballNumber < NUMBER_LOWER_BOUNDS || ballNumber > NUMBER_UPPER_BOUNDS) { + throw new IllegalArgumentException(); + } + } + + public static BallNumber valueOf(int ballNumber) { + validate(ballNumber); + return CACHE.get(ballNumber); + } + + public int getBallNumber() { + return ballNumber; + } +} diff --git a/src/main/java/baseball/model/Balls.java b/src/main/java/baseball/model/Balls.java new file mode 100644 index 0000000000..1d771c0f86 --- /dev/null +++ b/src/main/java/baseball/model/Balls.java @@ -0,0 +1,58 @@ +package baseball.model; + +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Balls { + public static final int SIZE = 3; + + private final List balls; + + public Balls(List balls) { + validate(balls); + this.balls = balls; + } + + public Balls(String ballsString) { + balls = IntStream.range(0, ballsString.length()) + .mapToObj(i -> new Ball(BallNumber.valueOf(Integer.parseInt(ballsString.substring(i, i + 1))), + Position.valueOf(i))) + .collect(Collectors.toList()); + validate(balls); + } + + private void validate(List balls) { + long count = balls.stream() + .map(Ball::getBallNumber) + .distinct() + .count(); + if (count != SIZE || balls.size() != SIZE) { + throw new IllegalArgumentException(); + } + } + + public GameResult compare(Balls other) { + int ballCount = count(other, this::checkBall); + int strikeCount = count(other, this::checkStrike); + return GameResult.of(ballCount, strikeCount); + } + + private int count(Balls other, Predicate checker) { + return (int) other.balls.stream() + .filter(otherBall -> checker.test(otherBall)) + .count(); + } + + private boolean checkBall(Ball otherBall) { + return balls.stream() + .anyMatch(ball -> ball.isBall(otherBall)); + } + + private boolean checkStrike(Ball otherBall) { + return balls.stream() + .anyMatch(ball -> ball.isStrike(otherBall)); + } + +} diff --git a/src/main/java/baseball/model/ComputerBallsGenerator.java b/src/main/java/baseball/model/ComputerBallsGenerator.java new file mode 100644 index 0000000000..6ab71f8e55 --- /dev/null +++ b/src/main/java/baseball/model/ComputerBallsGenerator.java @@ -0,0 +1,29 @@ +package baseball.model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ComputerBallsGenerator { + public Balls generate() { + List balls = new ArrayList<>(); + List uniqueNumbers = generateUniqueNumbers(); + for (int pos = 0; pos < Balls.SIZE; pos++) { + BallNumber ballNumber = BallNumber.valueOf(uniqueNumbers.get(pos)); + Position position = Position.valueOf(pos); + balls.add(new Ball(ballNumber, position)); + } + return new Balls(balls); + } + + private List generateUniqueNumbers() { + Set numbers = new HashSet<>(); + while (numbers.size() < Balls.SIZE) { + numbers.add(Randoms.pickNumberInRange(BallNumber.NUMBER_LOWER_BOUNDS, BallNumber.NUMBER_UPPER_BOUNDS)); + } + return new ArrayList(numbers); + } +} diff --git a/src/main/java/baseball/model/GameResult.java b/src/main/java/baseball/model/GameResult.java new file mode 100644 index 0000000000..79bed5d946 --- /dev/null +++ b/src/main/java/baseball/model/GameResult.java @@ -0,0 +1,41 @@ +package baseball.model; + +import java.util.Arrays; + +public enum GameResult { + STRIKE_3_BALL_0(3, 0, "3스트라이크"), + STRIKE_2_BALL_1(2, 1, "1볼 2스트라이크"), + STRIKE_1_BALL_2(1, 2, "2볼 1스트라이크"), + STRIKE_0_BALL_3(0, 3, "3볼"), + STRIKE_2_BALL_0(2, 0, "2스트라이크"), + STRIKE_1_BALL_1(1, 1, "1볼 1스트라이크"), + STRIKE_0_BALL_2(0, 2, "2볼"), + STRIKE_1_BALL_0(1, 0, "1스트라이크"), + STRIKE_0_BALL_1(0, 1, "1볼"), + OUT(0, 0, "낫싱"); + + private final int strike; + private final int ball; + private final String result; + + GameResult(int strike, int ball, String result) { + this.strike = strike; + this.ball = ball; + this.result = result; + } + + public static GameResult of(int ballCount, int strikeCount) { + return Arrays.stream(values()) + .filter(gameResult -> gameResult.strike == strikeCount && gameResult.ball == ballCount) + .findAny() + .orElseThrow(() -> new IllegalArgumentException()); + } + + public String getResult() { + return result; + } + + public boolean isRight() { + return this == STRIKE_3_BALL_0; + } +} diff --git a/src/main/java/baseball/model/Position.java b/src/main/java/baseball/model/Position.java new file mode 100644 index 0000000000..d1d459f1a3 --- /dev/null +++ b/src/main/java/baseball/model/Position.java @@ -0,0 +1,37 @@ +package baseball.model; + +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +public class Position { + private final int position; + + private static final Map CACHE = new HashMap<>(); + + static { + for (int position = 0; position < Balls.SIZE; position++) { + CACHE.put(position, new Position(position)); + } + } + + private Position(int position) { + validate(position); + this.position = position; + } + + private static void validate(int position) { + if (position < 0 || position >= Balls.SIZE) { + throw new IllegalArgumentException(); + } + } + + public static Position valueOf(int position) { + validate(position); + return CACHE.get(position); + } + + public int getPosition() { + return position; + } +} diff --git a/src/main/java/baseball/model/RestartCommand.java b/src/main/java/baseball/model/RestartCommand.java new file mode 100644 index 0000000000..ed6cfe742f --- /dev/null +++ b/src/main/java/baseball/model/RestartCommand.java @@ -0,0 +1,25 @@ +package baseball.model; + +import java.util.Arrays; + +public enum RestartCommand { + RESTART(1), + END(0); + + private final int code; + + RestartCommand(int code) { + this.code = code; + } + + public static RestartCommand from(int code) { + return Arrays.stream(values()) + .filter(restartCommand -> restartCommand.code == code) + .findAny() + .orElseThrow(() -> new IllegalArgumentException()); + } + + public boolean isRestart() { + return this == RESTART; + } +} diff --git a/src/main/java/baseball/view/InputValidator.java b/src/main/java/baseball/view/InputValidator.java new file mode 100644 index 0000000000..b1c4b40ea7 --- /dev/null +++ b/src/main/java/baseball/view/InputValidator.java @@ -0,0 +1,24 @@ +package baseball.view; + +import baseball.model.Balls; + +public class InputValidator { + public static void validateNumbers(String numbers) { + if (numbers.length() != Balls.SIZE) { + throw new IllegalArgumentException(); + } + try { + Integer.parseInt(numbers); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + } + + public static void validateRestart(String restart) { + try { + Integer.parseInt(restart); + } catch (NumberFormatException e) { + throw new IllegalArgumentException(); + } + } +} diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 0000000000..3ee43e000c --- /dev/null +++ b/src/main/java/baseball/view/InputView.java @@ -0,0 +1,31 @@ +package baseball.view; + +import baseball.model.RestartCommand; +import camp.nextstep.edu.missionutils.Console; + +import java.util.Objects; + +public class InputView { + private static InputView inputView; + + public static InputView getInstance() { + if (Objects.isNull(inputView)) { + inputView = new InputView(); + } + return inputView; + } + + public String inputNumbers() { + System.out.print("숫자를 입력해주세요 : "); + String numbers = Console.readLine(); + InputValidator.validateNumbers(numbers); + return numbers; + } + + public RestartCommand inputRestart() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String restart = Console.readLine(); + InputValidator.validateRestart(restart); + return RestartCommand.from(Integer.parseInt(restart)); + } +} diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java new file mode 100644 index 0000000000..4c2c69266a --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,31 @@ +package baseball.view; + +import baseball.model.GameResult; + +import java.util.Objects; + +public class OutputView { + private static OutputView outputView; + + public static OutputView getInstance() { + if (Objects.isNull(outputView)) { + outputView = new OutputView(); + } + return outputView; + } + + public void printStart() { + System.out.println("숫자 야구 게임을 시작합니다."); + } + + public void printResult(GameResult gameResult) { + System.out.println(gameResult.getResult()); + printRight(gameResult); + } + + private void printRight(GameResult gameResult) { + if (gameResult.isRight()) { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } + } +} diff --git a/src/test/java/baseball/model/BallNumberTest.java b/src/test/java/baseball/model/BallNumberTest.java new file mode 100644 index 0000000000..c68fb81603 --- /dev/null +++ b/src/test/java/baseball/model/BallNumberTest.java @@ -0,0 +1,23 @@ +package baseball.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class BallNumberTest { + @ParameterizedTest + @ValueSource(ints = {1, 2, 9}) + void valueOf(int ballNumber) { + assertThat(BallNumber.valueOf(ballNumber).getBallNumber()).isEqualTo(ballNumber); + } + + @ParameterizedTest + @ValueSource(ints = {0, 10}) + void valueOf_예외_던진다(int ballNumber) { + assertThatThrownBy(() -> Position.valueOf(ballNumber)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file diff --git a/src/test/java/baseball/model/BallsTest.java b/src/test/java/baseball/model/BallsTest.java new file mode 100644 index 0000000000..d6e42c27ed --- /dev/null +++ b/src/test/java/baseball/model/BallsTest.java @@ -0,0 +1,50 @@ +package baseball.model; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class BallsTest { + + Balls computer = new Balls(List.of( + new Ball(BallNumber.valueOf(2), Position.valueOf(0)), + new Ball(BallNumber.valueOf(4), Position.valueOf(1)), + new Ball(BallNumber.valueOf(3), Position.valueOf(2)) + )); + + @ParameterizedTest + @MethodSource("userBallsAndGameResult") + void compare(Balls user, GameResult expected) { + assertThat(computer.compare(user)).isEqualTo(expected); + } + + static Stream userBallsAndGameResult() { + return Stream.of( + Arguments.of( + new Balls(List.of(new Ball(BallNumber.valueOf(2), Position.valueOf(0)), + new Ball(BallNumber.valueOf(4), Position.valueOf(1)), + new Ball(BallNumber.valueOf(3), Position.valueOf(2)))), + GameResult.of(0, 3) + ), + Arguments.of( + new Balls(List.of(new Ball(BallNumber.valueOf(2), Position.valueOf(0)), + new Ball(BallNumber.valueOf(3), Position.valueOf(1)), + new Ball(BallNumber.valueOf(7), Position.valueOf(2)))), + GameResult.of(1, 1) + ), + Arguments.of( + new Balls(List.of(new Ball(BallNumber.valueOf(1), Position.valueOf(0)), + new Ball(BallNumber.valueOf(7), Position.valueOf(1)), + new Ball(BallNumber.valueOf(5), Position.valueOf(2)))), + GameResult.of(0, 0) + ) + ); + } +} \ No newline at end of file diff --git a/src/test/java/baseball/model/PositionTest.java b/src/test/java/baseball/model/PositionTest.java new file mode 100644 index 0000000000..7bd4884008 --- /dev/null +++ b/src/test/java/baseball/model/PositionTest.java @@ -0,0 +1,26 @@ +package baseball.model; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class PositionTest { + + @ParameterizedTest + @ValueSource(ints = {0, 1, 2}) + void valueOf(int position) { + assertThat(Position.valueOf(position).getPosition()).isEqualTo(position); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 3}) + void valueOf_예외_던진다(int position) { + assertThatThrownBy(() -> Position.valueOf(position)) + .isInstanceOf(IllegalArgumentException.class); + } +} \ No newline at end of file From 0884f94d39553d22aa38ca99d5e2021a62991857 Mon Sep 17 00:00:00 2001 From: dhkim Date: Wed, 30 Nov 2022 19:49:03 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 11 ++++- .../controller/BaseballGameController.java | 29 ++++++----- src/main/java/baseball/model/Ball.java | 21 ++++---- src/main/java/baseball/model/BallNumber.java | 32 +++++++------ src/main/java/baseball/model/Balls.java | 48 +++++++++++-------- .../java/baseball/model/BaseballGame.java | 44 +++++++++++++++++ .../model/ComputerBallsGenerator.java | 27 ++++++----- .../{RestartCommand.java => GameCommand.java} | 12 ++--- src/main/java/baseball/model/GameResult.java | 31 ++++++------ src/main/java/baseball/model/GameStatus.java | 6 +++ src/main/java/baseball/model/Position.java | 18 ++++--- .../java/baseball/view/InputValidator.java | 5 +- src/main/java/baseball/view/InputView.java | 29 +++++++---- src/main/java/baseball/view/OutputView.java | 15 +++--- .../java/baseball/model/BallNumberTest.java | 5 +- 15 files changed, 215 insertions(+), 118 deletions(-) create mode 100644 src/main/java/baseball/model/BaseballGame.java rename src/main/java/baseball/model/{RestartCommand.java => GameCommand.java} (58%) create mode 100644 src/main/java/baseball/model/GameStatus.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 422287e5e5..71e0b86ff3 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,12 +1,21 @@ package baseball; import baseball.controller.BaseballGameController; +import baseball.model.BaseballGame; import baseball.model.ComputerBallsGenerator; public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 - BaseballGameController baseballGameController = new BaseballGameController(new ComputerBallsGenerator()); + BaseballGameController baseballGameController = new BaseballGameController(baseballGame()); baseballGameController.run(); } + + private static BaseballGame baseballGame() { + return new BaseballGame(computerBallsGenerator()); + } + + private static ComputerBallsGenerator computerBallsGenerator() { + return new ComputerBallsGenerator(); + } } diff --git a/src/main/java/baseball/controller/BaseballGameController.java b/src/main/java/baseball/controller/BaseballGameController.java index 5894b0f59d..57ce324203 100644 --- a/src/main/java/baseball/controller/BaseballGameController.java +++ b/src/main/java/baseball/controller/BaseballGameController.java @@ -1,35 +1,38 @@ package baseball.controller; import baseball.model.Balls; +import baseball.model.BaseballGame; import baseball.model.ComputerBallsGenerator; import baseball.model.GameResult; import baseball.view.InputView; import baseball.view.OutputView; +import java.util.List; + public class BaseballGameController { private final InputView inputView = InputView.getInstance(); private final OutputView outputView = OutputView.getInstance(); - private final ComputerBallsGenerator computerBallsGenerator; + private final BaseballGame baseballGame; - public BaseballGameController(ComputerBallsGenerator computerBallsGenerator) { - this.computerBallsGenerator = computerBallsGenerator; + public BaseballGameController(BaseballGame baseballGame) { + this.baseballGame = baseballGame; + baseballGame.init(); } public void run() { - outputView.printStart(); - do { + outputView.printStartingMessage(); + while (baseballGame.isContinuing()) { playAGame(); - } while (inputView.inputRestart().isRestart()); + baseballGame.checkRegame(inputView.inputGameCommand()); + } } private void playAGame() { - GameResult gameResult = null; - Balls computerBalls = computerBallsGenerator.generate(); - do { - String inputNumbers = inputView.inputNumbers(); - Balls user = new Balls(inputNumbers); - gameResult = computerBalls.compare(user); + while (baseballGame.isContinuing()) { + List inputNumbers = inputView.inputNumbers(); + GameResult gameResult = baseballGame.compare(inputNumbers); outputView.printResult(gameResult); - } while (!gameResult.isRight()); + } + outputView.printWinningMessage(); } } diff --git a/src/main/java/baseball/model/Ball.java b/src/main/java/baseball/model/Ball.java index a2b0628d87..d720b9dcfb 100644 --- a/src/main/java/baseball/model/Ball.java +++ b/src/main/java/baseball/model/Ball.java @@ -1,26 +1,27 @@ package baseball.model; public class Ball { - private final BallNumber ballNumber; + private final BallNumber number; private final Position position; - public Ball(BallNumber ballNumber, Position position) { - this.ballNumber = ballNumber; + public Ball(BallNumber number, Position position) { + this.number = number; this.position = position; } + public static Ball from(int number, int position) { + return new Ball(BallNumber.valueOf(number), Position.valueOf(position)); + } + public boolean isBall(Ball other) { - if (position == other.position) { - return false; - } - return ballNumber == other.ballNumber; + return !position.equals(other.position) && number.equals(other.number); } public boolean isStrike(Ball other) { - return position == other.position && ballNumber == other.ballNumber; + return position.equals(other.position) && number.equals(other.number); } - public BallNumber getBallNumber() { - return ballNumber; + public BallNumber getNumber() { + return number; } } diff --git a/src/main/java/baseball/model/BallNumber.java b/src/main/java/baseball/model/BallNumber.java index d11c4b8acd..0a539779c6 100644 --- a/src/main/java/baseball/model/BallNumber.java +++ b/src/main/java/baseball/model/BallNumber.java @@ -2,36 +2,40 @@ import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class BallNumber { - public static final int NUMBER_LOWER_BOUNDS = 1; - public static final int NUMBER_UPPER_BOUNDS = 9; + public static final int LOWER_BOUNDS = 1; + public static final int UPPER_BOUNDS = 9; private static final Map CACHE = new HashMap<>(); - private final int ballNumber; + private final int number; static { - for (int number = NUMBER_LOWER_BOUNDS; number <= NUMBER_UPPER_BOUNDS; number++) { + for (int number = LOWER_BOUNDS; number <= UPPER_BOUNDS; number++) { CACHE.put(number, new BallNumber(number)); } } - private BallNumber(int ballNumber) { - validate(ballNumber); - this.ballNumber = ballNumber; + private BallNumber(int number) { + validate(number); + this.number = number; } - private static void validate(int ballNumber) { - if (ballNumber < NUMBER_LOWER_BOUNDS || ballNumber > NUMBER_UPPER_BOUNDS) { + private void validate(int ballNumber) { + if (ballNumber < LOWER_BOUNDS || ballNumber > UPPER_BOUNDS) { throw new IllegalArgumentException(); } } - public static BallNumber valueOf(int ballNumber) { - validate(ballNumber); - return CACHE.get(ballNumber); + public static BallNumber valueOf(int number) { + BallNumber ballNumber = CACHE.get(number); + if (Objects.isNull(ballNumber)) { + ballNumber = new BallNumber(number); + } + return ballNumber; } - public int getBallNumber() { - return ballNumber; + public int getNumber() { + return number; } } diff --git a/src/main/java/baseball/model/Balls.java b/src/main/java/baseball/model/Balls.java index 1d771c0f86..1d60c9c4bc 100644 --- a/src/main/java/baseball/model/Balls.java +++ b/src/main/java/baseball/model/Balls.java @@ -10,49 +10,59 @@ public class Balls { private final List balls; + public static Balls from(List numbers) { + List ballList = IntStream.range(0, numbers.size()) + .mapToObj(i -> Ball.from(numbers.get(i), i)) + .collect(Collectors.toList()); + return new Balls(ballList); + } + public Balls(List balls) { validate(balls); this.balls = balls; } - public Balls(String ballsString) { - balls = IntStream.range(0, ballsString.length()) - .mapToObj(i -> new Ball(BallNumber.valueOf(Integer.parseInt(ballsString.substring(i, i + 1))), - Position.valueOf(i))) - .collect(Collectors.toList()); - validate(balls); + private void validate(List balls) { + validateSize(balls); + validateDuplication(balls); } - private void validate(List balls) { - long count = balls.stream() - .map(Ball::getBallNumber) + private void validateSize(List balls) { + if (balls.size() != SIZE) { + throw new IllegalArgumentException(); + } + } + + private void validateDuplication(List balls) { + long uniqueBallsCount = balls.stream() + .map(Ball::getNumber) .distinct() .count(); - if (count != SIZE || balls.size() != SIZE) { + + if (uniqueBallsCount != SIZE) { throw new IllegalArgumentException(); } } - public GameResult compare(Balls other) { - int ballCount = count(other, this::checkBall); - int strikeCount = count(other, this::checkStrike); + public GameResult compare(Balls opponent) { + int ballCount = countFiltered(opponent, this::ballPredicate); + int strikeCount = countFiltered(opponent, this::strikePredicate); return GameResult.of(ballCount, strikeCount); } - private int count(Balls other, Predicate checker) { - return (int) other.balls.stream() - .filter(otherBall -> checker.test(otherBall)) + private int countFiltered(Balls opponent, Predicate filter) { + return (int) opponent.balls.stream() + .filter(opponentBall -> filter.test(opponentBall)) .count(); } - private boolean checkBall(Ball otherBall) { + private boolean ballPredicate(Ball otherBall) { return balls.stream() .anyMatch(ball -> ball.isBall(otherBall)); } - private boolean checkStrike(Ball otherBall) { + private boolean strikePredicate(Ball otherBall) { return balls.stream() .anyMatch(ball -> ball.isStrike(otherBall)); } - } diff --git a/src/main/java/baseball/model/BaseballGame.java b/src/main/java/baseball/model/BaseballGame.java new file mode 100644 index 0000000000..12d30b3de2 --- /dev/null +++ b/src/main/java/baseball/model/BaseballGame.java @@ -0,0 +1,44 @@ +package baseball.model; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class BaseballGame { + private final ComputerBallsGenerator computerBallsGenerator; + private GameStatus gameStatus; + private Balls computerBalls; + + public BaseballGame(ComputerBallsGenerator computerBallsGenerator) { + this.computerBallsGenerator = computerBallsGenerator; + } + + public void init() { + gameStatus = GameStatus.CONTINUING; + computerBalls = computerBallsGenerator.generate(); + } + + public boolean isContinuing() { + return gameStatus.equals(GameStatus.CONTINUING); + } + + public GameResult compare(List inputNumbers) { + Balls userBalls = Balls.from(inputNumbers); + GameResult result = computerBalls.compare(userBalls); + checkUserWin(result); + return result; + } + + private void checkUserWin(GameResult result) { + if (result.isWin()) { + gameStatus = GameStatus.STOP; + } + } + + public void checkRegame(GameCommand gameCommand) { + if (gameCommand.isRestart()) { + gameStatus = GameStatus.CONTINUING; + computerBalls = computerBallsGenerator.generate(); + } + } +} diff --git a/src/main/java/baseball/model/ComputerBallsGenerator.java b/src/main/java/baseball/model/ComputerBallsGenerator.java index 6ab71f8e55..729346f959 100644 --- a/src/main/java/baseball/model/ComputerBallsGenerator.java +++ b/src/main/java/baseball/model/ComputerBallsGenerator.java @@ -6,24 +6,29 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static java.util.stream.Collectors.*; public class ComputerBallsGenerator { public Balls generate() { - List balls = new ArrayList<>(); List uniqueNumbers = generateUniqueNumbers(); - for (int pos = 0; pos < Balls.SIZE; pos++) { - BallNumber ballNumber = BallNumber.valueOf(uniqueNumbers.get(pos)); - Position position = Position.valueOf(pos); - balls.add(new Ball(ballNumber, position)); - } - return new Balls(balls); + return IntStream.rangeClosed(Position.LOWER_BOUNDS, Position.UPPER_BOUNDS) + .mapToObj(position -> Ball.from(uniqueNumbers.get(position), position)) + .collect(collectingAndThen(toList(), Balls::new)); } private List generateUniqueNumbers() { - Set numbers = new HashSet<>(); - while (numbers.size() < Balls.SIZE) { - numbers.add(Randoms.pickNumberInRange(BallNumber.NUMBER_LOWER_BOUNDS, BallNumber.NUMBER_UPPER_BOUNDS)); + Set uniqueNumbers = new HashSet<>(); + while (hasEnough(uniqueNumbers)) { + int number = Randoms.pickNumberInRange(BallNumber.LOWER_BOUNDS, BallNumber.UPPER_BOUNDS); + uniqueNumbers.add(number); } - return new ArrayList(numbers); + return new ArrayList(uniqueNumbers); + } + + private static boolean hasEnough(Set uniqueNumbers) { + return uniqueNumbers.size() < Balls.SIZE; } } diff --git a/src/main/java/baseball/model/RestartCommand.java b/src/main/java/baseball/model/GameCommand.java similarity index 58% rename from src/main/java/baseball/model/RestartCommand.java rename to src/main/java/baseball/model/GameCommand.java index ed6cfe742f..0d4a7643f0 100644 --- a/src/main/java/baseball/model/RestartCommand.java +++ b/src/main/java/baseball/model/GameCommand.java @@ -2,24 +2,24 @@ import java.util.Arrays; -public enum RestartCommand { +public enum GameCommand { RESTART(1), - END(0); + TERMINATION(2); private final int code; - RestartCommand(int code) { + GameCommand(int code) { this.code = code; } - public static RestartCommand from(int code) { + public static GameCommand from(int code) { return Arrays.stream(values()) - .filter(restartCommand -> restartCommand.code == code) + .filter(gameCommand -> gameCommand.code == code) .findAny() .orElseThrow(() -> new IllegalArgumentException()); } public boolean isRestart() { - return this == RESTART; + return this.equals(RESTART); } } diff --git a/src/main/java/baseball/model/GameResult.java b/src/main/java/baseball/model/GameResult.java index 79bed5d946..cf32a29ceb 100644 --- a/src/main/java/baseball/model/GameResult.java +++ b/src/main/java/baseball/model/GameResult.java @@ -4,7 +4,6 @@ public enum GameResult { STRIKE_3_BALL_0(3, 0, "3스트라이크"), - STRIKE_2_BALL_1(2, 1, "1볼 2스트라이크"), STRIKE_1_BALL_2(1, 2, "2볼 1스트라이크"), STRIKE_0_BALL_3(0, 3, "3볼"), STRIKE_2_BALL_0(2, 0, "2스트라이크"), @@ -12,30 +11,34 @@ public enum GameResult { STRIKE_0_BALL_2(0, 2, "2볼"), STRIKE_1_BALL_0(1, 0, "1스트라이크"), STRIKE_0_BALL_1(0, 1, "1볼"), - OUT(0, 0, "낫싱"); + NOTHING(0, 0, "낫싱"); - private final int strike; - private final int ball; - private final String result; + private final int strikeCount; + private final int ballCount; + private final String output; - GameResult(int strike, int ball, String result) { - this.strike = strike; - this.ball = ball; - this.result = result; + GameResult(int strikeCount, int ballCount, String output) { + this.strikeCount = strikeCount; + this.ballCount = ballCount; + this.output = output; } public static GameResult of(int ballCount, int strikeCount) { return Arrays.stream(values()) - .filter(gameResult -> gameResult.strike == strikeCount && gameResult.ball == ballCount) + .filter(gameResult -> gameResult.matches(ballCount, strikeCount)) .findAny() .orElseThrow(() -> new IllegalArgumentException()); } - public String getResult() { - return result; + private boolean matches(int ballCount, int strikeCount) { + return this.strikeCount == strikeCount && this.ballCount == ballCount; } - public boolean isRight() { - return this == STRIKE_3_BALL_0; + public String getOutput() { + return output; + } + + public boolean isWin() { + return this.equals(STRIKE_3_BALL_0); } } diff --git a/src/main/java/baseball/model/GameStatus.java b/src/main/java/baseball/model/GameStatus.java new file mode 100644 index 0000000000..cbf9baf385 --- /dev/null +++ b/src/main/java/baseball/model/GameStatus.java @@ -0,0 +1,6 @@ +package baseball.model; + +public enum GameStatus { + CONTINUING, + STOP; +} diff --git a/src/main/java/baseball/model/Position.java b/src/main/java/baseball/model/Position.java index d1d459f1a3..9098875a51 100644 --- a/src/main/java/baseball/model/Position.java +++ b/src/main/java/baseball/model/Position.java @@ -3,14 +3,17 @@ import java.util.Calendar; import java.util.HashMap; import java.util.Map; +import java.util.Objects; public class Position { + public static final int LOWER_BOUNDS = 0; + public static final int UPPER_BOUNDS = 2; private final int position; private static final Map CACHE = new HashMap<>(); static { - for (int position = 0; position < Balls.SIZE; position++) { + for (int position = LOWER_BOUNDS; position <= UPPER_BOUNDS; position++) { CACHE.put(position, new Position(position)); } } @@ -20,15 +23,18 @@ private Position(int position) { this.position = position; } - private static void validate(int position) { - if (position < 0 || position >= Balls.SIZE) { + private void validate(int position) { + if (position < LOWER_BOUNDS || position > UPPER_BOUNDS) { throw new IllegalArgumentException(); } } - public static Position valueOf(int position) { - validate(position); - return CACHE.get(position); + public static Position valueOf(int number) { + Position position = CACHE.get(number); + if (Objects.isNull(position)) { + position = new Position(number); + } + return position; } public int getPosition() { diff --git a/src/main/java/baseball/view/InputValidator.java b/src/main/java/baseball/view/InputValidator.java index b1c4b40ea7..f644dfe185 100644 --- a/src/main/java/baseball/view/InputValidator.java +++ b/src/main/java/baseball/view/InputValidator.java @@ -4,9 +4,6 @@ public class InputValidator { public static void validateNumbers(String numbers) { - if (numbers.length() != Balls.SIZE) { - throw new IllegalArgumentException(); - } try { Integer.parseInt(numbers); } catch (NumberFormatException e) { @@ -14,7 +11,7 @@ public static void validateNumbers(String numbers) { } } - public static void validateRestart(String restart) { + public static void validateCommandCode(String restart) { try { Integer.parseInt(restart); } catch (NumberFormatException e) { diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 3ee43e000c..aa1b4ec218 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -1,11 +1,16 @@ package baseball.view; -import baseball.model.RestartCommand; +import baseball.model.GameCommand; import camp.nextstep.edu.missionutils.Console; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class InputView { + public static final String INPUT_NUMBERS_MESSAGE = "숫자를 입력해주세요 : "; + public static final String INPUT_GAME_COMMAND_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; private static InputView inputView; public static InputView getInstance() { @@ -15,17 +20,23 @@ public static InputView getInstance() { return inputView; } - public String inputNumbers() { - System.out.print("숫자를 입력해주세요 : "); + public List inputNumbers() { + System.out.print(INPUT_NUMBERS_MESSAGE); String numbers = Console.readLine(); InputValidator.validateNumbers(numbers); - return numbers; + return toList(numbers); } - public RestartCommand inputRestart() { - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - String restart = Console.readLine(); - InputValidator.validateRestart(restart); - return RestartCommand.from(Integer.parseInt(restart)); + private static List toList(String numbers) { + return IntStream.range(0, numbers.length()) + .mapToObj(i -> Integer.parseInt(numbers.substring(i, i + 1))) + .collect(Collectors.toList()); + } + + public GameCommand inputGameCommand() { + System.out.println(INPUT_GAME_COMMAND_MESSAGE); + String commandCode = Console.readLine(); + InputValidator.validateCommandCode(commandCode); + return GameCommand.from(Integer.parseInt(commandCode)); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 4c2c69266a..f7ea90b222 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -5,6 +5,8 @@ import java.util.Objects; public class OutputView { + public static final String STARTING_MESSAGE = "숫자 야구 게임을 시작합니다."; + public static final String WINNING_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; private static OutputView outputView; public static OutputView getInstance() { @@ -14,18 +16,15 @@ public static OutputView getInstance() { return outputView; } - public void printStart() { - System.out.println("숫자 야구 게임을 시작합니다."); + public void printStartingMessage() { + System.out.println(STARTING_MESSAGE); } public void printResult(GameResult gameResult) { - System.out.println(gameResult.getResult()); - printRight(gameResult); + System.out.println(gameResult.getOutput()); } - private void printRight(GameResult gameResult) { - if (gameResult.isRight()) { - System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); - } + public void printWinningMessage() { + System.out.println(WINNING_MESSAGE); } } diff --git a/src/test/java/baseball/model/BallNumberTest.java b/src/test/java/baseball/model/BallNumberTest.java index c68fb81603..4bb1a5b218 100644 --- a/src/test/java/baseball/model/BallNumberTest.java +++ b/src/test/java/baseball/model/BallNumberTest.java @@ -5,19 +5,18 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; class BallNumberTest { @ParameterizedTest @ValueSource(ints = {1, 2, 9}) void valueOf(int ballNumber) { - assertThat(BallNumber.valueOf(ballNumber).getBallNumber()).isEqualTo(ballNumber); + assertThat(BallNumber.valueOf(ballNumber).getNumber()).isEqualTo(ballNumber); } @ParameterizedTest @ValueSource(ints = {0, 10}) void valueOf_예외_던진다(int ballNumber) { - assertThatThrownBy(() -> Position.valueOf(ballNumber)) + assertThatThrownBy(() -> BallNumber.valueOf(ballNumber)) .isInstanceOf(IllegalArgumentException.class); } } \ No newline at end of file From 0926e4fe86cee67bff23f879dd20a0840fe408b6 Mon Sep 17 00:00:00 2001 From: dhkim Date: Wed, 30 Nov 2022 20:38:35 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/controller/BaseballGameController.java | 2 +- src/main/java/baseball/model/Balls.java | 4 ++-- src/main/java/baseball/model/BaseballGame.java | 6 ++---- src/main/java/baseball/model/ComputerBallsGenerator.java | 6 +++--- src/main/java/baseball/model/GameResult.java | 8 ++++---- src/main/java/baseball/model/GameStatus.java | 4 ++++ 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballGameController.java b/src/main/java/baseball/controller/BaseballGameController.java index 57ce324203..a788e413a6 100644 --- a/src/main/java/baseball/controller/BaseballGameController.java +++ b/src/main/java/baseball/controller/BaseballGameController.java @@ -16,11 +16,11 @@ public class BaseballGameController { public BaseballGameController(BaseballGame baseballGame) { this.baseballGame = baseballGame; - baseballGame.init(); } public void run() { outputView.printStartingMessage(); + baseballGame.init(); while (baseballGame.isContinuing()) { playAGame(); baseballGame.checkRegame(inputView.inputGameCommand()); diff --git a/src/main/java/baseball/model/Balls.java b/src/main/java/baseball/model/Balls.java index 1d60c9c4bc..bcd562b366 100644 --- a/src/main/java/baseball/model/Balls.java +++ b/src/main/java/baseball/model/Balls.java @@ -50,9 +50,9 @@ public GameResult compare(Balls opponent) { return GameResult.of(ballCount, strikeCount); } - private int countFiltered(Balls opponent, Predicate filter) { + private int countFiltered(Balls opponent, Predicate predicate) { return (int) opponent.balls.stream() - .filter(opponentBall -> filter.test(opponentBall)) + .filter(predicate) .count(); } diff --git a/src/main/java/baseball/model/BaseballGame.java b/src/main/java/baseball/model/BaseballGame.java index 12d30b3de2..bb629e9bc3 100644 --- a/src/main/java/baseball/model/BaseballGame.java +++ b/src/main/java/baseball/model/BaseballGame.java @@ -1,8 +1,6 @@ package baseball.model; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; public class BaseballGame { private final ComputerBallsGenerator computerBallsGenerator; @@ -19,7 +17,7 @@ public void init() { } public boolean isContinuing() { - return gameStatus.equals(GameStatus.CONTINUING); + return gameStatus.isContinuing(); } public GameResult compare(List inputNumbers) { @@ -30,7 +28,7 @@ public GameResult compare(List inputNumbers) { } private void checkUserWin(GameResult result) { - if (result.isWin()) { + if (result.isUserWin()) { gameStatus = GameStatus.STOP; } } diff --git a/src/main/java/baseball/model/ComputerBallsGenerator.java b/src/main/java/baseball/model/ComputerBallsGenerator.java index 729346f959..e0f4a113f7 100644 --- a/src/main/java/baseball/model/ComputerBallsGenerator.java +++ b/src/main/java/baseball/model/ComputerBallsGenerator.java @@ -6,10 +6,10 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.IntStream; -import static java.util.stream.Collectors.*; +import static java.util.stream.Collectors.collectingAndThen; +import static java.util.stream.Collectors.toList; public class ComputerBallsGenerator { public Balls generate() { @@ -25,7 +25,7 @@ private List generateUniqueNumbers() { int number = Randoms.pickNumberInRange(BallNumber.LOWER_BOUNDS, BallNumber.UPPER_BOUNDS); uniqueNumbers.add(number); } - return new ArrayList(uniqueNumbers); + return new ArrayList<>(uniqueNumbers); } private static boolean hasEnough(Set uniqueNumbers) { diff --git a/src/main/java/baseball/model/GameResult.java b/src/main/java/baseball/model/GameResult.java index cf32a29ceb..f61beda95c 100644 --- a/src/main/java/baseball/model/GameResult.java +++ b/src/main/java/baseball/model/GameResult.java @@ -34,11 +34,11 @@ private boolean matches(int ballCount, int strikeCount) { return this.strikeCount == strikeCount && this.ballCount == ballCount; } - public String getOutput() { - return output; + public boolean isUserWin() { + return this.equals(STRIKE_3_BALL_0); } - public boolean isWin() { - return this.equals(STRIKE_3_BALL_0); + public String getOutput() { + return output; } } diff --git a/src/main/java/baseball/model/GameStatus.java b/src/main/java/baseball/model/GameStatus.java index cbf9baf385..5266ba50b1 100644 --- a/src/main/java/baseball/model/GameStatus.java +++ b/src/main/java/baseball/model/GameStatus.java @@ -3,4 +3,8 @@ public enum GameStatus { CONTINUING, STOP; + + public boolean isContinuing() { + return this.equals(CONTINUING); + } } From 2ebdc251be723c4c831c1e0522d4cc27ef11f54b Mon Sep 17 00:00:00 2001 From: dhkim Date: Wed, 30 Nov 2022 20:39:36 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/controller/BaseballGameController.java | 2 -- src/main/java/baseball/model/Position.java | 1 - src/main/java/baseball/view/InputValidator.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballGameController.java b/src/main/java/baseball/controller/BaseballGameController.java index a788e413a6..d2ab8389c5 100644 --- a/src/main/java/baseball/controller/BaseballGameController.java +++ b/src/main/java/baseball/controller/BaseballGameController.java @@ -1,8 +1,6 @@ package baseball.controller; -import baseball.model.Balls; import baseball.model.BaseballGame; -import baseball.model.ComputerBallsGenerator; import baseball.model.GameResult; import baseball.view.InputView; import baseball.view.OutputView; diff --git a/src/main/java/baseball/model/Position.java b/src/main/java/baseball/model/Position.java index 9098875a51..8e9ee34d17 100644 --- a/src/main/java/baseball/model/Position.java +++ b/src/main/java/baseball/model/Position.java @@ -1,6 +1,5 @@ package baseball.model; -import java.util.Calendar; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/baseball/view/InputValidator.java b/src/main/java/baseball/view/InputValidator.java index f644dfe185..b1d0a35267 100644 --- a/src/main/java/baseball/view/InputValidator.java +++ b/src/main/java/baseball/view/InputValidator.java @@ -1,7 +1,5 @@ package baseball.view; -import baseball.model.Balls; - public class InputValidator { public static void validateNumbers(String numbers) { try { From 8fe521a5bd6ec8b37d459af4407b517f371f85b2 Mon Sep 17 00:00:00 2001 From: dhkim Date: Thu, 1 Dec 2022 21:07:20 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 ++++- .../baseball/controller/BaseballGameController.java | 8 ++++++-- src/main/java/baseball/model/Balls.java | 10 +++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index fc2c175940..c9da2e53f9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,4 +7,7 @@ - [x] 생성된 수로 컴퓨터 수 생성 - [x] 비교 결과 생성 - [x] 볼, 스트라이크 개수 구하기 - - [x] 공 한 개가 볼인지 스트라이크인지 판정하기 \ No newline at end of file + - [x] 공 한 개가 볼인지 스트라이크인지 판정하기 + +### 고민한 부분 +- [x] \ No newline at end of file diff --git a/src/main/java/baseball/controller/BaseballGameController.java b/src/main/java/baseball/controller/BaseballGameController.java index d2ab8389c5..b126a08553 100644 --- a/src/main/java/baseball/controller/BaseballGameController.java +++ b/src/main/java/baseball/controller/BaseballGameController.java @@ -17,14 +17,18 @@ public BaseballGameController(BaseballGame baseballGame) { } public void run() { - outputView.printStartingMessage(); - baseballGame.init(); + initializeGame(); while (baseballGame.isContinuing()) { playAGame(); baseballGame.checkRegame(inputView.inputGameCommand()); } } + private void initializeGame() { + outputView.printStartingMessage(); + baseballGame.init(); + } + private void playAGame() { while (baseballGame.isContinuing()) { List inputNumbers = inputView.inputNumbers(); diff --git a/src/main/java/baseball/model/Balls.java b/src/main/java/baseball/model/Balls.java index bcd562b366..3f5c183964 100644 --- a/src/main/java/baseball/model/Balls.java +++ b/src/main/java/baseball/model/Balls.java @@ -44,14 +44,14 @@ private void validateDuplication(List balls) { } } - public GameResult compare(Balls opponent) { - int ballCount = countFiltered(opponent, this::ballPredicate); - int strikeCount = countFiltered(opponent, this::strikePredicate); + public GameResult compare(Balls other) { + int ballCount = countFiltered(other, this::ballPredicate); + int strikeCount = countFiltered(other, this::strikePredicate); return GameResult.of(ballCount, strikeCount); } - private int countFiltered(Balls opponent, Predicate predicate) { - return (int) opponent.balls.stream() + private int countFiltered(Balls other, Predicate predicate) { + return (int) other.balls.stream() .filter(predicate) .count(); }