diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 7f1901b8b..8f6e74a3a 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -2,6 +2,11 @@ public class Application { public static void main(String[] args) { + Controller controller = new Controller(); + controller.run(); //TODO: 숫자 야구 게임 구현 + + + } } diff --git a/src/main/java/baseball/Controller.java b/src/main/java/baseball/Controller.java new file mode 100644 index 000000000..43e0b812e --- /dev/null +++ b/src/main/java/baseball/Controller.java @@ -0,0 +1,57 @@ +package baseball; + +import baseball.service.GameService; +import baseball.view.RequestInput; +import baseball.view.SystemMessage; +import camp.nextstep.edu.missionutils.Console; + + public class Controller { + final int SIZE = 3; + final int START_INCLUSIVE = 1; + final int END_INCLUSIVE = 9; + final int RETRY = 1; + final int GAME_OVER = 2; + + GameService gameService = new GameService(); + + public void run() throws IllegalArgumentException { + setGame(); + startGame(); + endGame(); + askRetry(); + } + + private void setGame() { + gameService.setGame(SIZE, START_INCLUSIVE, END_INCLUSIVE); + } + + private void startGame() throws IllegalArgumentException { + gameService.playGame(); + } + + private void endGame() { + SystemMessage.printGameOverMessage(); + } + + /** + * 유저입력이 (문자 or 0 or 3 이상) : Exception + * 유저입력이 (1) : 재시작 + * 유저입력이 (2) : 종료 + */ + private void askRetry() throws IllegalArgumentException { + RequestInput.printRetryMessage(); + if (getInputNum() == RETRY) { + run(); + } + } + + private int getInputNum() throws IllegalArgumentException { + int inputNum = Integer.parseInt(Console.readLine()); + + if (inputNum == 0 || inputNum > GAME_OVER) { + throw new IllegalArgumentException(); + } + return inputNum; + } + } + diff --git a/src/main/java/baseball/domain/Game.java b/src/main/java/baseball/domain/Game.java new file mode 100644 index 000000000..20f92a2bb --- /dev/null +++ b/src/main/java/baseball/domain/Game.java @@ -0,0 +1,39 @@ +package baseball.domain; + +public class Game { + + int strikeCount; + int ballCount; + int[] gameNumbers; + + public Game(int[] numbers) { + gameNumbers = numbers; + } + + public void initBaseBall() { + strikeCount = 0; + ballCount = 0; + } + + public int getStrikeCount() { + return strikeCount; + } + + public int getBallCount() { + return ballCount; + } + + public int[] getGameNumbers() { + return gameNumbers; + } + + public void incStrikeCount() { + strikeCount += 1; + } + + public void incBallCount() { + ballCount += 1; + } + } + + diff --git a/src/main/java/baseball/domain/User.java b/src/main/java/baseball/domain/User.java new file mode 100644 index 000000000..18ff8b87b --- /dev/null +++ b/src/main/java/baseball/domain/User.java @@ -0,0 +1,15 @@ +package baseball.domain; + +public class User { + + int[] userNumbers; + + public int[] getUserNumbers() { + return userNumbers; + } + + public void setUserNumbers(int[] userNumbers) { + this.userNumbers = userNumbers; + } + } + diff --git a/src/main/java/baseball/service/GameService.java b/src/main/java/baseball/service/GameService.java new file mode 100644 index 000000000..cc8500a4d --- /dev/null +++ b/src/main/java/baseball/service/GameService.java @@ -0,0 +1,71 @@ +package baseball.service; + +import baseball.domain.Game; +import baseball.domain.User; +import baseball.utils.Parser; +import baseball.utils.RandomUtils; +import baseball.view.RequestInput; +import baseball.view.SystemMessage; +import camp.nextstep.edu.missionutils.Console; + +public class GameService { + + int size; + Game game; + User user = new User(); + Parser parser = new Parser(); + SystemMessage systemMessage = new SystemMessage(); + + public void setGame(int size, int start, int end) { + this.size = size; + game = new Game(RandomUtils.getRandomNumbers(size, start, end)); + } + + public void playGame() { + int strike = 0; + while (strike != 3) { + play(); + systemMessage.printScoreMessage(game.getBallCount(), game.getStrikeCount()); + strike = game.getStrikeCount(); + } + } + + private void play() { + game.initBaseBall(); + user.setUserNumbers(getUserNumber()); + computeScore(); + } + + private int[] getUserNumber() throws IllegalArgumentException { + RequestInput.requestInputData(); + String input = Console.readLine(); + return parser.parseUserInput(input, size); + } + + private void computeScore() { + for (int i = 0; i < size; i++) { + compute(game.getGameNumbers(), user.getUserNumbers(), i); + } + } + + private void compute(int[] gameNumber, int[] userNumber, int index) { + int temp = -1; + for (int i = 0; i < gameNumber.length; i++) { + if (gameNumber[i] == userNumber[index]) { + temp = i; + break; + } + } + incCount(index, temp); + } + + private void incCount(int index, int temp) { + if (temp != index && temp != -1) { + game.incBallCount(); + } + if (temp == index) { + game.incStrikeCount(); + } + } + } + diff --git a/src/main/java/baseball/utils/Parser.java b/src/main/java/baseball/utils/Parser.java new file mode 100644 index 000000000..0fac7286f --- /dev/null +++ b/src/main/java/baseball/utils/Parser.java @@ -0,0 +1,36 @@ +package baseball.utils; + +public class Parser { + + public int[] parseUserInput(String input, int size) throws IllegalArgumentException { + checkSize(input, size); + return getParseInt(input, size); + } + + private void checkSize(String input, int size) throws IllegalArgumentException { + if (input.length() != size) { + throw new IllegalArgumentException(); + } + } + + private int[] getParseInt(String input, int size) throws IllegalArgumentException { + int[] parseInt = new int[size]; + + for (int i = 0; i < input.length(); i++) { + if (!checkDigit(input, i)) { + throw new IllegalArgumentException(); + } + parseInt[i] = convertCharToInt(input, i); + } + return parseInt; + } + + private int convertCharToInt(String input, int i) { + return input.charAt(i) - '0'; + } + + private Boolean checkDigit(String input, int i) { + return '0' <= input.charAt(i) && input.charAt(i) <= '9'; + } + } + diff --git a/src/main/java/baseball/utils/RandomUtils.java b/src/main/java/baseball/utils/RandomUtils.java new file mode 100644 index 000000000..09ad12fd5 --- /dev/null +++ b/src/main/java/baseball/utils/RandomUtils.java @@ -0,0 +1,35 @@ +package baseball.utils; +import camp.nextstep.edu.missionutils.Randoms; + +public class RandomUtils { + + + + + public static int[] getRandomNumbers(int size, int start, int end) { + int[] numbers = new int[3]; + + for (int i = 0; i < size; i++) { + numbers[i] = getUniqueRandomNumber(numbers, start, end, i); + } + return numbers; + } + + private static int getUniqueRandomNumber(int[] numbers, int start, int end, int i) { + int randomNumber = Randoms.pickNumberInRange(start, end); + while (!isUnique(numbers, i, randomNumber)) { + randomNumber = Randoms.pickNumberInRange(start, end); + } + return randomNumber; + } + + private static Boolean isUnique(int[] numbers, int i, int randomNumber) { + for (int j = 0; j < i; j++) { + if (numbers[j] == randomNumber) { + return false; + } + } + return true; + } + } + diff --git a/src/main/java/baseball/view/RequestInput.java b/src/main/java/baseball/view/RequestInput.java new file mode 100644 index 000000000..f599fa7c9 --- /dev/null +++ b/src/main/java/baseball/view/RequestInput.java @@ -0,0 +1,11 @@ +package baseball.view; + +public class RequestInput { + public static void requestInputData() { + System.out.print("숫자를 입력해 주세요 : "); + } + + public static void printRetryMessage() { + System.out.println("게임을 다시 시작하려면 1, 종료하려면 2를 입력하세요."); + } +} diff --git a/src/main/java/baseball/view/SystemMessage.java b/src/main/java/baseball/view/SystemMessage.java new file mode 100644 index 000000000..980887c0a --- /dev/null +++ b/src/main/java/baseball/view/SystemMessage.java @@ -0,0 +1,23 @@ +package baseball.view; + +public class SystemMessage { + public void printScoreMessage(int ball, int strike) { + if (ball == 0 && strike == 0) { + System.out.println("낫싱"); + } + if (ball == 0 && strike != 0) { + System.out.println(strike + "스트라이크"); + } + if (ball != 0 && strike == 0) { + System.out.println(ball + "볼"); + } + if (ball != 0 && strike != 0) { + System.out.println(ball + "볼 " + strike + "스트라이크"); + } + } + + public static void printGameOverMessage() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + } +} +