From 8dad83aa36846b070efcb0d03e5484368197df65 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 10:53:25 +0900 Subject: [PATCH 01/27] feat : init new-pow project --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2..eacbed9848 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,2 @@ +# 이린 + From f5ecc163e5ef84457dc3a363d891f5bfc05cefb0 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 11:39:06 +0900 Subject: [PATCH 02/27] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=B4=88=EC=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index eacbed9848..5cda21c0f3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,2 +1,25 @@ -# 이린 +# 숫자야구 +기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. + +- [] 게임 시작 Controller#gameStart +- [] 야구 게임 시작 메시지 출력 Print +- [] 랜덤 숫자 3개 생성 NumberGenerator# + - [] 각 숫자는 중복되지 않는가? Number + - [] 각 숫자는 1~9까지 숫자인가? Number +- [] 숫자 입력 + - [] 각 숫자는 중복되지 않는가? Number + - [] 각 숫자는 1~9까지 숫자인가? Number + - [] 숫자가 3개인가? + - [] 숫자 인가? +- [] 정답 숫자와 비교 + - [] 숫자가 같고, 자리수가 다르면 '볼' + - [] 숫자가 같고, 자리수도 같으면 '스트라이크' + - [] ball, strike가 둘다 없으면 '낫싱' + - [] 에러 발생시 다시 입력받기 +- [] 정답인지 확인 + - [] 3스트라이크 시 정답 +- [] 게임 재시작 + - [] 1 입력시 재시작 Controller#gameStart + - [] 2 입력시 종료 Controller#gameEnd + - [] 그 외 입력시 다시 입력받기 From af8936c0f9fb546e3aa33a5279635bbfb6365f1f Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:19:48 +0900 Subject: [PATCH 03/27] =?UTF-8?q?add=20:=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=9D=84=20=EC=9C=84=ED=95=9C=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- src/main/java/baseball/Baseball.java | 2 ++ src/main/java/baseball/BaseballController.java | 2 ++ src/main/java/baseball/BaseballJudge.java | 4 ++++ src/main/java/baseball/NumberGenerator.java | 2 ++ src/main/java/baseball/view/Error.java | 2 ++ src/main/java/baseball/view/Message.java | 4 ++++ 7 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 src/main/java/baseball/Baseball.java create mode 100644 src/main/java/baseball/BaseballController.java create mode 100644 src/main/java/baseball/BaseballJudge.java create mode 100644 src/main/java/baseball/NumberGenerator.java create mode 100644 src/main/java/baseball/view/Error.java create mode 100644 src/main/java/baseball/view/Message.java diff --git a/docs/README.md b/docs/README.md index 5cda21c0f3..161bfddbe0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,8 +4,8 @@ - [] 게임 시작 Controller#gameStart - [] 야구 게임 시작 메시지 출력 Print - [] 랜덤 숫자 3개 생성 NumberGenerator# - - [] 각 숫자는 중복되지 않는가? Number - - [] 각 숫자는 1~9까지 숫자인가? Number + - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication + - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange - [] 숫자 입력 - [] 각 숫자는 중복되지 않는가? Number - [] 각 숫자는 1~9까지 숫자인가? Number diff --git a/src/main/java/baseball/Baseball.java b/src/main/java/baseball/Baseball.java new file mode 100644 index 0000000000..81ab81f51c --- /dev/null +++ b/src/main/java/baseball/Baseball.java @@ -0,0 +1,2 @@ +package baseball;public class Baseball { +} diff --git a/src/main/java/baseball/BaseballController.java b/src/main/java/baseball/BaseballController.java new file mode 100644 index 0000000000..0c9e6bc775 --- /dev/null +++ b/src/main/java/baseball/BaseballController.java @@ -0,0 +1,2 @@ +package baseball;public class BaseballController { +} diff --git a/src/main/java/baseball/BaseballJudge.java b/src/main/java/baseball/BaseballJudge.java new file mode 100644 index 0000000000..443dd7fdce --- /dev/null +++ b/src/main/java/baseball/BaseballJudge.java @@ -0,0 +1,4 @@ +package baseball; + +public class Judge { +} diff --git a/src/main/java/baseball/NumberGenerator.java b/src/main/java/baseball/NumberGenerator.java new file mode 100644 index 0000000000..fd65d875b7 --- /dev/null +++ b/src/main/java/baseball/NumberGenerator.java @@ -0,0 +1,2 @@ +package baseball;public class NumberGenerator { +} diff --git a/src/main/java/baseball/view/Error.java b/src/main/java/baseball/view/Error.java new file mode 100644 index 0000000000..b133b2472e --- /dev/null +++ b/src/main/java/baseball/view/Error.java @@ -0,0 +1,2 @@ +package baseball;public class Error { +} diff --git a/src/main/java/baseball/view/Message.java b/src/main/java/baseball/view/Message.java new file mode 100644 index 0000000000..414831b5aa --- /dev/null +++ b/src/main/java/baseball/view/Message.java @@ -0,0 +1,4 @@ +package baseball; + +public class Message { +} From 1f6b360ac45a0982be6a4f358a4f64b577b31606 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:20:30 +0900 Subject: [PATCH 04/27] =?UTF-8?q?feat=20(Baseball)=20:=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EB=B2=94=EC=9C=84=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Baseball.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/baseball/Baseball.java b/src/main/java/baseball/Baseball.java index 81ab81f51c..56a10f650f 100644 --- a/src/main/java/baseball/Baseball.java +++ b/src/main/java/baseball/Baseball.java @@ -1,2 +1,9 @@ package baseball;public class Baseball { + private void checkValidRange(List numbers) { + for (int num : numbers) { + if (1 > num || num > 9) { + throw new IllegalArgumentException("[ERROR] 각 숫자는 1이상 9이하로 입력해주세요."); + } + } + } } From ae1e4b115f47dca1542929def2ce589cf0e34bd6 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:20:50 +0900 Subject: [PATCH 05/27] =?UTF-8?q?feat=20(Baseball)=20:=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=88=AB=EC=9E=90=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Baseball.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/baseball/Baseball.java b/src/main/java/baseball/Baseball.java index 56a10f650f..a2cd618b06 100644 --- a/src/main/java/baseball/Baseball.java +++ b/src/main/java/baseball/Baseball.java @@ -1,4 +1,11 @@ package baseball;public class Baseball { + private void checkDuplication(List numbers) { + Set numbersSet = new HashSet<>(numbers); + if (numbersSet.size() != numbers.size()) { + throw new IllegalArgumentException("[ERROR] 각 숫자는 1이상 9이하로 입력해주세요."); + } + } + private void checkValidRange(List numbers) { for (int num : numbers) { if (1 > num || num > 9) { From b2ab42f88d573cd86a747fc8c24c34add72122e4 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:21:29 +0900 Subject: [PATCH 06/27] =?UTF-8?q?feat=20(Baseball)=20:=20baseball=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1=EC=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Baseball.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/Baseball.java b/src/main/java/baseball/Baseball.java index a2cd618b06..22a7253a71 100644 --- a/src/main/java/baseball/Baseball.java +++ b/src/main/java/baseball/Baseball.java @@ -1,4 +1,20 @@ -package baseball;public class Baseball { +package baseball; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class Baseball { + List numbers; + + public Baseball(int num1, int num2, int num3) { + List numbers = Arrays.asList(num1, num2, num3); + checkValidRange(numbers); + checkDuplication(numbers); + this.numbers = Arrays.asList(num1, num2, num3); + } + private void checkDuplication(List numbers) { Set numbersSet = new HashSet<>(numbers); if (numbersSet.size() != numbers.size()) { @@ -13,4 +29,7 @@ private void checkValidRange(List numbers) { } } } + + + } From e90d9f6e8f48534d050ce62ed03e957b5d470316 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:37:42 +0900 Subject: [PATCH 07/27] =?UTF-8?q?feat=20(Baseball)=20:=20baseball=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EB=A9=94=EC=84=9C=EB=93=9C,=20numbers=20g?= =?UTF-8?q?etter=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/{ => domain}/Baseball.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) rename src/main/java/baseball/{ => domain}/Baseball.java (69%) diff --git a/src/main/java/baseball/Baseball.java b/src/main/java/baseball/domain/Baseball.java similarity index 69% rename from src/main/java/baseball/Baseball.java rename to src/main/java/baseball/domain/Baseball.java index 22a7253a71..1a6dabf552 100644 --- a/src/main/java/baseball/Baseball.java +++ b/src/main/java/baseball/domain/Baseball.java @@ -1,4 +1,4 @@ -package baseball; +package baseball.domain; import java.util.Arrays; import java.util.HashSet; @@ -6,15 +6,27 @@ import java.util.Set; public class Baseball { - List numbers; + private List numbers; + private final int NUMBERS_SIZE = 3; public Baseball(int num1, int num2, int num3) { List numbers = Arrays.asList(num1, num2, num3); + checkSize(numbers); checkValidRange(numbers); checkDuplication(numbers); this.numbers = Arrays.asList(num1, num2, num3); } + public List getNumbers() { + return numbers; + } + + private void checkSize(List numbers) { + if (numbers.size() != NUMBERS_SIZE) { + throw new IllegalArgumentException("[ERROR] 3자리 숫자를 입력해주세요."); + } + } + private void checkDuplication(List numbers) { Set numbersSet = new HashSet<>(numbers); if (numbersSet.size() != numbers.size()) { From a272e98890a4f26ed6a991ab479e120d2dbcc766 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:38:02 +0900 Subject: [PATCH 08/27] =?UTF-8?q?docs=20(Baseball)=20:=20baseball=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC=20=EB=A9=94=EC=84=9C=EB=93=9C,=20numbers=20g?= =?UTF-8?q?etter=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 161bfddbe0..c79473ac5d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,12 +4,12 @@ - [] 게임 시작 Controller#gameStart - [] 야구 게임 시작 메시지 출력 Print - [] 랜덤 숫자 3개 생성 NumberGenerator# - - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication - - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange + - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication() + - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() - [] 숫자 입력 - [] 각 숫자는 중복되지 않는가? Number - [] 각 숫자는 1~9까지 숫자인가? Number - - [] 숫자가 3개인가? + - [] 숫자가 3개인가? Baseball#checkSize() - [] 숫자 인가? - [] 정답 숫자와 비교 - [] 숫자가 같고, 자리수가 다르면 '볼' From aa2b78a0aa1983d865ac286c3e4536fffcf951ce Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 12:38:55 +0900 Subject: [PATCH 09/27] =?UTF-8?q?test=20(baseball)=20:=20baseball=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EA=B8=B0=EB=B3=B8=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/BaseballTest.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/test/java/baseball/BaseballTest.java diff --git a/src/test/java/baseball/BaseballTest.java b/src/test/java/baseball/BaseballTest.java new file mode 100644 index 0000000000..1fcf21f827 --- /dev/null +++ b/src/test/java/baseball/BaseballTest.java @@ -0,0 +1,23 @@ +package baseball; + +import baseball.domain.Baseball; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class BaseballTest { + + @Test + void 야구숫자유효성검사_기본기능() { + Baseball baseball = new Baseball(1,2,3); + assertThat(new Baseball(1,2,3).getNumbers()).hasSize(3); + } + + @Test + void 야구숫자유효성검사_숫자_배열() { + Baseball baseball = new Baseball(1,2,3); + assertThat(new Baseball(1,2,5).getNumbers()).contains(1,2,5); + } + + +} \ No newline at end of file From e54c34f83ecf0b056aae1045ffa2f1f99947d832 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 13:15:45 +0900 Subject: [PATCH 10/27] =?UTF-8?q?feat=20(NumberGenerator)=20:=203=EC=9E=90?= =?UTF-8?q?=EB=A6=AC=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB=EC=9E=90=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/util/NumberGenerator.java | 26 +++++++++++++++++++ .../baseball/util/NumberGeneratorTest.java | 4 +++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/baseball/util/NumberGenerator.java create mode 100644 src/test/java/baseball/util/NumberGeneratorTest.java diff --git a/src/main/java/baseball/util/NumberGenerator.java b/src/main/java/baseball/util/NumberGenerator.java new file mode 100644 index 0000000000..10a4b7aa3d --- /dev/null +++ b/src/main/java/baseball/util/NumberGenerator.java @@ -0,0 +1,26 @@ +package baseball.util; + +import baseball.domain.Baseball; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static camp.nextstep.edu.missionutils.Randoms.*; + +public class NumberGenerator { + + public Baseball numberGenerate() { + return new Baseball(getNumbers()); + } + + private List getNumbers() { + Set numbers = new HashSet<>(); + while (numbers.size()<3) { + numbers.add(pickNumberInRange(1,9)); + } + return new ArrayList<>(numbers); + } + +} diff --git a/src/test/java/baseball/util/NumberGeneratorTest.java b/src/test/java/baseball/util/NumberGeneratorTest.java new file mode 100644 index 0000000000..47ff42c69f --- /dev/null +++ b/src/test/java/baseball/util/NumberGeneratorTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class NumberGeneratorTest { + +} \ No newline at end of file From 397b29f4ee9686eafa2e90aa0d85fd30acaf9088 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 13:15:57 +0900 Subject: [PATCH 11/27] =?UTF-8?q?test=20(NumberGenerator)=20:=203=EC=9E=90?= =?UTF-8?q?=EB=A6=AC=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB=EC=9E=90=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/util/NumberGeneratorTest.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/test/java/baseball/util/NumberGeneratorTest.java b/src/test/java/baseball/util/NumberGeneratorTest.java index 47ff42c69f..b3da03b9eb 100644 --- a/src/test/java/baseball/util/NumberGeneratorTest.java +++ b/src/test/java/baseball/util/NumberGeneratorTest.java @@ -1,4 +1,19 @@ +package baseball.util; + +import baseball.domain.Baseball; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; + class NumberGeneratorTest { - + + @Test + void numberGenerate테스트() { + NumberGenerator numberGenerator = new NumberGenerator(); + Baseball baseball = numberGenerator.numberGenerate(); + System.out.printf(baseball.getNumbers().toString()); + + assertThat(baseball.getNumbers()).hasSize(3); + } } \ No newline at end of file From 320f6e382eafa397f56ab32fc615b054dd4757f6 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 13:16:12 +0900 Subject: [PATCH 12/27] =?UTF-8?q?docs=20(NumberGenerator)=20:=203=EC=9E=90?= =?UTF-8?q?=EB=A6=AC=20=EB=9E=9C=EB=8D=A4=20=EC=88=AB=EC=9E=90=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index c79473ac5d..f1e4d5758d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@ - [] 게임 시작 Controller#gameStart - [] 야구 게임 시작 메시지 출력 Print -- [] 랜덤 숫자 3개 생성 NumberGenerator# +- [x] 랜덤 숫자 3개 생성 NumberGenerator#numberGenerate() - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication() - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() - [] 숫자 입력 From 1c4e6cf5e1c087cc064b22ded20bf2df45ec8b03 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 14:24:28 +0900 Subject: [PATCH 13/27] =?UTF-8?q?feat=20(controller)=20:=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8B=9C=EC=9E=91=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- .../java/baseball/BaseballController.java | 2 -- .../controller/BaseballController.java | 23 +++++++++++++++++++ .../java/baseball/view/UserInputTest.java | 4 ++++ 4 files changed, 29 insertions(+), 4 deletions(-) delete mode 100644 src/main/java/baseball/BaseballController.java create mode 100644 src/main/java/baseball/controller/BaseballController.java create mode 100644 src/test/java/baseball/view/UserInputTest.java diff --git a/docs/README.md b/docs/README.md index f1e4d5758d..2256bcecbf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,8 +1,8 @@ # 숫자야구 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다. -- [] 게임 시작 Controller#gameStart -- [] 야구 게임 시작 메시지 출력 Print +- [x] 게임 시작 Controller#startGame() +- [x] 야구 게임 시작 메시지 출력 Print - [x] 랜덤 숫자 3개 생성 NumberGenerator#numberGenerate() - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication() - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() diff --git a/src/main/java/baseball/BaseballController.java b/src/main/java/baseball/BaseballController.java deleted file mode 100644 index 0c9e6bc775..0000000000 --- a/src/main/java/baseball/BaseballController.java +++ /dev/null @@ -1,2 +0,0 @@ -package baseball;public class BaseballController { -} diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java new file mode 100644 index 0000000000..a4c175fc5b --- /dev/null +++ b/src/main/java/baseball/controller/BaseballController.java @@ -0,0 +1,23 @@ +package baseball.controller; + +import baseball.domain.Baseball; +import baseball.util.NumberGenerator; +import baseball.view.UserInput; + +public class BaseballController { + + NumberGenerator numberGenerator; + UserInput userInput; + + public BaseballController() { + this.numberGenerator = new NumberGenerator(); + this.userInput = new UserInput(); + // TODO document why this constructor is empty + } + + public void startGame() { + System.out.printf("숫자 야구 게임을 시작합니다.\n"); + Baseball baseball = userInput.askInputBaseball(); + + } +} diff --git a/src/test/java/baseball/view/UserInputTest.java b/src/test/java/baseball/view/UserInputTest.java new file mode 100644 index 0000000000..da321bfc64 --- /dev/null +++ b/src/test/java/baseball/view/UserInputTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class UserInputTest { + +} \ No newline at end of file From 3e7661c92e7cc46ddf83195330375d4d302045b3 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 14:25:15 +0900 Subject: [PATCH 14/27] =?UTF-8?q?refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=84=B1=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/NumberGenerator.java | 2 -- src/main/java/baseball/util/NumberGenerator.java | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 src/main/java/baseball/NumberGenerator.java diff --git a/src/main/java/baseball/NumberGenerator.java b/src/main/java/baseball/NumberGenerator.java deleted file mode 100644 index fd65d875b7..0000000000 --- a/src/main/java/baseball/NumberGenerator.java +++ /dev/null @@ -1,2 +0,0 @@ -package baseball;public class NumberGenerator { -} diff --git a/src/main/java/baseball/util/NumberGenerator.java b/src/main/java/baseball/util/NumberGenerator.java index 10a4b7aa3d..a3390f2987 100644 --- a/src/main/java/baseball/util/NumberGenerator.java +++ b/src/main/java/baseball/util/NumberGenerator.java @@ -17,9 +17,11 @@ public Baseball numberGenerate() { private List getNumbers() { Set numbers = new HashSet<>(); + while (numbers.size()<3) { numbers.add(pickNumberInRange(1,9)); } + return new ArrayList<>(numbers); } From 5c5cf9188cdd8672179d4b835de3e37f54302464 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 14:26:56 +0900 Subject: [PATCH 15/27] =?UTF-8?q?feat=20(view)=20:=20user=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EA=B4=80=EB=A0=A8=20=EA=B8=B0?= =?UTF-8?q?=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 - 문자열 입력시 숫자 파싱 - 파싱된 숫자를 3개의 숫자 파싱 - 파싱된 숫자로 야구 반환 - 숫자로 파싱 불가능한 문자열 예외처리 --- src/main/java/baseball/view/UserInput.java | 60 ++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/baseball/view/UserInput.java diff --git a/src/main/java/baseball/view/UserInput.java b/src/main/java/baseball/view/UserInput.java new file mode 100644 index 0000000000..55338f9237 --- /dev/null +++ b/src/main/java/baseball/view/UserInput.java @@ -0,0 +1,60 @@ +package baseball.view; + +import baseball.domain.Baseball; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +import static camp.nextstep.edu.missionutils.Console.readLine; + +public class UserInput { + private final String intPattern = "^[0-9]+$"; + private final String ASK_INPUT_NUMBERS = "숫자를 입력해주세요 : "; + + public Baseball askInputBaseball() { + int input = askNumbers(); + return getBaseball(input); + } + + private int askNumbers() { + System.out.print(ASK_INPUT_NUMBERS); + return readInt(); + } + + private Baseball getBaseball(int input) { + try { + List numbers = getSeparate(input); + return new Baseball(numbers); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return askInputBaseball(); + } + } + + private int readInt() { + String inputStr = readLine(); + try { + vaildNumber(inputStr); + return Integer.parseInt(inputStr); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return askNumbers(); + } + } + + private void vaildNumber(String inputStr) { + if (!Pattern.matches(intPattern, inputStr)) { + throw new IllegalArgumentException("[ERROR] 숫자를 입력하세요.\n"); + } + } + + private List getSeparate(int input) { + List numbers = new ArrayList<>(); + while (input>0) { + numbers.add(input%10); + input /= 10; + } + return numbers; + } +} From b872d5ffedab52a063d679c18ab48b8f9cce7dd1 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 14:27:28 +0900 Subject: [PATCH 16/27] =?UTF-8?q?test=20(domain)=20:=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EB=B2=94=EC=9C=84=20=EC=98=A4=EB=A5=98=EC=8B=9C=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/baseball/BaseballTest.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/test/java/baseball/BaseballTest.java b/src/test/java/baseball/BaseballTest.java index 1fcf21f827..c4b2114862 100644 --- a/src/test/java/baseball/BaseballTest.java +++ b/src/test/java/baseball/BaseballTest.java @@ -4,20 +4,24 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class BaseballTest { @Test void 야구숫자유효성검사_기본기능() { - Baseball baseball = new Baseball(1,2,3); assertThat(new Baseball(1,2,3).getNumbers()).hasSize(3); } @Test void 야구숫자유효성검사_숫자_배열() { - Baseball baseball = new Baseball(1,2,3); assertThat(new Baseball(1,2,5).getNumbers()).contains(1,2,5); } - + @Test + void 야구숫자에러처리() { + assertThatThrownBy(() -> new Baseball(0,1,2)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("[ERROR] 각 숫자는 1이상 9이하로 입력해주세요."); + } } \ No newline at end of file From c41e57a590c2c9e739f0c332a43a38c222f0e214 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 14:28:10 +0900 Subject: [PATCH 17/27] =?UTF-8?q?fix=20(domain)=20:=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EC=8B=9C=20=EC=98=A4=EB=A5=98=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=98=A4=ED=83=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Baseball.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/baseball/domain/Baseball.java b/src/main/java/baseball/domain/Baseball.java index 1a6dabf552..46b1ea8230 100644 --- a/src/main/java/baseball/domain/Baseball.java +++ b/src/main/java/baseball/domain/Baseball.java @@ -1,5 +1,7 @@ package baseball.domain; +import baseball.view.Error; + import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -9,12 +11,19 @@ public class Baseball { private List numbers; private final int NUMBERS_SIZE = 3; + public Baseball(List numbers) { + checkSize(numbers); + checkValidRange(numbers); + checkDuplication(numbers); + this.numbers = numbers; + } + public Baseball(int num1, int num2, int num3) { List numbers = Arrays.asList(num1, num2, num3); checkSize(numbers); checkValidRange(numbers); checkDuplication(numbers); - this.numbers = Arrays.asList(num1, num2, num3); + this.numbers = numbers; } public List getNumbers() { @@ -23,21 +32,21 @@ public List getNumbers() { private void checkSize(List numbers) { if (numbers.size() != NUMBERS_SIZE) { - throw new IllegalArgumentException("[ERROR] 3자리 숫자를 입력해주세요."); + throw new IllegalArgumentException("3자리 숫자를 입력해주세요.\n"); } } private void checkDuplication(List numbers) { Set numbersSet = new HashSet<>(numbers); if (numbersSet.size() != numbers.size()) { - throw new IllegalArgumentException("[ERROR] 각 숫자는 1이상 9이하로 입력해주세요."); + throw new IllegalArgumentException("각 숫자는 1이상 9이하로 입력해주세요.\n"); } } private void checkValidRange(List numbers) { for (int num : numbers) { if (1 > num || num > 9) { - throw new IllegalArgumentException("[ERROR] 각 숫자는 1이상 9이하로 입력해주세요."); + throw new IllegalArgumentException("각 숫자는 1이상 9이하로 입력해주세요.\n"); } } } From c33d2e97a4e7b12bbd4bb93e27b5cdef7fe5408c Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 14:28:27 +0900 Subject: [PATCH 18/27] =?UTF-8?q?docs=20:=20=EA=B8=B0=EB=8A=A5=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index 2256bcecbf..1addbc31a7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,11 +6,16 @@ - [x] 랜덤 숫자 3개 생성 NumberGenerator#numberGenerate() - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication() - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() -- [] 숫자 입력 - - [] 각 숫자는 중복되지 않는가? Number - - [] 각 숫자는 1~9까지 숫자인가? Number - - [] 숫자가 3개인가? Baseball#checkSize() - - [] 숫자 인가? +- [x] 숫자 입력 UserInput#askNumbers() + - [x] 숫자로 파싱 UserInput#readInt() + - [x] 숫자 배열로 파싱 UserInput#getSeparate() + - [x] 받은 숫자로 baseball 반환 UserInput#askInputBaseball() + - 예외처리 + - [x] 숫자인가? UserInput#vaildNumber() + - [x] 각 숫자는 중복되지 않는가? Baseball#checkDuplication() + - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() + - [x] 숫자가 3개인가? Baseball#checkSize() + - [x] 예외 발생시 다시 입력 - [] 정답 숫자와 비교 - [] 숫자가 같고, 자리수가 다르면 '볼' - [] 숫자가 같고, 자리수도 같으면 '스트라이크' From 9d523db4d541af7adf3def55b02b3afc6c16c263 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:02:02 +0900 Subject: [PATCH 19/27] =?UTF-8?q?feat=20(domain)=20:=20baseball=20?= =?UTF-8?q?=EC=A0=95=EB=8B=B5=20=ED=8C=90=EC=A0=95=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/BaseballJudge.java | 4 -- .../java/baseball/domain/JudgementType.java | 55 +++++++++++++++++++ .../view/{UserInput.java => InputView.java} | 28 +++++++++- .../view/{Message.java => OutputView.java} | 2 +- 4 files changed, 82 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/baseball/BaseballJudge.java create mode 100644 src/main/java/baseball/domain/JudgementType.java rename src/main/java/baseball/view/{UserInput.java => InputView.java} (62%) rename src/main/java/baseball/view/{Message.java => OutputView.java} (53%) diff --git a/src/main/java/baseball/BaseballJudge.java b/src/main/java/baseball/BaseballJudge.java deleted file mode 100644 index 443dd7fdce..0000000000 --- a/src/main/java/baseball/BaseballJudge.java +++ /dev/null @@ -1,4 +0,0 @@ -package baseball; - -public class Judge { -} diff --git a/src/main/java/baseball/domain/JudgementType.java b/src/main/java/baseball/domain/JudgementType.java new file mode 100644 index 0000000000..6b260d6705 --- /dev/null +++ b/src/main/java/baseball/domain/JudgementType.java @@ -0,0 +1,55 @@ +package baseball.domain; + +public class JudgementType { + private int strike; + private int ball; + private boolean homerun; + private final String STRIKE_MESSAGE = "%d스트라이크 "; + private final String BALL_MESSAGE = "%d볼 "; + private final String NOTHING_MESSAGE = "낫싱"; + + public JudgementType(int strike, int ball) { + this.strike = strike; + this.ball = ball-strike; + this.homerun = false; + } + + public boolean isHomerun() { + if(strike==3) { + homerun = true; + } + return homerun; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + + sb.append(getBall(ball)); + sb.append(getStrike(strike)); + sb.append(isNothing()); + + return sb.toString().trim(); + } + + private String getBall(int ball) { + if (ball != 0) { + return String.format(BALL_MESSAGE, ball); + } + return ""; + } + + private String getStrike(int strike) { + if (strike != 0) { + return String.format(STRIKE_MESSAGE, strike); + } + return ""; + } + + private String isNothing() { + if (ball==0 && strike==0) { + return NOTHING_MESSAGE; + } + return ""; + } +} diff --git a/src/main/java/baseball/view/UserInput.java b/src/main/java/baseball/view/InputView.java similarity index 62% rename from src/main/java/baseball/view/UserInput.java rename to src/main/java/baseball/view/InputView.java index 55338f9237..0c226c3707 100644 --- a/src/main/java/baseball/view/UserInput.java +++ b/src/main/java/baseball/view/InputView.java @@ -9,8 +9,10 @@ import static camp.nextstep.edu.missionutils.Console.readLine; public class UserInput { - private final String intPattern = "^[0-9]+$"; + private final String INT_PATTERN = "^[0-9]+$"; + private final String COMMAND_PATTERN = "^[1-2]$"; private final String ASK_INPUT_NUMBERS = "숫자를 입력해주세요 : "; + private final String ASK_RETRY = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; public Baseball askInputBaseball() { int input = askNumbers(); @@ -44,7 +46,7 @@ private int readInt() { } private void vaildNumber(String inputStr) { - if (!Pattern.matches(intPattern, inputStr)) { + if (!Pattern.matches(INT_PATTERN, inputStr)) { throw new IllegalArgumentException("[ERROR] 숫자를 입력하세요.\n"); } } @@ -57,4 +59,26 @@ private List getSeparate(int input) { } return numbers; } + + public int askRetry() { + System.out.println(ASK_RETRY); + return readRetry(); + } + + private int readRetry() { + String inputStr = readLine(); + try { + vaildCommand(inputStr); + return Integer.parseInt(inputStr); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + return askRetry(); + } + } + + private void vaildCommand(String inputStr) { + if (!Pattern.matches(COMMAND_PATTERN, inputStr)) { + throw new IllegalArgumentException("[ERROR] 올바른 명령어를 입력해주세요."); + } + } } diff --git a/src/main/java/baseball/view/Message.java b/src/main/java/baseball/view/OutputView.java similarity index 53% rename from src/main/java/baseball/view/Message.java rename to src/main/java/baseball/view/OutputView.java index 414831b5aa..d5b05e7335 100644 --- a/src/main/java/baseball/view/Message.java +++ b/src/main/java/baseball/view/OutputView.java @@ -1,4 +1,4 @@ -package baseball; +package baseball.view; public class Message { } From 4257b7dd39f4d721b65fe31b693cca7b42075ce0 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:03:09 +0900 Subject: [PATCH 20/27] =?UTF-8?q?feat=20(domain)=20:=20baseball=20?= =?UTF-8?q?=EC=A0=95=EB=8B=B5=20=ED=8C=90=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=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 | 14 +++--- .../java/baseball/util/BaseballJudge.java | 50 +++++++++++++++++++ 2 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 src/main/java/baseball/util/BaseballJudge.java diff --git a/docs/README.md b/docs/README.md index 1addbc31a7..d641c5d240 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,15 +16,15 @@ - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() - [x] 숫자가 3개인가? Baseball#checkSize() - [x] 예외 발생시 다시 입력 -- [] 정답 숫자와 비교 - - [] 숫자가 같고, 자리수가 다르면 '볼' - - [] 숫자가 같고, 자리수도 같으면 '스트라이크' - - [] ball, strike가 둘다 없으면 '낫싱' - - [] 에러 발생시 다시 입력받기 -- [] 정답인지 확인 - - [] 3스트라이크 시 정답 - [] 게임 재시작 - [] 1 입력시 재시작 Controller#gameStart - [] 2 입력시 종료 Controller#gameEnd - [] 그 외 입력시 다시 입력받기 +- [x] 정답 숫자와 비교 BaseballJudge#judgement + - [x] 숫자가 같고, 자리수가 다르면 '볼' BaseballJudge#getBall + - [x] 숫자가 같고, 자리수도 같으면 '스트라이크' BaseballJudge#getStrike + - [x] ball, strike가 둘다 없으면 '낫싱' JudgementType#isNothing + - [x] 에러 발생시 다시 입력받기 +- [x] 정답인지 확인 BaseballJudge#checkAnswer + - [x] 3스트라이크 시 정답 diff --git a/src/main/java/baseball/util/BaseballJudge.java b/src/main/java/baseball/util/BaseballJudge.java new file mode 100644 index 0000000000..07d0f012d1 --- /dev/null +++ b/src/main/java/baseball/util/BaseballJudge.java @@ -0,0 +1,50 @@ +package baseball.util; + +import baseball.domain.Baseball; +import baseball.domain.JudgementType; + +import java.util.List; + +public class BaseballJudge { + Baseball computer; + + public BaseballJudge(Baseball computer) { + this.computer = computer; + } + + public JudgementType judgement(Baseball user) { + List userNumbers = user.getNumbers(); + List computerNumbers = computer.getNumbers(); + int ball = getBall(userNumbers, computerNumbers); + int strike = getStrike(userNumbers, computerNumbers); + return new JudgementType(strike, ball); + } + + private int getStrike(List userNumbers, List computerNumbers) { + int result = 0; + for (int i =0; i userNumbers, List computerNumbers) { + int result = 0; + for (int userNumber : userNumbers) { + if (computerNumbers.contains(userNumber)) { + result ++; + } + } + return result; + } + + public boolean checkAnswer(JudgementType judgement) { + if (judgement.isHomerun()) { + return true; + } + return false; + } + +} From f1df31cd57272418093f601b45d0ded6dcceef7b Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:04:02 +0900 Subject: [PATCH 21/27] =?UTF-8?q?refactor=20(view)=20:=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EB=A9=94=EC=8B=9C=EC=A7=80=20enum=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/domain/Baseball.java | 6 +++--- src/main/java/baseball/view/Error.java | 22 ++++++++++++++++++++- src/main/java/baseball/view/InputView.java | 8 +++++--- src/test/java/baseball/BaseballTest.java | 3 ++- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/main/java/baseball/domain/Baseball.java b/src/main/java/baseball/domain/Baseball.java index 46b1ea8230..8336338d32 100644 --- a/src/main/java/baseball/domain/Baseball.java +++ b/src/main/java/baseball/domain/Baseball.java @@ -32,21 +32,21 @@ public List getNumbers() { private void checkSize(List numbers) { if (numbers.size() != NUMBERS_SIZE) { - throw new IllegalArgumentException("3자리 숫자를 입력해주세요.\n"); + throw new IllegalArgumentException(Error.NUMBER_SIZE_EXCEPTION.toString()); } } private void checkDuplication(List numbers) { Set numbersSet = new HashSet<>(numbers); if (numbersSet.size() != numbers.size()) { - throw new IllegalArgumentException("각 숫자는 1이상 9이하로 입력해주세요.\n"); + throw new IllegalArgumentException(Error.NUMBER_DUPLICATION_EXCEPTION.toString()); } } private void checkValidRange(List numbers) { for (int num : numbers) { if (1 > num || num > 9) { - throw new IllegalArgumentException("각 숫자는 1이상 9이하로 입력해주세요.\n"); + throw new IllegalArgumentException(Error.NUMBER_RANGE_EXCEPTION.toString()); } } } diff --git a/src/main/java/baseball/view/Error.java b/src/main/java/baseball/view/Error.java index b133b2472e..29808cbffa 100644 --- a/src/main/java/baseball/view/Error.java +++ b/src/main/java/baseball/view/Error.java @@ -1,2 +1,22 @@ -package baseball;public class Error { +package baseball.view; + +public enum Error { + NUMBER_SIZE_EXCEPTION("3자리 숫자를 입력해주세요.\n"), + NUMBER_DUPLICATION_EXCEPTION("중복된 숫자가 없어야 합니다.\n"), + NUMBER_RANGE_EXCEPTION("각 숫자는 1이상 9이하로 입력해주세요.\n"), + NUMBER_PARSE_EXCEPTION("숫자를 입력해 주세요.\n"), + COMMAND_NOT_VAILD_EXCEPTION("올바른 명령어를 입력해주세요.\n"); + + + String tag = "[ERROR] "; + String message; + + Error(String message) { + this.message = message; + } + + @Override + public String toString() { + return tag + message; + } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 0c226c3707..7dfed1f9d9 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -8,7 +8,7 @@ import static camp.nextstep.edu.missionutils.Console.readLine; -public class UserInput { +public class InputView { private final String INT_PATTERN = "^[0-9]+$"; private final String COMMAND_PATTERN = "^[1-2]$"; private final String ASK_INPUT_NUMBERS = "숫자를 입력해주세요 : "; @@ -47,16 +47,18 @@ private int readInt() { private void vaildNumber(String inputStr) { if (!Pattern.matches(INT_PATTERN, inputStr)) { - throw new IllegalArgumentException("[ERROR] 숫자를 입력하세요.\n"); + throw new IllegalArgumentException(Error.NUMBER_PARSE_EXCEPTION.toString()); } } private List getSeparate(int input) { List numbers = new ArrayList<>(); + while (input>0) { numbers.add(input%10); input /= 10; } + return numbers; } @@ -78,7 +80,7 @@ private int readRetry() { private void vaildCommand(String inputStr) { if (!Pattern.matches(COMMAND_PATTERN, inputStr)) { - throw new IllegalArgumentException("[ERROR] 올바른 명령어를 입력해주세요."); + throw new IllegalArgumentException(Error.COMMAND_NOT_VAILD_EXCEPTION.toString()); } } } diff --git a/src/test/java/baseball/BaseballTest.java b/src/test/java/baseball/BaseballTest.java index c4b2114862..3e83b0e6a0 100644 --- a/src/test/java/baseball/BaseballTest.java +++ b/src/test/java/baseball/BaseballTest.java @@ -1,6 +1,7 @@ package baseball; import baseball.domain.Baseball; +import baseball.view.Error; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -22,6 +23,6 @@ class BaseballTest { void 야구숫자에러처리() { assertThatThrownBy(() -> new Baseball(0,1,2)) .isInstanceOf(IllegalArgumentException.class) - .hasMessage("[ERROR] 각 숫자는 1이상 9이하로 입력해주세요."); + .hasMessage(Error.NUMBER_RANGE_EXCEPTION.toString()); } } \ No newline at end of file From 914c870460e52f16aef5ca6139245ae04d63656c Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:05:06 +0900 Subject: [PATCH 22/27] =?UTF-8?q?feat=20(controller)=20:=20startGame=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index a4c175fc5b..04b3e7b400 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,23 +1,32 @@ package baseball.controller; import baseball.domain.Baseball; +import baseball.domain.JudgementType; +import baseball.util.BaseballJudge; import baseball.util.NumberGenerator; -import baseball.view.UserInput; +import baseball.view.InputView; public class BaseballController { + Baseball computer; + BaseballJudge baseballJudge; NumberGenerator numberGenerator; - UserInput userInput; + InputView userInput; + Boolean endFlag; public BaseballController() { this.numberGenerator = new NumberGenerator(); - this.userInput = new UserInput(); - // TODO document why this constructor is empty + this.userInput = new InputView(); } - public void startGame() { - System.out.printf("숫자 야구 게임을 시작합니다.\n"); - Baseball baseball = userInput.askInputBaseball(); + public boolean startGame() { + initNewGame(); + while (!endFlag) { + playRound(); + } + endGame(); + return false; + } } } From 30748f61325ee84a43830e66beb458b259064c5d Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:06:35 +0900 Subject: [PATCH 23/27] =?UTF-8?q?feat=20(controller)=20:=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20init=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 시작 메시지 출력 - endFlag 초기화 - 정답 숫자배열(computer) 생성 - 판정 유틸 초기화 --- src/main/java/baseball/controller/BaseballController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 04b3e7b400..a89a05d850 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -28,5 +28,11 @@ public boolean startGame() { endGame(); return false; } + + private void initNewGame() { + System.out.println("숫자 야구 게임을 시작합니다."); + endFlag = false; + computer = numberGenerator.baseballGenerate(); + baseballJudge = new BaseballJudge(computer); } } From 4d4f8f3d5eb637a56bae12a8747189b02cd89a55 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:07:23 +0900 Subject: [PATCH 24/27] =?UTF-8?q?feat=20(controller)=20:=20=EB=9D=BC?= =?UTF-8?q?=EC=9A=B4=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숫자입력 - 판정 - 출력 --- .../controller/BaseballController.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index a89a05d850..1149a4328e 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -29,6 +29,28 @@ public boolean startGame() { return false; } + private void endGame() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + retry(); + } + + private boolean retry() { + int command = userInput.askRetry(); + if (command==1) { + return startGame(); + } + return false; + } + + private void playRound() { + Baseball userBaseball = userInput.askInputBaseball(); + JudgementType judgement = baseballJudge.judgement(userBaseball); + System.out.println(judgement.toString()); + endFlag = baseballJudge.checkAnswer(judgement); + } + + + private void initNewGame() { System.out.println("숫자 야구 게임을 시작합니다."); endFlag = false; From c2dc5adbe14fc48963551fa691b2346971e01e33 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:08:03 +0900 Subject: [PATCH 25/27] =?UTF-8?q?feat=20(controller)=20:=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=9E=AC=EC=8B=9C=EC=9E=91=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= 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 | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index d641c5d240..bb12ca4260 100644 --- a/docs/README.md +++ b/docs/README.md @@ -16,10 +16,6 @@ - [x] 각 숫자는 1~9까지 숫자인가? Baseball#checkValidRange() - [x] 숫자가 3개인가? Baseball#checkSize() - [x] 예외 발생시 다시 입력 -- [] 게임 재시작 - - [] 1 입력시 재시작 Controller#gameStart - - [] 2 입력시 종료 Controller#gameEnd - - [] 그 외 입력시 다시 입력받기 - [x] 정답 숫자와 비교 BaseballJudge#judgement - [x] 숫자가 같고, 자리수가 다르면 '볼' BaseballJudge#getBall - [x] 숫자가 같고, 자리수도 같으면 '스트라이크' BaseballJudge#getStrike @@ -27,4 +23,8 @@ - [x] 에러 발생시 다시 입력받기 - [x] 정답인지 확인 BaseballJudge#checkAnswer - [x] 3스트라이크 시 정답 +- [x] 게임 재시작 BaseballController#retry + - [x] 1 입력시 재시작 Controller#gameStart + - [x] 2 입력시 종료 + - [x] 그 외 입력시 다시 입력받기 diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..c903afd0c7 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,10 @@ package baseball; +import baseball.controller.BaseballController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + BaseballController baseballController = new BaseballController(); + baseballController.startGame(); } } From 50fe8645039d936cd543f118e9988e49993a8757 Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:08:44 +0900 Subject: [PATCH 26/27] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/util/NumberGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/baseball/util/NumberGenerator.java b/src/main/java/baseball/util/NumberGenerator.java index a3390f2987..f143fb830a 100644 --- a/src/main/java/baseball/util/NumberGenerator.java +++ b/src/main/java/baseball/util/NumberGenerator.java @@ -11,7 +11,7 @@ public class NumberGenerator { - public Baseball numberGenerate() { + public Baseball baseballGenerate() { return new Baseball(getNumbers()); } From 185047ba78a8d7869b6b65eb5d72fd645fd59a9b Mon Sep 17 00:00:00 2001 From: saehim Date: Sat, 26 Nov 2022 16:09:08 +0900 Subject: [PATCH 27/27] =?UTF-8?q?test=20(view)=20:=20userInput=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/baseball/view/UserInputTest.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/test/java/baseball/view/UserInputTest.java b/src/test/java/baseball/view/UserInputTest.java index da321bfc64..2f038cefd0 100644 --- a/src/test/java/baseball/view/UserInputTest.java +++ b/src/test/java/baseball/view/UserInputTest.java @@ -1,4 +1,29 @@ +package baseball.view; + +import baseball.domain.Baseball; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.provider.ValueSource; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; + class UserInputTest { - + +// @Test +// @ValueSource(strings = "123") +// void askNumber테스트(String input) { +// InputStream in = generatoteUserInput(input); +// System.setIn(in); +// +// UserInput userInput = new UserInput(); +// Baseball baseball = userInput.askNumbers(); +// assertThat(baseball.getNumbers()).hasSize(3); +// } + + public static InputStream generatoteUserInput(String input) { + return new ByteArrayInputStream(input.getBytes()); + } } \ No newline at end of file