From 2da9c4b656917b3538fab63e9cd38cc7d4ec1add Mon Sep 17 00:00:00 2001 From: rakyun1 Date: Sun, 3 Dec 2023 20:12:41 -0700 Subject: [PATCH 1/6] Docks: add README.md --- docs/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2..98e7bba9f4 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,20 @@ +# 요구사항 +> ### 프로그램 기능 +> - #### 1부터 9까지의 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임 +> 1. 입력한 숫자가 같은 자리에 있을 경우 스트라이크 +> 2. 입력한 숫자가 다른 자리에 있을 경우 볼 +> 3. 입력한 수가 전혀 없을 경우 낫싱 +>- #### 컴퓨터는 1에서 9까지의 서로 다른 임의수 3개를 선택 +> 1. 사용자가 입력하는 값과 컴퓨터가 가지고 있는 값을 비교 +> 2. 3개의 숫자를 모두 맞히면 게임이 종료 되고 다시 시작하거나 완전히 종료할지 결정 가능 + +# 입력 +>- 서로 다른 3자리의 수를 매 판마다 입력 +>- 게임이 끝나고 난 후에 재시작/종료를 구분하는 1과 2 중 하나의 수 + +# 출력 +> - 사용자가 입력한 수에 대한 결과를 볼, 스트라이크 개수로 표시 +> - 하나도 없는 경우 낫싱 + +# 예외처리 +> - 사용자가 잘못된 값을 입력할 경우에 IllegalArgumentException을 발생 \ No newline at end of file From 75b1e4e9f508980270fe0c315b48580fcc29c4e4 Mon Sep 17 00:00:00 2001 From: rakyun1 Date: Tue, 5 Dec 2023 04:53:09 -0700 Subject: [PATCH 2/6] =?UTF-8?q?Feat:=20add=20Answer.java=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=ED=95=9C=203=EA=B0=9C=EC=9D=98=20=EC=88=AB=EC=9E=90(?= =?UTF-8?q?=EC=A0=95=EB=8B=B5)=EB=A5=BC=20=EC=83=9D=EC=84=B1=20=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20=ED=95=84=EB=93=9C=EC=97=90=20=EA=B0=80=EC=A7=80?= =?UTF-8?q?=EA=B3=A0=20=EC=9E=88=EA=B3=A0,=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EC=9D=98=20=EC=9E=85=EB=A0=A5=20=EA=B0=92=EC=9D=84=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=84=9C=20=EC=A0=95=EB=8B=B5=EA=B3=BC=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=ED=9B=84=20=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EB=A6=AC?= =?UTF-8?q?=ED=84=B4=20=ED=95=B4=EC=A3=BC=EB=8A=94=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Answer.java | 55 ++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/baseball/Answer.java diff --git a/src/main/java/baseball/Answer.java b/src/main/java/baseball/Answer.java new file mode 100644 index 0000000000..11d66ea2db --- /dev/null +++ b/src/main/java/baseball/Answer.java @@ -0,0 +1,55 @@ +package baseball; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class Answer { + List answer; + public Answer(){ + answer = new ArrayList<>(); + makeAnswer(); + } + + private void makeAnswer() { + while (answer.size() < 3) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + if (!answer.contains(randomNumber)) { + answer.add(randomNumber); + } + } + } + + private List getResult(int[] userNumber){ + return answerTransforming(checkAnswer(userNumber)); + } + + private List answerTransforming(List integerResult) { + List result = new ArrayList<>(); + if (integerResult.get(0) == 0 && integerResult.get(1) == 0){ + result.add("낫싱"); + return result; + } + result.add(integerResult.get(0) + "스트라이크"); + result.add(integerResult.get(1) + "볼"); + return result; + } + + private List checkAnswer(int[] userNumber) { + int strike = 0; + int ball = 0; + for (int i = 0; i < answer.size(); i++){ + for (int j = 0; j < answer.size(); j++){ + if (j == i && answer.get(i).equals(userNumber[j])) { + strike++; + } + else if (answer.get(i).equals(userNumber[j])) ball++; + } + } + List result = new ArrayList<>(); + result.add(strike); + result.add(ball); + return result; + } + + +} From f7cfa588be34e14b32ec78fb8e7964f939c5412d Mon Sep 17 00:00:00 2001 From: rakyun1 Date: Tue, 5 Dec 2023 04:59:30 -0700 Subject: [PATCH 3/6] =?UTF-8?q?Feat:=20add=20Output.java=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EC=97=90=EA=B2=8C=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A4=84=20=EC=B6=9C=EB=A0=A5=EB=AC=B8=EC=9D=84=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9D=BC=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 8 +++++++- src/main/java/baseball/Application.java | 3 +++ src/main/java/baseball/Controller.java | 5 +++++ src/main/java/baseball/Input.java | 5 +++++ src/main/java/baseball/Output.java | 23 +++++++++++++++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/Controller.java create mode 100644 src/main/java/baseball/Input.java create mode 100644 src/main/java/baseball/Output.java diff --git a/docs/README.md b/docs/README.md index 98e7bba9f4..6d288062fe 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,4 +17,10 @@ > - 하나도 없는 경우 낫싱 # 예외처리 -> - 사용자가 잘못된 값을 입력할 경우에 IllegalArgumentException을 발생 \ No newline at end of file +> - 사용자가 잘못된 값을 입력할 경우에 IllegalArgumentException을 발생 + +1부터 9까지 중 랜더함 3개의 숫자를 생성하는 NumberMaker +사용자의 입력을 받는 input +출력을 하는 output +사령관 역할의 컨트롤러 하나 +사용자가 입력한 값을 만들어진 3자리의 숫자와 비교하는 CheckNumber diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..a746860e83 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,10 @@ package baseball; + + public class Application { public static void main(String[] args) { // TODO: 프로그램 구현 + } } diff --git a/src/main/java/baseball/Controller.java b/src/main/java/baseball/Controller.java new file mode 100644 index 0000000000..1e903c1a1c --- /dev/null +++ b/src/main/java/baseball/Controller.java @@ -0,0 +1,5 @@ +package baseball; + +public class Controller { + +} diff --git a/src/main/java/baseball/Input.java b/src/main/java/baseball/Input.java new file mode 100644 index 0000000000..33b8c3675d --- /dev/null +++ b/src/main/java/baseball/Input.java @@ -0,0 +1,5 @@ +package baseball; + +public class Input { + +} diff --git a/src/main/java/baseball/Output.java b/src/main/java/baseball/Output.java new file mode 100644 index 0000000000..df3741bf44 --- /dev/null +++ b/src/main/java/baseball/Output.java @@ -0,0 +1,23 @@ +package baseball; + +import java.util.List; + +public class Output { + public void start(){ + System.out.println("숫자 야구 게임을 시작합니다."); + } + + public void enterNumber(){ + System.out.println("숫자를 입력해주세요 : "); + } + + public void result(List result){ + result.forEach(i -> System.out.println(i + " ")); + } + + public void endGame(){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + } + +} From b46b128f0177b45e2b41f8269af3b0ddbff9c109 Mon Sep 17 00:00:00 2001 From: rakyun1 Date: Tue, 5 Dec 2023 05:31:28 -0700 Subject: [PATCH 4/6] =?UTF-8?q?Feat:=20add=20Input.java=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EC=9D=98=20=EC=9E=85=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=20=EC=9C=A0=ED=9A=A8=EC=84=B1=EC=9D=84=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=ED=95=98=EA=B3=A0=20int[]=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=ED=95=B4=20=EB=A6=AC=ED=84=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Input.java | 57 +++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/main/java/baseball/Input.java b/src/main/java/baseball/Input.java index 33b8c3675d..68629153ec 100644 --- a/src/main/java/baseball/Input.java +++ b/src/main/java/baseball/Input.java @@ -1,5 +1,62 @@ package baseball; +import static camp.nextstep.edu.missionutils.Console.readLine; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class Input { + final String ERROR = "[ERROR]"; + public int[] getUserInput() throws IllegalArgumentException{ + String input = readLine(); + validateInput(input); + return transformInput(input); + } + + private void validateInput(String input) throws IllegalArgumentException{ + isThreeNumber(input); + isNumber(input); + isNotDuplicate(input); + } + + private void isNotDuplicate(String input) { + HashSet uniqueValue = new HashSet<>(); + for (int i = 0; i < input.length(); i++){ + String subString = input.substring(i, i + 3); + uniqueValue.add(subString); + } + if (uniqueValue.size() != 3) throw new IllegalArgumentException(ERROR + " 중복된 값은 입력이 불가능 합니다."); + } + + private void isNumber(String input) { + if (input.matches("\\d+")) throw new IllegalArgumentException(ERROR + " 숫자만 입력 가능합니다."); + } + + private void isThreeNumber(String input) { + if (!(input.length() == 3)) throw new IllegalArgumentException(ERROR + " 3개의 숫자를 입력해주세요"); + } + + private int[] transformInput(String input) { + return charArrToIntArr(stringToCharArr(input)); + } + private char[] stringToCharArr(String input){ + char[] transformedInput = new char[input.length()]; + for (int i = 0; i < input.length(); i++){ + transformedInput[i] = input.charAt(i); + } + return transformedInput; + } + private int[] charArrToIntArr(char[] transformedInput){ + int[] userNumber = new int[transformedInput.length]; + for (int i = 0; i < transformedInput.length; i++) { + userNumber[i] = Character.getNumericValue(transformedInput[i]); + } + return userNumber; + } } From c0ce317a2870fe46eecb4692fb052147e1e5d4b6 Mon Sep 17 00:00:00 2001 From: rakyun1 Date: Tue, 5 Dec 2023 05:50:27 -0700 Subject: [PATCH 5/6] =?UTF-8?q?Test:=20add=20InputTest.java=20Input.java?= =?UTF-8?q?=EB=A5=BC=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=81=B4=EB=9D=BC=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Output.java | 1 - src/test/java/baseball/InputTest.java | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/test/java/baseball/InputTest.java diff --git a/src/main/java/baseball/Output.java b/src/main/java/baseball/Output.java index df3741bf44..6766ee334e 100644 --- a/src/main/java/baseball/Output.java +++ b/src/main/java/baseball/Output.java @@ -19,5 +19,4 @@ public void endGame(){ System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); } - } diff --git a/src/test/java/baseball/InputTest.java b/src/test/java/baseball/InputTest.java new file mode 100644 index 0000000000..b120c5b017 --- /dev/null +++ b/src/test/java/baseball/InputTest.java @@ -0,0 +1,25 @@ +package baseball; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +public class InputTest { + Input input = new Input(); + @Test + void TestisNotDuplicateWhenUserInputIsDuplicate(){ + String duplicateValue = "111"; + assertThrows(IllegalArgumentException.class, () -> { + input.isNotDuplicate(duplicateValue); + }); + } + + @Test + void testIsNotDuplicateWhenUserInputIsNotDuplicate() { + String nonDuplicateValue = "123"; + assertDoesNotThrow(() -> { + input.isNotDuplicate(nonDuplicateValue); + }); + } +} From 60a99067512111efad237b134bf2c5829c5ff759 Mon Sep 17 00:00:00 2001 From: rakyun1 Date: Tue, 5 Dec 2023 06:34:28 -0700 Subject: [PATCH 6/6] complete --- src/main/java/baseball/Answer.java | 15 ++++++++----- src/main/java/baseball/Application.java | 4 +++- src/main/java/baseball/Controller.java | 25 ++++++++++++++++++++- src/main/java/baseball/Input.java | 21 ++++++++--------- src/main/java/baseball/Output.java | 5 +++-- src/test/java/baseball/ApplicationTest.java | 2 +- src/test/java/baseball/InputTest.java | 8 +++++++ 7 files changed, 57 insertions(+), 23 deletions(-) diff --git a/src/main/java/baseball/Answer.java b/src/main/java/baseball/Answer.java index 11d66ea2db..3c16aff3ee 100644 --- a/src/main/java/baseball/Answer.java +++ b/src/main/java/baseball/Answer.java @@ -5,12 +5,13 @@ public class Answer { List answer; + List transformedResult; public Answer(){ - answer = new ArrayList<>(); makeAnswer(); } - private void makeAnswer() { + public void makeAnswer() { + answer = new ArrayList<>(); while (answer.size() < 3) { int randomNumber = Randoms.pickNumberInRange(1, 9); if (!answer.contains(randomNumber)) { @@ -19,8 +20,8 @@ private void makeAnswer() { } } - private List getResult(int[] userNumber){ - return answerTransforming(checkAnswer(userNumber)); + public List getResult(){ + return transformedResult; } private List answerTransforming(List integerResult) { @@ -34,7 +35,8 @@ private List answerTransforming(List integerResult) { return result; } - private List checkAnswer(int[] userNumber) { + public boolean checkAnswer(int[] userNumber) { + transformedResult = new ArrayList<>(); int strike = 0; int ball = 0; for (int i = 0; i < answer.size(); i++){ @@ -48,7 +50,8 @@ private List checkAnswer(int[] userNumber) { List result = new ArrayList<>(); result.add(strike); result.add(ball); - return result; + transformedResult = answerTransforming(result); + return result.get(0) == 3; } diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index a746860e83..6aad84cd91 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -3,8 +3,10 @@ public class Application { + public static void main(String[] args) { + Controller controller = new Controller(); // TODO: 프로그램 구현 - + controller.startGame(); } } diff --git a/src/main/java/baseball/Controller.java b/src/main/java/baseball/Controller.java index 1e903c1a1c..d033b1b1f3 100644 --- a/src/main/java/baseball/Controller.java +++ b/src/main/java/baseball/Controller.java @@ -1,5 +1,28 @@ package baseball; public class Controller { - + Input input; + Output output; + Answer answer; + public Controller(){ + input = new Input(); + output = new Output(); + answer = new Answer(); + } + public void startGame(){ + output.start(); + while (true){ + output.enterNumber(); + if (answer.checkAnswer(input.getUserInput())) { + output.endGame(); + if (input.isRestart()) { + answer.makeAnswer(); + output.result(answer.getResult()); + continue; + } + else break; + } + output.result(answer.getResult()); + } + } } diff --git a/src/main/java/baseball/Input.java b/src/main/java/baseball/Input.java index 68629153ec..f8e18135d3 100644 --- a/src/main/java/baseball/Input.java +++ b/src/main/java/baseball/Input.java @@ -2,13 +2,7 @@ import static camp.nextstep.edu.missionutils.Console.readLine; -import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; public class Input { final String ERROR = "[ERROR]"; @@ -24,17 +18,16 @@ private void validateInput(String input) throws IllegalArgumentException{ isNotDuplicate(input); } - private void isNotDuplicate(String input) { + public void isNotDuplicate(String input) { HashSet uniqueValue = new HashSet<>(); - for (int i = 0; i < input.length(); i++){ - String subString = input.substring(i, i + 3); - uniqueValue.add(subString); + for (int i = 0; i < input.length(); i++) { + uniqueValue.add(String.valueOf(input.charAt(i))); } if (uniqueValue.size() != 3) throw new IllegalArgumentException(ERROR + " 중복된 값은 입력이 불가능 합니다."); } - private void isNumber(String input) { - if (input.matches("\\d+")) throw new IllegalArgumentException(ERROR + " 숫자만 입력 가능합니다."); + public void isNumber(String input) { + if (!input.matches("\\d+")) throw new IllegalArgumentException(ERROR + " 숫자만 입력 가능합니다."); } private void isThreeNumber(String input) { @@ -58,5 +51,9 @@ private int[] charArrToIntArr(char[] transformedInput){ } return userNumber; } + public boolean isRestart(){ + String confirmation = readLine(); + return Integer.parseInt(confirmation) == 1; + } } diff --git a/src/main/java/baseball/Output.java b/src/main/java/baseball/Output.java index 6766ee334e..aa6d4a07e9 100644 --- a/src/main/java/baseball/Output.java +++ b/src/main/java/baseball/Output.java @@ -8,11 +8,12 @@ public void start(){ } public void enterNumber(){ - System.out.println("숫자를 입력해주세요 : "); + System.out.print("숫자를 입력해주세요 : "); } public void result(List result){ - result.forEach(i -> System.out.println(i + " ")); + result.forEach(i -> System.out.print(i + " ")); + System.out.println(" "); } public void endGame(){ diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java index 3fa29fa67b..c35ad93c3b 100644 --- a/src/test/java/baseball/ApplicationTest.java +++ b/src/test/java/baseball/ApplicationTest.java @@ -14,7 +14,7 @@ class ApplicationTest extends NsTest { assertRandomNumberInRangeTest( () -> { run("246", "135", "1", "597", "589", "2"); - assertThat(output()).contains("낫싱", "3스트라이크", "1볼 1스트라이크", "3스트라이크", "게임 종료"); + assertThat(output()).contains("낫싱", "3스트라이크", "1스트라이크 1볼", "3스트라이크", "게임 종료"); }, 1, 3, 5, 5, 8, 9 ); diff --git a/src/test/java/baseball/InputTest.java b/src/test/java/baseball/InputTest.java index b120c5b017..d9b0dbc4de 100644 --- a/src/test/java/baseball/InputTest.java +++ b/src/test/java/baseball/InputTest.java @@ -22,4 +22,12 @@ void testIsNotDuplicateWhenUserInputIsNotDuplicate() { input.isNotDuplicate(nonDuplicateValue); }); } + + @Test + void testIsNumber(){ + String notNumber = "abc"; + assertThrows(IllegalArgumentException.class, () -> { + input.isNumber(notNumber); + }); + } }