From 1c9dbd431d3604bc72c354da5bd4b0279e1fe864 Mon Sep 17 00:00:00 2001 From: person003333 Date: Mon, 12 Dec 2022 15:46:12 +0900 Subject: [PATCH 01/18] docs: add feature list --- README.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fcf3f057..832afa99 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,22 @@ # 숫자 야구 게임 -## 진행 방법 -* 숫자 야구 게임 요구사항을 파악한다. -* 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 과제를 제출한다. +## 구현할 기능 목록 -## 과제 제출 과정 -* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) +* 1-9사이의 숫자중 3개를 뽑아 3자리 수를 정한다. +* 3자리 수를 입력받는다. + * 받은 값이 3자리가 아닌 경우 예외 출력 + * 받은 값이 숫자가 아닌 경우 예외 출력 + * 받은 값에 중복된 숫자가 있을 시 예외 출력 +* 입력값에 따라 힌트를 구분한다. + * 자리와 숫자 둘다 맞춘 경우 => 스트라이크 + 1 + * 숫자는 같지만 자리가 다른 경우 => 볼 + 1 + * 자리와 숫자 모두 틀린 경우 => 낫싱 (볼과 스트라이크가 모두 0인 상황) + * [예] 상대방(컴퓨터)의 수가 425일 때 + * 123을 제시한 경우 : 1 스트라이크, + * 456을 제시한 경우 : 1 스트라이크 1볼, + * 789를 제시한 경우 : 낫싱 +* 게임의 승패 유무를 판단한다. + * 3스트라이크인 경우, 게임이 종료된다. + * 3스트라이크가 아니면 3자리 수를 입력받는다. +* 게임 종료가 되면, 다시 게임을 진행할지 완전히 프로그램을 종료할 지를 출력한다. + * 1 입력 시 게임 재시작 + * 2 입력 시 프로그램 종료 \ No newline at end of file From 78c271dc6aa731f3db9a3adf74cc6ad7a5472347 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 13 Dec 2022 18:47:15 +0900 Subject: [PATCH 02/18] feat: add Computer class Computer class has an Integer List The constructor for this class generates 3 random numbers and puts them into the list --- src/main/java/domain/Computer.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/domain/Computer.java diff --git a/src/main/java/domain/Computer.java b/src/main/java/domain/Computer.java new file mode 100644 index 00000000..94fedabe --- /dev/null +++ b/src/main/java/domain/Computer.java @@ -0,0 +1,26 @@ +package domain; + +import java.util.*; + +public class Computer { + private List numbers; + + public Computer(List numbers) { + this.numbers = numbers; + } + + public Computer() { + Set numberSet = new HashSet<>(); + Random random = new Random(); + random.setSeed(System.currentTimeMillis()); + + while(numberSet.size() < 3){ + numbers.add(random.nextInt(9) + 1); + } + this.numbers = new ArrayList(numberSet); + } + + public List getNumbers() { + return numbers; + } +} From 7eacb829101e9829d3c23b25ca79b83b2eb9b507 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 09:15:56 +0900 Subject: [PATCH 03/18] =?UTF-8?q?refactor:=20Computer=20=EB=9E=9C=EB=8D=A4?= =?UTF-8?q?=20=EC=88=98=20=EC=83=9D=EC=84=B1=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 랜덤 수 생성을 Set으로 진행하여 만들어진 숫자 리스트가 항상 정렬 상태인 문제가 발견되어 ArrayList에서 contains로 검사하며 숫자를 생성하도록 변경 --- src/main/java/domain/Computer.java | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/domain/Computer.java b/src/main/java/domain/Computer.java index 94fedabe..96574866 100644 --- a/src/main/java/domain/Computer.java +++ b/src/main/java/domain/Computer.java @@ -3,24 +3,33 @@ import java.util.*; public class Computer { - private List numbers; + private final ArrayList numbers; - public Computer(List numbers) { + public Computer(ArrayList numbers) { this.numbers = numbers; } public Computer() { - Set numberSet = new HashSet<>(); + this.numbers = new ArrayList<>(); + } + + public void reset(){ + this.numbers.clear(); Random random = new Random(); random.setSeed(System.currentTimeMillis()); - while(numberSet.size() < 3){ - numbers.add(random.nextInt(9) + 1); + while(this.numbers.size() < 3){ + this.computerNumAdd(random.nextInt(9) + 1); } - this.numbers = new ArrayList(numberSet); - } - public List getNumbers() { + } + public ArrayList getNumbers() { return numbers; } + + public void computerNumAdd(int num){ + if (!this.numbers.contains(num)){ + this.numbers.add(num); + } + } } From 5b95a471b5c694bd427626bedfd2a99537bd98ac Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 09:16:44 +0900 Subject: [PATCH 04/18] =?UTF-8?q?feat:=20Computer=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20unit=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 숫자를 배열에 잘 집어넣는지 테스트 --- src/test/java/domain/ComputerTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/test/java/domain/ComputerTest.java diff --git a/src/test/java/domain/ComputerTest.java b/src/test/java/domain/ComputerTest.java new file mode 100644 index 00000000..e7eee15a --- /dev/null +++ b/src/test/java/domain/ComputerTest.java @@ -0,0 +1,19 @@ +package domain; + + + +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ComputerTest { + @Test + void create(){ + Computer computer = new Computer(new ArrayList<>(Arrays.asList(7, 1, 3))); + String actual = computer.getNumbers().toString(); + assertThat(actual).isEqualTo("[7, 1, 3]"); + } +} From 0812800cadd45c887d42cac5c2a014dfa36d022b Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 13:27:46 +0900 Subject: [PATCH 05/18] =?UTF-8?q?refactor:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 잘못된 입력을 받으면 IllegalArgumentException를 발생하도록 수정 --- src/main/java/domain/User.java | 61 ++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/main/java/domain/User.java diff --git a/src/main/java/domain/User.java b/src/main/java/domain/User.java new file mode 100644 index 00000000..4ff0975c --- /dev/null +++ b/src/main/java/domain/User.java @@ -0,0 +1,61 @@ +package domain; + +import java.util.ArrayList; + + +public class User { + + private final ArrayList number; + + public ArrayList getNumber() { + return number; + } + + + public User() { + this.number = new ArrayList<>(); + } + + public void reset(){ + this.number.clear(); + } + + public void userNumAdd(int num){ + if(!this.number.contains(num)) + { + this.number.add(num); + } + } + + public void userNumConvert(String userInput){ + + for (int i = 0; i < userInput.length() ; i++) { + this.userNumAdd(userInput.charAt(i) - '0'); + } + + if (this.getNumber().size() != 3) { + this.reset(); + throw new IllegalArgumentException("잘못된 입력입니다."); + } + + } + + public void setNumber(String num){ + + if (num.length() != 3 || !isNumeric(num)){ + this.reset(); + throw new IllegalArgumentException("잘못된 입력입니다."); + } + + this.userNumConvert(num); + } + + public static boolean isNumeric(String s) { + try { + Integer.parseInt(s); + return true; + } catch (NumberFormatException e) { + return false; + } + } +} From 18b86d59e7b2f5814bdb14c8e94b2547f0680069 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 13:29:54 +0900 Subject: [PATCH 06/18] =?UTF-8?q?refactor:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B3=80=EC=88=98=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Computer 클래스와 똑같이 numbers로 변경 --- src/main/java/domain/User.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/domain/User.java b/src/main/java/domain/User.java index 4ff0975c..817c5e88 100644 --- a/src/main/java/domain/User.java +++ b/src/main/java/domain/User.java @@ -5,25 +5,25 @@ public class User { - private final ArrayList number; + private final ArrayList numbers; - public ArrayList getNumber() { - return number; + public ArrayList getNumbers() { + return numbers; } public User() { - this.number = new ArrayList<>(); + this.numbers = new ArrayList<>(); } public void reset(){ - this.number.clear(); + this.numbers.clear(); } public void userNumAdd(int num){ - if(!this.number.contains(num)) + if(!this.numbers.contains(num)) { - this.number.add(num); + this.numbers.add(num); } } @@ -33,14 +33,14 @@ public void userNumConvert(String userInput){ this.userNumAdd(userInput.charAt(i) - '0'); } - if (this.getNumber().size() != 3) { + if (this.getNumbers().size() != 3) { this.reset(); throw new IllegalArgumentException("잘못된 입력입니다."); } } - public void setNumber(String num){ + public void setNumbers(String num){ if (num.length() != 3 || !isNumeric(num)){ this.reset(); From 7bea0c4f37127aad63a0c4576da83059cddc01a9 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 13:34:50 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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 User 클래스 숫자 입력 테스트 입력값이 맞다면 리스트에 넣고 입력값이 잘못됬다면 IllegalArgumentException 발생 --- src/test/java/domain/UserTest.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/test/java/domain/UserTest.java diff --git a/src/test/java/domain/UserTest.java b/src/test/java/domain/UserTest.java new file mode 100644 index 00000000..4bc544bf --- /dev/null +++ b/src/test/java/domain/UserTest.java @@ -0,0 +1,25 @@ +package domain; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class UserTest { + @Test + void create(){ + User user = new User(); + user.setNumbers("123"); + String actual = user.getNumbers().toString(); + assertThat(actual).isEqualTo("[1, 2, 3]"); + + user.reset(); + try { + user.setNumbers("111"); + } catch (IllegalArgumentException e) { + actual = e.getMessage(); + } + assertThat(actual).isEqualTo("잘못된 입력입니다."); + } + +} From d31d23872898fe45c9c6c8765e5e425ff73bfebc Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 13:43:26 +0900 Subject: [PATCH 08/18] =?UTF-8?q?feat:=20Score=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 점수를 기록하는 Score클래스 --- src/main/java/domain/Score.java | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/domain/Score.java diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java new file mode 100644 index 00000000..d7e34ac4 --- /dev/null +++ b/src/main/java/domain/Score.java @@ -0,0 +1,49 @@ +package domain; + +public class Score { + private Integer strike; + private Integer ball; + + public Score() { + reset(); + } + + public void setStrike(Integer strike) { + this.strike = strike; + } + + public void setBall(Integer ball) { + this.ball = ball; + } + + public Integer getStrike() { + return strike; + } + + public Integer getBall() { + return ball; + } + + public boolean isFinish(){ + return this.strike == 3; + } + + public String getScore(){ + StringBuilder sb = new StringBuilder(); + if (sb.length() == 0){ + return "아웃"; + } + if (this.ball > 0){ + sb.append(this.ball).append("볼"); + } + if (this.strike > 0){ + sb.append(this.strike).append("스트라이크"); + } + return sb.toString(); + } + + public void reset() { + this.strike = 0; + this.ball = 0; + } +} From 1bd05f30e75027882c22c20bb4c77fca40a241d6 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 14:06:10 +0900 Subject: [PATCH 09/18] =?UTF-8?q?feat:=20Score=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 점수출력 문자열 수정 --- src/main/java/domain/Score.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/domain/Score.java b/src/main/java/domain/Score.java index d7e34ac4..134077f4 100644 --- a/src/main/java/domain/Score.java +++ b/src/main/java/domain/Score.java @@ -30,16 +30,16 @@ public boolean isFinish(){ public String getScore(){ StringBuilder sb = new StringBuilder(); - if (sb.length() == 0){ - return "아웃"; - } - if (this.ball > 0){ - sb.append(this.ball).append("볼"); + if (this.ball == 0 && this.strike == 0 ){ + return "낫싱"; } if (this.strike > 0){ - sb.append(this.strike).append("스트라이크"); + sb.append(this.strike).append(" 스트라이크 "); + } + if (this.ball > 0){ + sb.append(this.ball).append(" 볼"); } - return sb.toString(); + return sb.toString().trim(); } public void reset() { From 8944e26cffec27184aa06dfc1b1d0caa9f2cd764 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 14:07:42 +0900 Subject: [PATCH 10/18] =?UTF-8?q?feat:=20Score=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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 점수가 잘 입려됬는지 확인 --- src/test/java/domain/ScoreTest.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/domain/ScoreTest.java diff --git a/src/test/java/domain/ScoreTest.java b/src/test/java/domain/ScoreTest.java new file mode 100644 index 00000000..b208234f --- /dev/null +++ b/src/test/java/domain/ScoreTest.java @@ -0,0 +1,27 @@ +package domain; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ScoreTest { + @Test + void setScore(){ + Score score = new Score(); + + String actual = score.getScore(); + assertThat(actual).isEqualTo("낫싱"); + + score.setBall(2); + actual = score.getScore(); + assertThat(actual).isEqualTo("2 볼"); + + score.setStrike(1); + actual = score.getScore(); + assertThat(actual).isEqualTo("1 스트라이크 2 볼"); + + score.setBall(0); + actual = score.getScore(); + assertThat(actual).isEqualTo("1 스트라이크"); + } + +} From 57514a201a4f8cd41e106ea277703dd1c5ebbb2b Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 14:42:59 +0900 Subject: [PATCH 11/18] =?UTF-8?q?refactor:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숫자 0이 인식되던 부분 0이 입력되면 예외처리 --- src/main/java/domain/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/domain/User.java b/src/main/java/domain/User.java index 817c5e88..1dd223fa 100644 --- a/src/main/java/domain/User.java +++ b/src/main/java/domain/User.java @@ -53,9 +53,9 @@ public void setNumbers(String num){ public static boolean isNumeric(String s) { try { Integer.parseInt(s); - return true; } catch (NumberFormatException e) { return false; } + return !s.contains("0"); } } From b2d0605f262302ad8101f11169713526747c2943 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 15:16:29 +0900 Subject: [PATCH 12/18] =?UTF-8?q?refactor:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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 테스트 조건 추가 --- src/test/java/domain/UserTest.java | 45 +++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/test/java/domain/UserTest.java b/src/test/java/domain/UserTest.java index 4bc544bf..93d5f033 100644 --- a/src/test/java/domain/UserTest.java +++ b/src/test/java/domain/UserTest.java @@ -1,5 +1,6 @@ package domain; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -7,7 +8,8 @@ public class UserTest { @Test - void create(){ + @DisplayName("중복되지 않는 숫자 테스트") + void testUniqueness(){ User user = new User(); user.setNumbers("123"); String actual = user.getNumbers().toString(); @@ -22,4 +24,45 @@ void create(){ assertThat(actual).isEqualTo("잘못된 입력입니다."); } + @Test + @DisplayName("숫자 중복 입력") + void testNotUniqueness(){ + User user = new User(); + String actual = ""; + user.reset(); + try { + user.setNumbers("112"); + } catch (IllegalArgumentException e) { + actual = e.getMessage(); + } + assertThat(actual).isEqualTo("잘못된 입력입니다."); + } + + @Test + @DisplayName("숫자 초과 입력") + void testOverNumber(){ + User user = new User(); + String actual = ""; + user.reset(); + try { + user.setNumbers("1234"); + } catch (IllegalArgumentException e) { + actual = e.getMessage(); + } + assertThat(actual).isEqualTo("잘못된 입력입니다."); + } + @Test + @DisplayName("문자 입력") + void testChar(){ + User user = new User(); + String actual = ""; + user.reset(); + try { + user.setNumbers("a12"); + } catch (IllegalArgumentException e) { + actual = e.getMessage(); + } + assertThat(actual).isEqualTo("잘못된 입력입니다."); + } + } From eb881c6c1ec5a64e90e99cf58c7cf35615b3abf4 Mon Sep 17 00:00:00 2001 From: person003333 Date: Tue, 20 Dec 2022 17:56:26 +0900 Subject: [PATCH 13/18] =?UTF-8?q?refactor:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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 테스트 조건 수정 --- src/test/java/domain/UserTest.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/java/domain/UserTest.java b/src/test/java/domain/UserTest.java index 93d5f033..4e3a9b7f 100644 --- a/src/test/java/domain/UserTest.java +++ b/src/test/java/domain/UserTest.java @@ -14,14 +14,6 @@ void testUniqueness(){ user.setNumbers("123"); String actual = user.getNumbers().toString(); assertThat(actual).isEqualTo("[1, 2, 3]"); - - user.reset(); - try { - user.setNumbers("111"); - } catch (IllegalArgumentException e) { - actual = e.getMessage(); - } - assertThat(actual).isEqualTo("잘못된 입력입니다."); } @Test From 7a79216bfc1dea2f23e255be80b7d75b9c7b02cb Mon Sep 17 00:00:00 2001 From: person003333 Date: Wed, 21 Dec 2022 13:11:20 +0900 Subject: [PATCH 14/18] =?UTF-8?q?refactor:=20User=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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 중복 되는 테스트 구문 하나로 묶기 --- src/test/java/domain/UserTest.java | 59 +++++++----------------------- 1 file changed, 14 insertions(+), 45 deletions(-) diff --git a/src/test/java/domain/UserTest.java b/src/test/java/domain/UserTest.java index 4e3a9b7f..67c429b1 100644 --- a/src/test/java/domain/UserTest.java +++ b/src/test/java/domain/UserTest.java @@ -1,60 +1,29 @@ package domain; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; public class UserTest { - @Test - @DisplayName("중복되지 않는 숫자 테스트") - void testUniqueness(){ + @ParameterizedTest + @DisplayName("숫자 입력 테스트") + @CsvSource(value = {"123;[1, 2, 3]", + "112;잘못된 입력입니다.", + "1234;잘못된 입력입니다.", + "a12;잘못된 입력입니다."}, delimiter = ';') + void testInput(String input,String expected){ User user = new User(); - user.setNumbers("123"); - String actual = user.getNumbers().toString(); - assertThat(actual).isEqualTo("[1, 2, 3]"); - } - - @Test - @DisplayName("숫자 중복 입력") - void testNotUniqueness(){ - User user = new User(); - String actual = ""; - user.reset(); - try { - user.setNumbers("112"); - } catch (IllegalArgumentException e) { - actual = e.getMessage(); - } - assertThat(actual).isEqualTo("잘못된 입력입니다."); - } - - @Test - @DisplayName("숫자 초과 입력") - void testOverNumber(){ - User user = new User(); - String actual = ""; - user.reset(); - try { - user.setNumbers("1234"); - } catch (IllegalArgumentException e) { - actual = e.getMessage(); - } - assertThat(actual).isEqualTo("잘못된 입력입니다."); - } - @Test - @DisplayName("문자 입력") - void testChar(){ - User user = new User(); - String actual = ""; - user.reset(); + String actual; try { - user.setNumbers("a12"); - } catch (IllegalArgumentException e) { + user.setNumbers(input); + actual = user.getNumbers().toString(); + }catch (IllegalArgumentException e){ actual = e.getMessage(); } - assertThat(actual).isEqualTo("잘못된 입력입니다."); + assertThat(actual).isEqualTo(expected); } } From f1dab7b52e5711c259cb823e8cb7303923d20d43 Mon Sep 17 00:00:00 2001 From: person003333 Date: Wed, 21 Dec 2022 15:27:56 +0900 Subject: [PATCH 15/18] =?UTF-8?q?feat:=20GameService=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임을 진행하는 서비스 --- src/main/java/service/GameService.java | 20 ++++++ src/main/java/service/GameServiceImpl.java | 74 ++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 src/main/java/service/GameService.java create mode 100644 src/main/java/service/GameServiceImpl.java diff --git a/src/main/java/service/GameService.java b/src/main/java/service/GameService.java new file mode 100644 index 00000000..aa584d3a --- /dev/null +++ b/src/main/java/service/GameService.java @@ -0,0 +1,20 @@ +package service; + +import domain.Computer; +import domain.Score; +import domain.User; + +import java.io.IOException; +import java.util.ArrayList; + +public interface GameService { + void startGame(Computer computer, User user, Score score) throws IOException; + + boolean playGame(Computer computer, User user, Score score) throws IOException; + + void userInput(User user) throws IOException; + + void compareNumbers(Computer computer, User user, Score score); + + void compareNumber(ArrayList computerNumbers, Integer userNum, int userIndex, Score score); +} diff --git a/src/main/java/service/GameServiceImpl.java b/src/main/java/service/GameServiceImpl.java new file mode 100644 index 00000000..7be50eea --- /dev/null +++ b/src/main/java/service/GameServiceImpl.java @@ -0,0 +1,74 @@ +package service; + +import domain.Computer; +import domain.Score; +import domain.User; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.*; + +public class GameServiceImpl implements GameService { + + + @Override + public void startGame(Computer computer, User user, Score score) throws IOException { + computer.reset(); + user.reset(); + score.reset(); + System.out.println(computer.getNumbers()); + while (playGame(computer, user, score)) { + user.reset(); + score.reset(); + } + } + + @Override + public boolean playGame(Computer computer, User user, Score score) throws IOException { + while (user.getNumbers().isEmpty()) { + userInput(user); + } + compareNumbers(computer, user, score); + System.out.println(score.getScore()); + + if (score.isFinish()){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return false; + } + return true; + } + + @Override + public void userInput(User user) throws IOException { + try { + System.out.print("숫자를 입력해주세요 : "); + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + String num = reader.readLine(); + user.setNumbers(num); + } + catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + + @Override + public void compareNumbers(Computer computer, User user, Score score){ + for (int i = 0 ; i < 3 ; i++ ){ + compareNumber(computer.getNumbers(), user.getNumbers().get(i), i, score); + } + + } + + @Override + public void compareNumber(ArrayList computerNumbers, Integer userNum, int userIndex, Score score) { + if (computerNumbers.contains(userNum)) { + score.setBall(score.getBall() + 1); + } + if (Objects.equals(computerNumbers.get(userIndex), userNum)) { + score.setBall(score.getBall() - 1); + score.setStrike(score.getStrike() + 1); + } + } + +} From 86cd534702d925cd2fa6de26082e6b8ef17f19fb Mon Sep 17 00:00:00 2001 From: person003333 Date: Wed, 21 Dec 2022 15:30:11 +0900 Subject: [PATCH 16/18] feat: BaseBallController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 게임을 시작하고 끝나면 다시 할지 물어보는 컨트롤러 --- .../java/controller/BaseBallController.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/controller/BaseBallController.java diff --git a/src/main/java/controller/BaseBallController.java b/src/main/java/controller/BaseBallController.java new file mode 100644 index 00000000..a3c233d0 --- /dev/null +++ b/src/main/java/controller/BaseBallController.java @@ -0,0 +1,46 @@ +package controller; + +import domain.Computer; +import domain.Score; +import domain.User; +import service.GameServiceImpl; +import service.GameService; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Objects; + +public class BaseBallController { + + private static Computer computer; + private static User user; + private static Score score; + + private static GameService gameService; + + public void BaseBallGame() throws IOException { + computer = new Computer(); + user = new User(); + score = new Score(); + gameService = new GameServiceImpl(); + String newGame = "1"; + while (Objects.equals(newGame, "1")) { + newGame = BaseBallGameStart(); + } + + } + + public static String BaseBallGameStart() throws IOException { + String nextGame = "0"; + gameService.startGame(computer, user, score); + while (!Objects.equals(nextGame, "1") && !Objects.equals(nextGame, "2")){ + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하시오."); + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + nextGame = (reader.readLine()); + + } + return nextGame; + } + +} From 9c82187baca409bef287f9cfa5fce5380eff490d Mon Sep 17 00:00:00 2001 From: person003333 Date: Wed, 21 Dec 2022 15:30:47 +0900 Subject: [PATCH 17/18] =?UTF-8?q?refactor:=20GameService=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 필요 없는 구문 삭제 --- src/test/java/Service/GameServiceTest.java | 111 +++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/test/java/Service/GameServiceTest.java diff --git a/src/test/java/Service/GameServiceTest.java b/src/test/java/Service/GameServiceTest.java new file mode 100644 index 00000000..8179461a --- /dev/null +++ b/src/test/java/Service/GameServiceTest.java @@ -0,0 +1,111 @@ +package Service; + +import domain.Computer; +import domain.Score; +import domain.User; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import service.GameService; +import service.GameServiceImpl; + +import java.io.*; +import java.util.ArrayList; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +public class GameServiceTest { + + @Test + @DisplayName("볼 확인") + public void isBall(){ + GameService gameService = new GameServiceImpl(); + Score score = new Score(); + gameService.compareNumber(new ArrayList<>(Arrays.asList(7, 1, 3)), 7, 1, score); + String actual = score.getScore(); + assertThat(actual).isEqualTo("1 볼"); + } + + @Test + @DisplayName("스트라이크 확인") + public void isStrike(){ + GameService gameService = new GameServiceImpl(); + Score score = new Score(); + gameService.compareNumber(new ArrayList<>(Arrays.asList(7, 1, 3)), 7, 0, score); + String actual = score.getScore(); + assertThat(actual).isEqualTo("1 스트라이크"); + } + + @ParameterizedTest + @DisplayName("점수 확인") + @CsvSource(value = {"124;1 볼", + "214;1 스트라이크", + "173;1 스트라이크 2 볼", + "245;낫싱", + "713;3 스트라이크",}, delimiter = ';') + public void checkScore(String input,String expected){ + GameService gameService = new GameServiceImpl(); + Computer computer = new Computer(new ArrayList<>(Arrays.asList(7, 1, 3))); + User user = new User(); + user.setNumbers(input); + Score score = new Score(); + gameService.compareNumbers(computer, user, score); + String actual = score.getScore(); + assertThat(actual).isEqualTo(expected); + } + + @ParameterizedTest + @DisplayName("숫자 입력 테스트") + @CsvSource(value = {"123;[1, 2, 3]", + "112;숫자를 입력해주세요 : 잘못된 입력입니다.", + "1234;숫자를 입력해주세요 : 잘못된 입력입니다.", + "a12;숫자를 입력해주세요 : 잘못된 입력입니다."}, delimiter = ';') + void testInput(String input,String expected) throws IOException { + OutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + User user = new User(); + GameService gameService = new GameServiceImpl(); + String actual; + + systemIn(input); + gameService.userInput(user); + actual = user.getNumbers().toString(); + + if (user.getNumbers().isEmpty()){ + actual = out.toString().trim(); + } + assertThat(actual).isEqualTo(expected); + + } + + @ParameterizedTest + @DisplayName("플레이 테스트") + @CsvSource(value = {"123;숫자를 입력해주세요 : 1 스트라이크 1 볼", + "145;숫자를 입력해주세요 : 1 볼", + "671;숫자를 입력해주세요 : 2 볼", + "216;숫자를 입력해주세요 : 1 스트라이크", + "713;숫자를 입력해주세요 : 3 스트라이크\n3개의 숫자를 모두 맞히셨습니다! 게임 종료"}, delimiter = ';') + void testPlay(String input, String expected)throws IOException { + OutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + Computer computer = new Computer(new ArrayList<>(Arrays.asList(7, 1, 3))); + User user = new User(); + Score score = new Score(); + GameService gameService = new GameServiceImpl(); + + systemIn(input); + + gameService.playGame(computer, user, score); + + String actual = out.toString().trim(); + assertThat(actual).contains(expected); + + } + + + protected void systemIn(String input) { + System.setIn(new ByteArrayInputStream(input.getBytes())); + } +} From 07209f441353ee29644ef515ee7816aea1fc91f9 Mon Sep 17 00:00:00 2001 From: person003333 Date: Wed, 21 Dec 2022 15:32:39 +0900 Subject: [PATCH 18/18] =?UTF-8?q?feat:=20Application=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 프로그램을 실행하는 main문 작성 --- src/main/java/Application.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..c2325394 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,12 @@ +import controller.BaseBallController; + +import java.io.IOException; + +public class Application { + + public static void main(String[] args) throws IOException { + BaseBallController baseBallController = new BaseBallController(); + baseBallController.BaseBallGame(); + + } +}