diff --git a/docs/README.md b/docs/README.md index e69de29bb2..1ffc0e4046 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,85 @@ +# ⚾ BaseBall Game +## 요구 사항 분석 +### 게임 규칙 +>같은 수가 같은 자리에 있으면 Strike +>
+>같은 수가 다른 자리에 있으면 Ball +>
+>같은 수가 하나도 없으면 Nothing +>
+>Strike, Ball, Nothing의 힌트를 가지고 Computer의 수를 맞추면 승리 +>
+> 예시)Compuer의 수 : 829일때 +>
+> 123을 제시 : 1스트라이크 +>
+> 456을 제시 : 낫싱 +>
+> 189을 제시 : 1볼 1스트라이크 + +
+ +### 게임 진행 과정 +> 게임 플레이어는 서로 다른 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과물 출력 + +
+ +### 게임 종료 조건 +> 컴퓨터의 숫자 3개를 모두 맞추면 게임 종료 + +
+ +### 게임 종료 후 처리 방법 +> 게임을 다시 시작하거나 종료 + + + +
+ +### 예외 조건 +1. 입력값이 길이가 3이 초과가 되는지 +2. 입력값이 정수형이 아닌지 +3. 입력값이 서로 다른 수가 아니라 중복되는 수인지 +4. 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException()을 발생시킨 후 애플리케이션 종료 + +
+ +## 구현 목록 + +### Controller +- GameController + - 시작 기능 + + + +### Model +- Game + - 컴퓨터 정답 생성 + - 결과값 생성 + - 현재 상태 (이겼는지 / 재시작 할건지 / 종료할건지) + +- GameResult + - 컴퓨터 vs 유저 값 판단하여 스트라이크, 볼 개수 판단 + - 결과를 string형으로 변환 + +### View +- GameView + - 출력 인터페이스 + +### Service +- CheckUserNumber + - 예외 처리 기능 + - 입력 길이 3 이상인지 + - 입력 값이 정수인지 + - 입력 값이 중복되는지 + +
+ +## 커밋 방법 [깃 배쉬] +1. git clone --bare [forked한 레포지 주소] +2. cd [forked한 레포지 주소] +3. git push --mirror [새 레포지 주소] +4. cd .. +5. rm -rf [forked한 레포지 주소] + +
diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..8fb21daf19 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,17 @@ package baseball; +import baseball.Controller.GameController; +import baseball.View.GameView; +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + public class Application { + public static void main(String[] args) { - // TODO: 프로그램 구현 + GameController gameController = new GameController(); + gameController.GameStart(); } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/Controller/GameController.java b/src/main/java/baseball/Controller/GameController.java new file mode 100644 index 0000000000..7175469b29 --- /dev/null +++ b/src/main/java/baseball/Controller/GameController.java @@ -0,0 +1,38 @@ +package baseball.Controller; + +import baseball.Service.CheckUserNumber; +import baseball.Model.Game; +import baseball.View.GameView; + +import java.util.List; + +public class GameController { + + private final GameView gameView = new GameView(); + + public GameController(){ + gameView.showGameStart(); + } + + public void GameStart(){ + Game game = new Game(); + while(game.gamestatus()){ + gameView.showInputNumbers(); //숫자를 입력해 주세요: + String strInputNumbers = gameView.getInput(); //입력받아 string형에 저장 + CheckUserNumber check = new CheckUserNumber(strInputNumbers); //오류 검사 + List UserNumbers = game.stringToIntList(strInputNumbers); //console로 입력 받으면 string형 이기 때문에 비교과 쉽게 List로 변환 + + String Gameresult = game.makeGameResult(UserNumbers); + gameView.showString(Gameresult); + } + gameView.showGameEnd(); + + gameView.showInputRestart(); + String strInputRestart = gameView.getInput(); + if (game.isRestart(strInputRestart)) { + GameStart(); + } + } + + +} diff --git a/src/main/java/baseball/Model/Game.java b/src/main/java/baseball/Model/Game.java new file mode 100644 index 0000000000..001febff6d --- /dev/null +++ b/src/main/java/baseball/Model/Game.java @@ -0,0 +1,67 @@ +package baseball.Model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.List; + +public class Game { + + private final List answerNumbers = new ArrayList<>(); + private boolean GameStatus; + private final boolean Playing = true; + private final boolean End = false; + private final String RESTART = "1"; + private final String QUIT = "2"; + public Game(){ + this.setAnswerNumbers(); + this.GameStatus = Playing; + } + + public void setAnswerNumbers(){ + while (this.answerNumbers.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + if (!this.answerNumbers.contains(randomNumber)) { + this.answerNumbers.add(randomNumber); + } + } + } + + public String makeGameResult(List inputNumbers) { + GameResult gameResult = new GameResult(this.answerNumbers, inputNumbers); + applyResult(gameResult.getStrikes()); + return gameResult.resultToString(); + } + + public void applyResult(int strike) { + if (strike == 3) { + this.GameStatus = End; + } + } + + public boolean gamestatus() { + return this.GameStatus; + } + + + public boolean isRestart(String input) { + if (input.equals(RESTART)) { + return true; + } else if (input.equals(QUIT)) { + return false; + } else { + throw new IllegalArgumentException(); + } + } + + + public List stringToIntList(String String) { //입력값을 List로 변경 + List intList = new ArrayList<>(); + for (int i = 0; i < String.length(); i++) { + char digitChar = String.charAt(i); + int digitInt = Character.getNumericValue(digitChar); + intList.add(digitInt); + } + return intList; + } +} diff --git a/src/main/java/baseball/Model/GameResult.java b/src/main/java/baseball/Model/GameResult.java new file mode 100644 index 0000000000..372ff48a82 --- /dev/null +++ b/src/main/java/baseball/Model/GameResult.java @@ -0,0 +1,44 @@ +package baseball.Model; + +import java.util.List; + +public class GameResult { + + private int ball = 0; + private int strike = 0; + + GameResult(List answerNumbers, List UserNumbers ){ + for(int i=0; i charSet = new HashSet<>(); + for (int i = 0; i < String.length(); i++) { + char currentChar = String.charAt(i); + if (charSet.contains(currentChar)) { + throw new IllegalArgumentException(); + } + charSet.add(currentChar); + } + } +} diff --git a/src/main/java/baseball/View/GameView.java b/src/main/java/baseball/View/GameView.java new file mode 100644 index 0000000000..f36caa01db --- /dev/null +++ b/src/main/java/baseball/View/GameView.java @@ -0,0 +1,34 @@ +package baseball.View; + +import camp.nextstep.edu.missionutils.Console; + +public class GameView { + private final static String GAME_START = "숫자 야구 게임을 시작합니다."; + private final static String INPUT_NUMBERS = "숫자를 입력해주세요 : "; + private final static String GAME_END = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + private final static String INPUT_RESTART = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + + public void showGameStart() { + System.out.println(GAME_START); + } + + public void showInputNumbers() { + System.out.print(INPUT_NUMBERS); + } + + public void showGameEnd() { + System.out.println(GAME_END); + } + + public void showInputRestart() { + System.out.println(INPUT_RESTART); + } + + public void showString(String string) { + System.out.println(string); + } + + public String getInput() { + return Console.readLine(); + } +} diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java index 3fa29fa67b..f9c4121d02 100644 --- a/src/test/java/baseball/ApplicationTest.java +++ b/src/test/java/baseball/ApplicationTest.java @@ -7,6 +7,7 @@ import static camp.nextstep.edu.missionutils.test.Assertions.assertSimpleTest; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; class ApplicationTest extends NsTest { @Test @@ -32,4 +33,4 @@ class ApplicationTest extends NsTest { public void runMain() { Application.main(new String[]{}); } -} +} \ No newline at end of file