diff --git a/README.md b/README.md
index 8cf0c69..a868909 100644
--- a/README.md
+++ b/README.md
@@ -130,7 +130,24 @@
---
+## 구현할 기능 목록
+- 컴퓨터가 임의의 수 3개 선택하도록 구현
+- 게임 진행
+ - 스트라이크일 경우
+ - 볼일 경우
+ - 낫싱일 경우
+- 3개의 숫자를 모두 맞힐시에 대한 결과 출력
+- 게임이 끝났을 경우에 대한 처리
+- 입력에 대한 에러처리
+ - 3자리의 수가 아닌경우
+ - 숫자가 아닌 입력을 받은 경우
+ - 입력받은 수가 서로 다른 자릿수가 아닐 경우
+ - 게임이 끝난 경우 재시작/종료를 구분하는 1과 2가 아닌 다른
+ 숫자를 입력한 경우
+
+
+---
## 📝 License
This project is [MIT](https://github.com/woowacourse/java-baseball-precourse/blob/master/LICENSE) licensed.
diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java
index 7f1901b..97dcc0c 100644
--- a/src/main/java/baseball/Application.java
+++ b/src/main/java/baseball/Application.java
@@ -1,7 +1,19 @@
package baseball;
+import baseball.controller.BaseballGame;
+import baseball.model.ComputerNumber;
+import baseball.model.Result;
+import baseball.model.UserNumber;
+import baseball.view.InputView;
+import baseball.view.OutputView;
+
+import java.awt.*;
+import java.util.List;
+
public class Application {
public static void main(String[] args) {
//TODO: 숫자 야구 게임 구현
+ BaseballGame baseballGame = new BaseballGame();
+ baseballGame.start();
}
}
diff --git a/src/main/java/baseball/controller/BaseballGame.java b/src/main/java/baseball/controller/BaseballGame.java
new file mode 100644
index 0000000..3875aae
--- /dev/null
+++ b/src/main/java/baseball/controller/BaseballGame.java
@@ -0,0 +1,52 @@
+package baseball.controller;
+
+import baseball.model.ComputerNumber;
+import baseball.model.Result;
+import baseball.model.UserNumber;
+import baseball.validate.ValidateRestart;
+import baseball.view.InputView;
+import baseball.view.OutputView;
+
+import java.util.List;
+
+public class BaseballGame {
+
+ public void start() {
+ do {
+ List computerRandomNumber = makeComputerNumber();
+ playGame(computerRandomNumber);
+ } while (isRestart());
+ }
+
+ public List makeComputerNumber() {
+ ComputerNumber computerNumber = new ComputerNumber();
+ return computerNumber.getRandomNum();
+ }
+
+ public void playGame(List computerRandomNumber) {
+ while (true) {
+ UserNumber inputUserNumber = new UserNumber(InputView.inputUserNumber());
+ Result result = makeResult(inputUserNumber, computerRandomNumber);
+ OutputView.printResult(result);
+ if (result.isSuccess()) {
+ break;
+ }
+ }
+ }
+
+ public Result makeResult(UserNumber inputUserNumber, List computerRandomNumber) {
+ Result result = new Result();
+ inputUserNumber.countBall(computerRandomNumber, result);
+ inputUserNumber.countStrike(computerRandomNumber, result);
+ result.updateIsNothing();
+ return result;
+ }
+
+ public boolean isRestart() {
+ OutputView.outputRestartMessage();
+ String inputUserRestartNumber = InputView.inputUserRestartNumber();
+ ValidateRestart.validateInputRestartNumber(inputUserRestartNumber);
+ return inputUserRestartNumber.equals("1");
+ }
+
+}
diff --git a/src/main/java/baseball/model/ComputerNumber.java b/src/main/java/baseball/model/ComputerNumber.java
new file mode 100644
index 0000000..65b19db
--- /dev/null
+++ b/src/main/java/baseball/model/ComputerNumber.java
@@ -0,0 +1,29 @@
+package baseball.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static camp.nextstep.edu.missionutils.Randoms.pickNumberInRange;
+
+public class ComputerNumber {
+ private List randomNum;
+
+ public ComputerNumber() {
+ this.randomNum = makeRandomNum();
+ }
+
+ public List makeRandomNum() {
+ List randomNum = new ArrayList<>();
+ while (randomNum.size() < 3) {
+ int random = pickNumberInRange(1, 9);
+ if (!randomNum.contains(random)) {
+ randomNum.add(random);
+ }
+ }
+ return randomNum;
+ }
+
+ public List getRandomNum() {
+ return this.randomNum;
+ }
+}
diff --git a/src/main/java/baseball/model/Result.java b/src/main/java/baseball/model/Result.java
new file mode 100644
index 0000000..3c4a238
--- /dev/null
+++ b/src/main/java/baseball/model/Result.java
@@ -0,0 +1,46 @@
+package baseball.model;
+
+/**
+ * 온전히 결과에 대한 책임만
+ */
+public class Result {
+ private int ball;
+ private int strike;
+ private boolean isNothing;
+
+ public Result() {
+ this.ball = 0;
+ this.strike = 0;
+ this.isNothing = false;
+ }
+
+ public int getBall() {
+ return ball;
+ }
+
+ public int getStrike() {
+ return strike;
+ }
+
+ public boolean isNothing() {
+ return isNothing;
+ }
+
+ public void updateBall() {
+ this.ball+=1;
+ }
+
+ public void updateStrike() {
+ this.strike+=1;
+ }
+
+ public void updateIsNothing() {
+ if (this.ball == 0 && this.strike == 0) {
+ this.isNothing = true;
+ }
+ }
+
+ public boolean isSuccess() {
+ return this.strike == 3;
+ }
+}
diff --git a/src/main/java/baseball/model/UserNumber.java b/src/main/java/baseball/model/UserNumber.java
new file mode 100644
index 0000000..0e62318
--- /dev/null
+++ b/src/main/java/baseball/model/UserNumber.java
@@ -0,0 +1,44 @@
+package baseball.model;
+
+import baseball.validate.ValidateUserNumber;
+
+import java.util.List;
+
+public class UserNumber {
+ private String userNum;
+
+ public UserNumber(String userNum) {
+ ValidateUserNumber.isNumber(userNum);
+ ValidateUserNumber.is3DigitNumber(userNum);
+ ValidateUserNumber.isDulplicateDigit(userNum);
+ this.userNum = userNum;
+ }
+
+ public String getUserNum() {
+ return this.userNum;
+ }
+
+ public void countBall(List computerNumber, Result result) {
+ for (int i = 0; i < computerNumber.size(); i++) {
+ checkBallByUserNumber(i, computerNumber, result);
+ }
+ }
+
+ public void checkBallByUserNumber(int i, List computerNumber, Result result) {
+ for (int j = 0; j < this.getUserNum().length(); j++) {
+ if (i != j && computerNumber.get(i) == Character.getNumericValue(this.userNum.charAt(j))) {
+ result.updateBall();
+ }
+ }
+ }
+
+ public void countStrike(List computerNumber, Result result) {
+ for (int i = 0; i < computerNumber.size(); i++) {
+ if (computerNumber.get(i) == Character.getNumericValue(this.userNum.charAt(i))) {
+ result.updateStrike();
+ }
+ }
+ }
+
+
+}
diff --git a/src/main/java/baseball/validate/ValidateRestart.java b/src/main/java/baseball/validate/ValidateRestart.java
new file mode 100644
index 0000000..6b1c810
--- /dev/null
+++ b/src/main/java/baseball/validate/ValidateRestart.java
@@ -0,0 +1,10 @@
+package baseball.validate;
+
+public class ValidateRestart {
+
+ public static void validateInputRestartNumber(String inputRestartNumber){
+ if (!inputRestartNumber.equals("1") && !inputRestartNumber.equals("2")) {
+ throw new IllegalArgumentException("잘못된 입력입니다");
+ }
+ }
+}
diff --git a/src/main/java/baseball/validate/ValidateUserNumber.java b/src/main/java/baseball/validate/ValidateUserNumber.java
new file mode 100644
index 0000000..c06f753
--- /dev/null
+++ b/src/main/java/baseball/validate/ValidateUserNumber.java
@@ -0,0 +1,30 @@
+package baseball.validate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class ValidateUserNumber {
+
+ public static void isNumber(String userNumber) {
+ try {
+ int toNumber = Integer.parseInt(userNumber);
+ } catch (NumberFormatException e) {
+ System.out.println("숫자로 입력해주세요");
+ }
+ }
+
+ public static void is3DigitNumber(String userNumber) {
+ if (userNumber.length() != 3) {
+ throw new IllegalArgumentException("3자리 숫자로 입력해주세요");
+ }
+ }
+
+ public static void isDulplicateDigit(String userNumber) {
+ Set digitSet = new HashSet<>();
+ for (char digit : userNumber.toCharArray()) {
+ if (!digitSet.add(digit)) {
+ throw new IllegalArgumentException("각 자리 숫자가 중복되지 않게 입력해주세요.");
+ }
+ }
+ }
+}
diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java
index 6c04755..08fc9e7 100644
--- a/src/main/java/baseball/view/InputView.java
+++ b/src/main/java/baseball/view/InputView.java
@@ -1,5 +1,15 @@
package baseball.view;
+import camp.nextstep.edu.missionutils.Console;
+
public class InputView {
+ public static String inputUserNumber() {
+ System.out.print("숫자를 입력해주세요 : ");
+ return Console.readLine();
+ }
+
+ public static String inputUserRestartNumber() {
+ return Console.readLine();
+ }
}
diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java
index dceccc5..168ecde 100644
--- a/src/main/java/baseball/view/OutputView.java
+++ b/src/main/java/baseball/view/OutputView.java
@@ -1,5 +1,55 @@
package baseball.view;
+import baseball.model.Result;
+
public class OutputView {
+ public static void printResult(Result result) {
+ if (result.isSuccess()) {
+ outputSuccessMessage();
+ }
+ if (!result.isSuccess()) {
+ printNotSuccessResult(result);
+ }
+ }
+
+ public static void printNotSuccessResult(Result result) {
+ outputNothingMessage(result);
+ outputBallMessage(result);
+ outputStrikeMessage(result);
+ outputBallStrikeMessage(result);
+ }
+
+
+ public static void outputNothingMessage(Result result) {
+ if (result.isNothing()) {
+ System.out.println("낫싱");
+ }
+ }
+
+ public static void outputBallMessage(Result result) {
+ if (result.getBall() > 0 && result.getStrike() == 0) {
+ System.out.println(result.getBall() + "볼");
+ }
+ }
+
+ public static void outputStrikeMessage(Result result) {
+ if (result.getStrike() > 0 && result.getBall() == 0) {
+ System.out.println(result.getStrike() + "스트라이크");
+ }
+ }
+
+ public static void outputBallStrikeMessage(Result result) {
+ if (result.getBall() > 0 && result.getStrike() > 0) {
+ System.out.println(result.getBall() + "볼 " + result.getStrike() + "스트라이크");
+ }
+ }
+
+ public static void outputSuccessMessage() {
+ System.out.println("3스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료");
+ }
+
+ public static void outputRestartMessage() {
+ System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
+ }
}