From d3a43d25c5201fe4bf032d48a1802cb4966e39a5 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Wed, 28 Jun 2023 16:46:35 +0900 Subject: [PATCH 01/30] docs(README): list requirements and feature specifications --- docs/README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29..7119cc3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,34 @@ +- 요구사항 명세서 +-> 카테고리 +1. 컴퓨터 +2. 사용자 +3. 시스템 + +-> 요구사항 내용 +1. 컴퓨터 +1) 1 ~ 9까지 서로 다른 임의의 수 3개를 선택한다. +2) 사용자가 입력한 숫자에 대한 결과를 출력한다. + +2. 사용자 +1) 서로 다른 3개의 숫자를 입력한다. +2) 게임을 종료할 때 완전 종료와 다시 시작을 선택한다. + +3. 시스템 +1) 게임 시작 문구를 출력한다. +2) 사용자와 컴퓨터의 동작을 반복한다. +3) 3개의 숫자를 모두 맞히면 게임을 종료한다. +4) 게임이 종료할 때 사용자의 선택에 따라서 완전 종료하거나 다시 시작한다. +5) 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 App을 종료한다. + +- 기능 목록 +1. 게임 시작 +1) 게임 시작 문구 출력 + +2. 게임 진행 +1) 컴퓨터는 1 ~ 9까지 서로 다른 임의의 수 선택 +2) 사용자가 서로 다른 3개의 숫자를 입력 +3) 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 전혀 없으면 낫싱 출력 + +3. 게임 종료 +1) 사용자가 컴퓨터의 수를 맞추면 게임 종료 출력 +2) 재시작(1) / 종료(2) \ No newline at end of file From 79f3e7b64a6a164fe37291e87d8031a716e6bef5 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Wed, 28 Jun 2023 17:46:26 +0900 Subject: [PATCH 02/30] =?UTF-8?q?feat(Computer):=20=EC=83=81=EB=8C=80?= =?UTF-8?q?=EB=B0=A9=20=EC=BB=B4=ED=93=A8=ED=84=B0=20=EA=B0=9D=EC=B2=B4=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 --- src/main/java/baseball/model/Computer.java | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/main/java/baseball/model/Computer.java diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java new file mode 100644 index 0000000..71cd2a1 --- /dev/null +++ b/src/main/java/baseball/model/Computer.java @@ -0,0 +1,45 @@ +package baseball.model; + +import camp.nextstep.edu.missionutils.Randoms; + +public class Computer { + private String randomNumber; + + public Computer() { + saveRandomNumberWithGameStart(); + } + + public String getRandomNumber() { + return randomNumber; + } + + private void saveRandomNumberWithGameStart() { + randomNumber = ""; + String digit; + + while (checkLengthSmallThanThree()) { + digit = getRandomDigitToString(); + if (!hasDigitInRandomNumber(digit)) { + randomNumber += digit; + } + } + } + + private boolean checkLengthSmallThanThree() { + if (randomNumber.length() < 3) { + return true; + } + return false; + } + + private String getRandomDigitToString() { + return String.valueOf(Randoms.pickNumberInRange(1, 9)); + } + + private boolean hasDigitInRandomNumber(String digit) { + if (randomNumber.contains(digit)) { + return true; + } + return false; + } +} From bf40464156a574b5d1c65a7d7e4c4a48c0bdc03d Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 29 Jun 2023 17:00:23 +0900 Subject: [PATCH 03/30] =?UTF-8?q?test(Computer):=20=EC=83=81=EB=8C=80?= =?UTF-8?q?=EB=B0=A9=20=EC=BB=B4=ED=93=A8=ED=84=B0=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=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/main/java/baseball/model/Computer.java | 14 ++-- .../java/baseball/model/ComputerTest.java | 65 +++++++++++++++++++ 2 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 src/test/java/baseball/model/ComputerTest.java diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index 71cd2a1..472302e 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -3,40 +3,40 @@ import camp.nextstep.edu.missionutils.Randoms; public class Computer { - private String randomNumber; + public String randomNumber; public Computer() { - saveRandomNumberWithGameStart(); +// saveRandomNumberWithGameStart(); } public String getRandomNumber() { return randomNumber; } - private void saveRandomNumberWithGameStart() { + public void saveRandomNumberWithGameStart() { randomNumber = ""; String digit; while (checkLengthSmallThanThree()) { digit = getRandomDigitToString(); - if (!hasDigitInRandomNumber(digit)) { + if (!hasDuplicateDigitInRandomNumber(digit)) { randomNumber += digit; } } } - private boolean checkLengthSmallThanThree() { + public boolean checkLengthSmallThanThree() { if (randomNumber.length() < 3) { return true; } return false; } - private String getRandomDigitToString() { + public String getRandomDigitToString() { return String.valueOf(Randoms.pickNumberInRange(1, 9)); } - private boolean hasDigitInRandomNumber(String digit) { + public boolean hasDuplicateDigitInRandomNumber(String digit) { if (randomNumber.contains(digit)) { return true; } diff --git a/src/test/java/baseball/model/ComputerTest.java b/src/test/java/baseball/model/ComputerTest.java new file mode 100644 index 0000000..d579ed9 --- /dev/null +++ b/src/test/java/baseball/model/ComputerTest.java @@ -0,0 +1,65 @@ +package baseball.model; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ComputerTest { + @Test + @DisplayName("컴퓨터의 랜덤 수를 저장할 때 중복된 숫자를 가지지 않는지 테스트 ") + void hasDigitTest() { + // given + Computer computer = new Computer(); + + // when + computer.randomNumber = "123"; + + // then + assertThat(computer.hasDuplicateDigitInRandomNumber("1")).isTrue(); + } + + @Test + @DisplayName("한자리 랜덤 수 생성 테스트") + void getRandomDigitTest() { + // given + Computer computer = new Computer(); + + // when + String randomDigit = computer.getRandomDigitToString(); + int intRandomDigit = Integer.parseInt(randomDigit); + + // then + assertThat(intRandomDigit >= 1 && intRandomDigit <= 9).isTrue(); + } + + @Test + @DisplayName("랜덤수가 3자리 이하인지 체크 테스트") + void checkLengthTest() { + // given + Computer computer = new Computer(); + + // when + computer.randomNumber = "123"; + + // then + assertThat(computer.checkLengthSmallThanThree()).isTrue(); + } + + @Test + @DisplayName("랜덤 수 생성 테스트") + void saveRandomNumberTest() { + // given + Computer computer = new Computer(); + + // when + computer.saveRandomNumberWithGameStart(); + int intRandomNumber = Integer.parseInt(computer.randomNumber); + + // then + assertThat(intRandomNumber >= 111 && intRandomNumber <= 999); + System.out.println(intRandomNumber); + } +} \ No newline at end of file From 3861edba059d6ad55116b5e1a3c9aa83c8abc6f7 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 29 Jun 2023 17:33:06 +0900 Subject: [PATCH 04/30] =?UTF-8?q?refactor(Computer):=20=EC=83=81=EB=8C=80?= =?UTF-8?q?=EB=B0=A9=20=EC=BB=B4=ED=93=A8=ED=84=B0=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EC=88=98=20=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=B4=EC=97=88?= =?UTF-8?q?=EB=8D=98=20=EA=B2=83=20List=EB=A1=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - stream()을 사용하기 위해 String이었던 랜덤 수를 List로 변환 - 테스트를 위해 private을 public으로 변환 --- src/main/java/baseball/model/Computer.java | 25 +++++++++++-------- src/main/java/baseball/model/User.java | 13 ++++++++++ .../java/baseball/model/ComputerTest.java | 21 +++++++++------- 3 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 src/main/java/baseball/model/User.java diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index 472302e..9969d62 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -2,41 +2,44 @@ import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + public class Computer { - public String randomNumber; + public List randomNumber; public Computer() { -// saveRandomNumberWithGameStart(); + saveRandomNumberWithGameStart(); } - public String getRandomNumber() { + public List getRandomNumber() { return randomNumber; } public void saveRandomNumberWithGameStart() { - randomNumber = ""; - String digit; + randomNumber = new ArrayList<>(); + Integer digit; while (checkLengthSmallThanThree()) { - digit = getRandomDigitToString(); + digit = getRandomDigit(); if (!hasDuplicateDigitInRandomNumber(digit)) { - randomNumber += digit; + randomNumber.add(digit); } } } public boolean checkLengthSmallThanThree() { - if (randomNumber.length() < 3) { + if (randomNumber.size() < 3) { return true; } return false; } - public String getRandomDigitToString() { - return String.valueOf(Randoms.pickNumberInRange(1, 9)); + public Integer getRandomDigit() { + return Randoms.pickNumberInRange(1, 9); } - public boolean hasDuplicateDigitInRandomNumber(String digit) { + public boolean hasDuplicateDigitInRandomNumber(Integer digit) { if (randomNumber.contains(digit)) { return true; } diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java new file mode 100644 index 0000000..b380476 --- /dev/null +++ b/src/main/java/baseball/model/User.java @@ -0,0 +1,13 @@ +package baseball.model; + +public class User { + private enum RestartStatus { RESTART, TERMINATE } + + private String number; + + private void validateNumber(final String number) { + if (number.length() > 3 || number.length() < 3) { + throw new IllegalArgumentException("입력 숫자는 3자리입니다."); + } + } +} diff --git a/src/test/java/baseball/model/ComputerTest.java b/src/test/java/baseball/model/ComputerTest.java index d579ed9..c89d509 100644 --- a/src/test/java/baseball/model/ComputerTest.java +++ b/src/test/java/baseball/model/ComputerTest.java @@ -4,6 +4,10 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -15,10 +19,10 @@ void hasDigitTest() { Computer computer = new Computer(); // when - computer.randomNumber = "123"; + computer.randomNumber = new ArrayList<>(Arrays.asList(1, 2, 3)); // then - assertThat(computer.hasDuplicateDigitInRandomNumber("1")).isTrue(); + assertThat(computer.hasDuplicateDigitInRandomNumber(1)).isTrue(); } @Test @@ -28,11 +32,10 @@ void getRandomDigitTest() { Computer computer = new Computer(); // when - String randomDigit = computer.getRandomDigitToString(); - int intRandomDigit = Integer.parseInt(randomDigit); + Integer randomDigit = computer.getRandomDigit(); // then - assertThat(intRandomDigit >= 1 && intRandomDigit <= 9).isTrue(); + assertThat(randomDigit >= 1 && randomDigit <= 9).isTrue(); } @Test @@ -42,7 +45,7 @@ void checkLengthTest() { Computer computer = new Computer(); // when - computer.randomNumber = "123"; + computer.randomNumber = new ArrayList<>(Arrays.asList(1, 2)); // then assertThat(computer.checkLengthSmallThanThree()).isTrue(); @@ -56,10 +59,10 @@ void saveRandomNumberTest() { // when computer.saveRandomNumberWithGameStart(); - int intRandomNumber = Integer.parseInt(computer.randomNumber); + List randomNumber = computer.randomNumber; // then - assertThat(intRandomNumber >= 111 && intRandomNumber <= 999); - System.out.println(intRandomNumber); + assertThat(randomNumber.stream().allMatch(digit -> digit >= 111 && digit <= 999)); + System.out.println(randomNumber); } } \ No newline at end of file From ff86b26156eef84927b0210fb7d4dba65a8a8dce Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Thu, 29 Jun 2023 17:48:31 +0900 Subject: [PATCH 05/30] =?UTF-8?q?feat(User):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=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/model/User.java | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index b380476..a4e6963 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -1,13 +1,29 @@ package baseball.model; + +import java.util.List; + public class User { private enum RestartStatus { RESTART, TERMINATE } - private String number; + private List number; + private RestartStatus restartStatus; + + private void validateNumber(final List number) { + if (number.size() > 3 || number.size() < 3) { + throw new IllegalArgumentException("입력 숫자는 3자리입니다."); + } - private void validateNumber(final String number) { - if (number.length() > 3 || number.length() < 3) { + if (!number.stream().allMatch(digit -> digit >= 1 && digit <= 9)) { throw new IllegalArgumentException("입력 숫자는 3자리입니다."); } } + + public void restart() { + this.restartStatus = RestartStatus.RESTART; + } + + public void terminate() { + this.restartStatus = RestartStatus.TERMINATE; + } } From 7dd776f3736a7424a103c812963979065c723cdc Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Fri, 30 Jun 2023 19:38:21 +0900 Subject: [PATCH 06/30] =?UTF-8?q?feat(User):=20=EC=88=AB=EC=9E=90=EB=A5=BC?= =?UTF-8?q?=20=EB=8C=80=EC=9E=85=ED=95=98=EB=8A=94=20setNumber()=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 43 ++++++++++++++------------ src/main/java/baseball/model/User.java | 5 +++ 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/docs/README.md b/docs/README.md index 7119cc3..87922e9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,34 +1,39 @@ -- 요구사항 명세서 --> 카테고리 +# 요구사항 명세서 +### 카테고리 1. 컴퓨터 2. 사용자 3. 시스템 --> 요구사항 내용 +### 요구사항 내용 1. 컴퓨터 -1) 1 ~ 9까지 서로 다른 임의의 수 3개를 선택한다. -2) 사용자가 입력한 숫자에 대한 결과를 출력한다. + - 1 ~ 9까지 서로 다른 임의의 수 3개를 선택한다. + - 사용자가 입력한 숫자에 대한 결과를 출력한다. + + 2. 사용자 -1) 서로 다른 3개의 숫자를 입력한다. -2) 게임을 종료할 때 완전 종료와 다시 시작을 선택한다. + - 서로 다른 3개의 숫자를 입력한다. + - 게임을 종료할 때 완전 종료와 다시 시작을 선택한다. + 3. 시스템 -1) 게임 시작 문구를 출력한다. -2) 사용자와 컴퓨터의 동작을 반복한다. -3) 3개의 숫자를 모두 맞히면 게임을 종료한다. -4) 게임이 종료할 때 사용자의 선택에 따라서 완전 종료하거나 다시 시작한다. -5) 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 App을 종료한다. + - 게임 시작 문구를 출력한다. + - 사용자와 컴퓨터의 동작을 반복한다. + - 3개의 숫자를 모두 맞히면 게임을 종료한다. + 게임이 종료할 때 사용자의 선택에 따라서 완전 종료하거나 다시 시작한다. + - 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException을 발생시킨 후 App을 종료한다. -- 기능 목록 +# 기능 목록 1. 게임 시작 -1) 게임 시작 문구 출력 + - 게임 시작 문구 출력 + 2. 게임 진행 -1) 컴퓨터는 1 ~ 9까지 서로 다른 임의의 수 선택 -2) 사용자가 서로 다른 3개의 숫자를 입력 -3) 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 전혀 없으면 낫싱 출력 + - 컴퓨터는 1 ~ 9까지 서로 다른 임의의 수 선택 + - 사용자가 서로 다른 3개의 숫자를 입력 + - 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 전혀 없으면 낫싱 출력 + 3. 게임 종료 -1) 사용자가 컴퓨터의 수를 맞추면 게임 종료 출력 -2) 재시작(1) / 종료(2) \ No newline at end of file + - 사용자가 컴퓨터의 수를 맞추면 게임 종료 출력 + - 재시작(1) / 종료(2) \ No newline at end of file diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index a4e6963..612731c 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -9,6 +9,11 @@ private enum RestartStatus { RESTART, TERMINATE } private List number; private RestartStatus restartStatus; + public void setNumber(List number) { + validateNumber(number); + this.number = number; + } + private void validateNumber(final List number) { if (number.size() > 3 || number.size() < 3) { throw new IllegalArgumentException("입력 숫자는 3자리입니다."); From 6e1f6e5dd21baa61b871fce4132fb69e91a273a2 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Fri, 30 Jun 2023 19:49:25 +0900 Subject: [PATCH 07/30] =?UTF-8?q?test(User):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=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/main/java/baseball/model/User.java | 6 +-- src/test/java/baseball/model/UserTest.java | 55 ++++++++++++++++++++++ 2 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 src/test/java/baseball/model/UserTest.java diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index 612731c..138835d 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -4,17 +4,17 @@ import java.util.List; public class User { - private enum RestartStatus { RESTART, TERMINATE } + public enum RestartStatus { RESTART, TERMINATE } private List number; - private RestartStatus restartStatus; + public RestartStatus restartStatus; public void setNumber(List number) { validateNumber(number); this.number = number; } - private void validateNumber(final List number) { + public void validateNumber(final List number) { if (number.size() > 3 || number.size() < 3) { throw new IllegalArgumentException("입력 숫자는 3자리입니다."); } diff --git a/src/test/java/baseball/model/UserTest.java b/src/test/java/baseball/model/UserTest.java new file mode 100644 index 0000000..c3b6711 --- /dev/null +++ b/src/test/java/baseball/model/UserTest.java @@ -0,0 +1,55 @@ +package baseball.model; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class UserTest { + @Test + @DisplayName("3자리가 아닌 입력 숫자 검증 기능 테스트") + void validateNumberLengthTest() { + // given + User user = new User(); + + // when + ArrayList number = new ArrayList<>(Arrays.asList(1, 2)); + + // then + assertThatThrownBy(() -> user.validateNumber(number)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("3자리가 아닌 입력 숫자 검증 기능 테스트") + void validateDigitLengthTest() { + // given + User user = new User(); + + // when + ArrayList number = new ArrayList<>(Arrays.asList(1, 2, 33)); + + // then + assertThatThrownBy(() -> user.validateNumber(number)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("RestartStatus 테스트") + void UserTest() { + // given + User user = new User(); + + // when + user.terminate(); + + // then + assertThat(user.restartStatus).isEqualTo(User.RestartStatus.RESTART); + } +} \ No newline at end of file From b072ddf5cdd2e106137e704747b0e2febbee71f1 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Fri, 30 Jun 2023 20:34:11 +0900 Subject: [PATCH 08/30] =?UTF-8?q?feat(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EA=B0=80=20=EB=9E=9C=EB=8D=A4=20=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EB=A7=9E=EC=B6=94=EB=A9=B4=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91(1)=20/=20=EC=A2=85=EB=A3=8C(2)=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=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 | 43 +++++++++++++++++++ src/main/java/baseball/model/Computer.java | 10 ++--- src/main/java/baseball/model/User.java | 4 +- 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 src/main/java/baseball/controller/BaseballController.java diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java new file mode 100644 index 0000000..cdb64a4 --- /dev/null +++ b/src/main/java/baseball/controller/BaseballController.java @@ -0,0 +1,43 @@ +package baseball.controller; + +import baseball.model.User; +import camp.nextstep.edu.missionutils.Console; + +public class BaseballController { + public void terminateGame(User user) { + if (isTerminate()) { + user.terminate(); + System.out.println("완전 정료"); + } else { + user.restart(); + } + } + private boolean isTerminate() { + String restartStatus = Console.readLine(); + + validateRestart(restartStatus); + if(restartStatus == "2"){ + return true; + } else { + return false; + } + } + + private void validateRestart(final String restartStatus) { + if (Integer.parseInt(restartStatus) < 1 || Integer.parseInt(restartStatus) > 2) { + throw new IllegalArgumentException("재시작은 1, 완전 종료는 2 입니다."); + } + + if ( !(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+")) ) { + throw new IllegalArgumentException("재시작은 1, 완전 종료는 2인 정수입니다."); + } + + if (restartStatus.chars().allMatch(Character::isDigit)) { + throw new IllegalArgumentException("재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."); + } + } + + public void restartGame() { + // 게임을 끝내지 않을 것이라는 신호를 줌 + } +} diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index 9969d62..55d3dd5 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -6,7 +6,7 @@ import java.util.List; public class Computer { - public List randomNumber; + private List randomNumber; public Computer() { saveRandomNumberWithGameStart(); @@ -16,7 +16,7 @@ public List getRandomNumber() { return randomNumber; } - public void saveRandomNumberWithGameStart() { + private void saveRandomNumberWithGameStart() { randomNumber = new ArrayList<>(); Integer digit; @@ -28,18 +28,18 @@ public void saveRandomNumberWithGameStart() { } } - public boolean checkLengthSmallThanThree() { + private boolean checkLengthSmallThanThree() { if (randomNumber.size() < 3) { return true; } return false; } - public Integer getRandomDigit() { + private Integer getRandomDigit() { return Randoms.pickNumberInRange(1, 9); } - public boolean hasDuplicateDigitInRandomNumber(Integer digit) { + private boolean hasDuplicateDigitInRandomNumber(Integer digit) { if (randomNumber.contains(digit)) { return true; } diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index 138835d..f39326b 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -7,14 +7,14 @@ public class User { public enum RestartStatus { RESTART, TERMINATE } private List number; - public RestartStatus restartStatus; + private RestartStatus restartStatus; public void setNumber(List number) { validateNumber(number); this.number = number; } - public void validateNumber(final List number) { + private void validateNumber(final List number) { if (number.size() > 3 || number.size() < 3) { throw new IllegalArgumentException("입력 숫자는 3자리입니다."); } From cd05f8e1a08f36f540e9de84b6711e351872f47c Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Fri, 30 Jun 2023 21:14:17 +0900 Subject: [PATCH 09/30] =?UTF-8?q?test(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EA=B0=80=20=EB=9E=9C=EB=8D=A4=20=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EB=A7=9E=EC=B6=94=EB=A9=B4=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91(1)=20/=20=EC=A2=85=EB=A3=8C(2)=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=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 --- .../controller/BaseballController.java | 18 +++-- src/main/java/baseball/model/Computer.java | 10 +-- src/main/java/baseball/model/User.java | 4 +- .../controller/BaseballControllerTest.java | 77 +++++++++++++++++++ 4 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 src/test/java/baseball/controller/BaseballControllerTest.java diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index cdb64a4..415c596 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -12,27 +12,35 @@ public void terminateGame(User user) { user.restart(); } } - private boolean isTerminate() { + public boolean isTerminate() { String restartStatus = Console.readLine(); - validateRestart(restartStatus); - if(restartStatus == "2"){ + validateRangeRestartStatus(restartStatus); + validateNotStringRestartStatus(restartStatus); + validateNotStringRestartStatus(restartStatus); + + + if(restartStatus.equals("2") ){ return true; } else { return false; } } - private void validateRestart(final String restartStatus) { + public void validateRangeRestartStatus(final String restartStatus) { if (Integer.parseInt(restartStatus) < 1 || Integer.parseInt(restartStatus) > 2) { throw new IllegalArgumentException("재시작은 1, 완전 종료는 2 입니다."); } + } + public void validateNotStringRestartStatus(final String restartStatus) { if ( !(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+")) ) { throw new IllegalArgumentException("재시작은 1, 완전 종료는 2인 정수입니다."); } + } - if (restartStatus.chars().allMatch(Character::isDigit)) { + public void validateNotDoubleRestartStatus(final String restartStatus) { + if (!restartStatus.chars().allMatch(Character::isDigit)) { throw new IllegalArgumentException("재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."); } } diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index 55d3dd5..9969d62 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -6,7 +6,7 @@ import java.util.List; public class Computer { - private List randomNumber; + public List randomNumber; public Computer() { saveRandomNumberWithGameStart(); @@ -16,7 +16,7 @@ public List getRandomNumber() { return randomNumber; } - private void saveRandomNumberWithGameStart() { + public void saveRandomNumberWithGameStart() { randomNumber = new ArrayList<>(); Integer digit; @@ -28,18 +28,18 @@ private void saveRandomNumberWithGameStart() { } } - private boolean checkLengthSmallThanThree() { + public boolean checkLengthSmallThanThree() { if (randomNumber.size() < 3) { return true; } return false; } - private Integer getRandomDigit() { + public Integer getRandomDigit() { return Randoms.pickNumberInRange(1, 9); } - private boolean hasDuplicateDigitInRandomNumber(Integer digit) { + public boolean hasDuplicateDigitInRandomNumber(Integer digit) { if (randomNumber.contains(digit)) { return true; } diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index f39326b..138835d 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -7,14 +7,14 @@ public class User { public enum RestartStatus { RESTART, TERMINATE } private List number; - private RestartStatus restartStatus; + public RestartStatus restartStatus; public void setNumber(List number) { validateNumber(number); this.number = number; } - private void validateNumber(final List number) { + public void validateNumber(final List number) { if (number.size() > 3 || number.size() < 3) { throw new IllegalArgumentException("입력 숫자는 3자리입니다."); } diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java new file mode 100644 index 0000000..4d90f56 --- /dev/null +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -0,0 +1,77 @@ +package baseball.controller; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.*; + +class BaseballControllerTest { + @Test + @DisplayName("재시작 검증 테스트") + void ValidateRangeRestartStatusTest() { + // given + String restartStatus = "5"; + BaseballController controller = new BaseballController(); + + // when + + + // then + assertThatThrownBy(() -> controller.validateRangeRestartStatus(restartStatus)) + .isInstanceOf(IllegalArgumentException.class); + + } + + @Test + @DisplayName("재시작 검증 테스트") + void ValidateNotStringRestartStatusTest() { + // given + String restartStatus = "*"; + BaseballController controller = new BaseballController(); + + // when + + + // then + assertThatThrownBy(() -> controller.validateNotStringRestartStatus(restartStatus)) + .isInstanceOf(IllegalArgumentException.class); + + } + + @Test + @DisplayName("재시작 검증 테스트") + void validateNotDoubleRestartStatusTest() { + // given + String restartStatus = "1.2"; + BaseballController controller = new BaseballController(); + + // when + + + // then + assertThatThrownBy(() -> controller.validateNotDoubleRestartStatus(restartStatus)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + @DisplayName("사용자 입력에 따른 종료 테스트") + void BaseballControllerTest() { + // given + // 콘솔 입력 시뮬레이션 + String input = "1"; + ByteArrayInputStream inputStream = new ByteArrayInputStream(input.getBytes()); + System.setIn(inputStream); + + BaseballController controller = new BaseballController(); + + // when + + // then + assertThat(controller.isTerminate()).isFalse(); + } +} \ No newline at end of file From c9f6dab42f338e24099c092217ec093083c2a5e5 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 17:15:45 +0900 Subject: [PATCH 10/30] =?UTF-8?q?refactor(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EA=B0=80=20=EB=9E=9C=EB=8D=A4=20=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EB=A7=9E=EC=B6=94=EB=A9=B4=20=EC=9E=AC=EC=8B=9C?= =?UTF-8?q?=EC=9E=91(1)=20/=20=EC=A2=85=EB=A5=98(2)=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 종료 신호 사용자 입력 메서드 분리 - BaseballControllerTest 코드 terminateTest 메서드에서 console 입력 부분 String 변수 초기화로 대체 --- .../baseball/controller/BaseballController.java | 14 ++++++++------ .../controller/BaseballControllerTest.java | 11 ++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 415c596..4c6f2d7 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -5,20 +5,18 @@ public class BaseballController { public void terminateGame(User user) { - if (isTerminate()) { + if (isTerminate(terminateSignUserInput())) { user.terminate(); - System.out.println("완전 정료"); + System.out.println("완전 종료"); } else { user.restart(); } } - public boolean isTerminate() { - String restartStatus = Console.readLine(); + public boolean isTerminate(String restartStatus) { validateRangeRestartStatus(restartStatus); validateNotStringRestartStatus(restartStatus); - validateNotStringRestartStatus(restartStatus); - + validateNotDoubleRestartStatus(restartStatus); if(restartStatus.equals("2") ){ return true; @@ -45,6 +43,10 @@ public void validateNotDoubleRestartStatus(final String restartStatus) { } } + private String terminateSignUserInput() { + return Console.readLine(); + } + public void restartGame() { // 게임을 끝내지 않을 것이라는 신호를 줌 } diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index 4d90f56..d12b2b9 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -1,5 +1,6 @@ package baseball.controller; +import baseball.model.User; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -60,18 +61,14 @@ void validateNotDoubleRestartStatusTest() { @Test @DisplayName("사용자 입력에 따른 종료 테스트") - void BaseballControllerTest() { + void terminateTest() { // given - // 콘솔 입력 시뮬레이션 - String input = "1"; - ByteArrayInputStream inputStream = new ByteArrayInputStream(input.getBytes()); - System.setIn(inputStream); - + String restartStatus = "1"; BaseballController controller = new BaseballController(); // when // then - assertThat(controller.isTerminate()).isFalse(); + assertThat(controller.isTerminate(restartStatus)).isFalse(); } } \ No newline at end of file From 968677aa6dace206be1b63aac5d038bea37f18f5 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 17:45:32 +0900 Subject: [PATCH 11/30] =?UTF-8?q?feat(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EA=B2=B0=EA=B3=BC=20=EB=B0=98=ED=99=98(=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC,=20=EB=B3=BC,=20=EB=82=AB?= =?UTF-8?q?=EC=8B=B1)=20=EA=B8=B0=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 --- .../controller/BaseballController.java | 75 +++++++++++++++++++ src/main/java/baseball/model/User.java | 4 + 2 files changed, 79 insertions(+) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 4c6f2d7..559c683 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -1,9 +1,82 @@ package baseball.controller; +import baseball.model.Computer; import baseball.model.User; import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.List; + public class BaseballController { + + public void gameStart(User user) { + String inputNumber = Console.readLine(); + List number = new ArrayList<>(); + + for (int i = 0; i < inputNumber.length(); i++) { + number.add(Integer.valueOf(inputNumber.charAt(i))); + } + + user.setNumber(number); + } + + public int getStrikeCount(User user, Computer computer) { + List computerRandomNumber = computer.getRandomNumber(); + List userNumber = user.getNumber(); + int strikeCnt = 0; + for (int i = 0; i < computerRandomNumber.size(); i++) { + if (isStrike(computerRandomNumber.get(i), userNumber.get(i))) { + strikeCnt += 1; + } + } + + return strikeCnt; + } + + public boolean isStrike(Integer computerRandomNumberDigit, Integer userNumberDigit) { + if (computerRandomNumberDigit == userNumberDigit) { + return true; + } + + return false; + } + + /* + 1 ~ 9까지보면서 컴퓨터와 사용자가 둘 다 가지고 있는데 contain + 인덱스 자리는 다른 거의 갯수 세기 + */ + public int getBallCount(User user, Computer computer) { + List computerRandomNumber = computer.getRandomNumber(); + List userNumber = user.getNumber(); + int ballCnt = 0; + + for (int i = 1; i <= 9; i++) { + if (isBall(computerRandomNumber, userNumber, i)) { + ballCnt += 1; + } + } + + return ballCnt; + } + + public boolean isBall(List computerRandomNumber, List userNumber, int idx) { + if (hasBothNumberContain(computerRandomNumber, userNumber, idx)) { + if (computerRandomNumber.indexOf(idx) != userNumber.indexOf(idx)) { + return true; + } + } + + return false; + } + + public boolean hasBothNumberContain(List computerRandomNumber, List userNumber, int idx) { + if (computerRandomNumber.contains(idx) && userNumber.contains(idx)) { + return true; + } + + return false; + } + public void terminateGame(User user) { if (isTerminate(terminateSignUserInput())) { user.terminate(); @@ -25,6 +98,8 @@ public boolean isTerminate(String restartStatus) { } } + + public void validateRangeRestartStatus(final String restartStatus) { if (Integer.parseInt(restartStatus) < 1 || Integer.parseInt(restartStatus) > 2) { throw new IllegalArgumentException("재시작은 1, 완전 종료는 2 입니다."); diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index 138835d..0e9bea9 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -31,4 +31,8 @@ public void restart() { public void terminate() { this.restartStatus = RestartStatus.TERMINATE; } + + public List getNumber() { + return number; + } } From 8b975fc3c22a1b1b8e0d826fd3e7519d611bd401 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 17:57:49 +0900 Subject: [PATCH 12/30] =?UTF-8?q?test(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=20=EC=88=AB=EC=9E=90=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EA=B2=B0=EA=B3=BC=20=EB=B0=98=ED=99=98(=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=9D=BC=EC=9D=B4=ED=81=AC,=20=EB=B3=BC,=20=EB=82=AB?= =?UTF-8?q?=EC=8B=B1)=20=EA=B8=B0=EB=8A=A5=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 - 테스트를 위해 컴퓨터의 생성자에 save 메서드 주석처리 --- src/main/java/baseball/model/Computer.java | 6 ++- .../controller/BaseballControllerTest.java | 37 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index 9969d62..223c96e 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -9,7 +9,7 @@ public class Computer { public List randomNumber; public Computer() { - saveRandomNumberWithGameStart(); +// saveRandomNumberWithGameStart(); } public List getRandomNumber() { @@ -45,4 +45,8 @@ public boolean hasDuplicateDigitInRandomNumber(Integer digit) { } return false; } + + public void setRandomNumber(List randomNumber) { + this.randomNumber = randomNumber; + } } diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index d12b2b9..a0c7549 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -1,14 +1,17 @@ package baseball.controller; +import baseball.model.Computer; import baseball.model.User; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.io.ByteArrayInputStream; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.InstanceOfAssertFactories.comparable; import static org.junit.jupiter.api.Assertions.*; class BaseballControllerTest { @@ -71,4 +74,38 @@ void terminateTest() { // then assertThat(controller.isTerminate(restartStatus)).isFalse(); } + + @Test + @DisplayName("스트라이크 개수 세기 테스트") + void getStrikeCountTest() { + // given + BaseballController controller = new BaseballController(); + Computer computer = new Computer(); + User user = new User(); + + // when + user.setNumber(List.of(1, 2, 3)); + computer.setRandomNumber(List.of(1, 4, 4)); + int strikeCount = controller.getStrikeCount(user, computer); + + // then + assertThat(strikeCount).isEqualTo(2); + } + + @Test + @DisplayName("볼 갯수 세기 테스트") + void getBallCountTest() { + // given + BaseballController controller = new BaseballController(); + Computer computer = new Computer(); + User user = new User(); + + // when + user.setNumber(List.of(1, 2, 3)); + computer.setRandomNumber(List.of(4, 7, 5)); + int ballCount = controller.getBallCount(user, computer); + + // then + assertThat(ballCount).isEqualTo(0); + } } \ No newline at end of file From d498845b211e7ca15d828cc068e3a0c7991868b7 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 20:55:11 +0900 Subject: [PATCH 13/30] =?UTF-8?q?feat(BaseballController):=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=8B=9C=EC=9E=91=20=EA=B8=B0=EB=8A=A5=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 --- .../java/baseball/controller/BaseballController.java | 12 +++--------- src/main/java/baseball/model/Computer.java | 2 +- .../baseball/controller/BaseballControllerTest.java | 2 +- src/test/java/baseball/model/UserTest.java | 2 +- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 559c683..a7c2839 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -9,15 +9,9 @@ public class BaseballController { - public void gameStart(User user) { - String inputNumber = Console.readLine(); - List number = new ArrayList<>(); - - for (int i = 0; i < inputNumber.length(); i++) { - number.add(Integer.valueOf(inputNumber.charAt(i))); - } - - user.setNumber(number); + public Computer gameStart() { + System.out.println("숫자 야구 게임을 시작합니다."); + return new Computer(); } public int getStrikeCount(User user, Computer computer) { diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index 223c96e..c862470 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -9,7 +9,7 @@ public class Computer { public List randomNumber; public Computer() { -// saveRandomNumberWithGameStart(); + saveRandomNumberWithGameStart(); } public List getRandomNumber() { diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index a0c7549..3f81281 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -89,7 +89,7 @@ void getStrikeCountTest() { int strikeCount = controller.getStrikeCount(user, computer); // then - assertThat(strikeCount).isEqualTo(2); + assertThat(strikeCount).isEqualTo(1); } @Test diff --git a/src/test/java/baseball/model/UserTest.java b/src/test/java/baseball/model/UserTest.java index c3b6711..7c3b6d1 100644 --- a/src/test/java/baseball/model/UserTest.java +++ b/src/test/java/baseball/model/UserTest.java @@ -50,6 +50,6 @@ void UserTest() { user.terminate(); // then - assertThat(user.restartStatus).isEqualTo(User.RestartStatus.RESTART); + assertThat(user.restartStatus).isEqualTo(User.RestartStatus.TERMINATE); } } \ No newline at end of file From 8ba83687ef89a788ddeb3c44c41071f3e725cadc Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 21:03:22 +0900 Subject: [PATCH 14/30] =?UTF-8?q?feat(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=203=EC=9E=90=EB=A6=AC=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=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 --- .../controller/BaseballController.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index a7c2839..37a741a 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -14,6 +14,26 @@ public Computer gameStart() { return new Computer(); } + public void playGame(Computer computer) { + User user = new User(); + inputUserNumber(user); + } + + private void inputUserNumber(User user) { + String inputNumber = Console.readLine(); + List number = new ArrayList<>(); + + for (int i = 0; i < inputNumber.length(); i++) { + char digitNumber = inputNumber.charAt(i); + String digitStringNumber = String.valueOf(digitNumber); + + validateNotStringRestartStatus(digitStringNumber); + number.add(Integer.valueOf(digitStringNumber)); + } + + user.setNumber(number); + } + public int getStrikeCount(User user, Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); From 3e2370790305aa61f0fdcbfd707814992e107ea5 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 21:14:42 +0900 Subject: [PATCH 15/30] =?UTF-8?q?test(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=203=EC=9E=90=EB=A6=AC=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballControllerTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index 3f81281..cfb4d05 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -108,4 +109,20 @@ void getBallCountTest() { // then assertThat(ballCount).isEqualTo(0); } + + @Test + @DisplayName("사용자 3자리 수 입력 테스트") + void inputUserNumberTest() { + // given + BaseballController controller = new BaseballController(); + + String userInput = "123"; // Replace with the desired input + InputStream inputStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inputStream); + + // when + controller.playGame(new Computer()); + + // then + } } \ No newline at end of file From 63e284e80d271d6b91c6f1ddf90bd15ef7e1b23b Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 21:25:52 +0900 Subject: [PATCH 16/30] =?UTF-8?q?feat(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=203=EC=9E=90=EB=A6=AC=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=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 --- .../java/baseball/controller/BaseballController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 37a741a..34efec6 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -17,9 +17,21 @@ public Computer gameStart() { public void playGame(Computer computer) { User user = new User(); inputUserNumber(user); + + int strikeCount = getStrikeCount(user, computer); + int ballCount = getBallCount(user, computer); + + if (strikeCount == 3) { + System.out.println(strikeCount + "스트라이크"); + } else if (strikeCount == 0 && ballCount == 0) { + System.out.println("낫싱"); + } else { + System.out.println(ballCount + "볼 " + strikeCount + "스트라이크"); + } } private void inputUserNumber(User user) { + System.out.print("숫자를 입력해주세요 : "); String inputNumber = Console.readLine(); List number = new ArrayList<>(); From 6faf838ec31370e2a924c40408d4c1f3eeedb05d Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 21:32:33 +0900 Subject: [PATCH 17/30] =?UTF-8?q?test(BaseballController):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=203=EC=9E=90=EB=A6=AC=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=EC=97=90=20=EB=94=B0=EB=A5=B8=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EB=B0=98=ED=99=98=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - controller의 playGame 메서드에 주석은 resultTest 출력을 보기 위한 것으로 이렇게 해도 되는지 질문하고 싶습니다. --- .../controller/BaseballController.java | 5 +++++ .../controller/BaseballControllerTest.java | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 34efec6..a6d8a87 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -18,6 +18,11 @@ public void playGame(Computer computer) { User user = new User(); inputUserNumber(user); + /* + System.out.println(user.getNumber()); + System.out.println(computer.getRandomNumber()); + */ + int strikeCount = getStrikeCount(user, computer); int ballCount = getBallCount(user, computer); diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index cfb4d05..154e6ee 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -116,7 +116,23 @@ void inputUserNumberTest() { // given BaseballController controller = new BaseballController(); - String userInput = "123"; // Replace with the desired input + String userInput = "123"; + InputStream inputStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inputStream); + + // when + controller.playGame(new Computer()); + + // then + } + + @Test + @DisplayName("사용자 입력에 따른 결과 반환 테스트") + void resultTest() { + // given + BaseballController controller = new BaseballController(); + + String userInput = "123"; InputStream inputStream = new ByteArrayInputStream(userInput.getBytes()); System.setIn(inputStream); From 79a73e241dcd07ac063eb07a20945052ca6bfa6d Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 21:50:20 +0900 Subject: [PATCH 18/30] =?UTF-8?q?feat(BaseballController)=20:=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=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 --- .../controller/BaseballController.java | 51 +++++++++++-------- src/main/java/baseball/model/User.java | 4 ++ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index a6d8a87..53a9e7e 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -16,22 +16,40 @@ public Computer gameStart() { public void playGame(Computer computer) { User user = new User(); - inputUserNumber(user); - /* - System.out.println(user.getNumber()); - System.out.println(computer.getRandomNumber()); - */ - int strikeCount = getStrikeCount(user, computer); - int ballCount = getBallCount(user, computer); + while (true) { + inputUserNumber(user); - if (strikeCount == 3) { - System.out.println(strikeCount + "스트라이크"); - } else if (strikeCount == 0 && ballCount == 0) { - System.out.println("낫싱"); + /* + System.out.println(user.getNumber()); + System.out.println(computer.getRandomNumber()); + */ + + int strikeCount = getStrikeCount(user, computer); + int ballCount = getBallCount(user, computer); + + if (strikeCount == 3) { + System.out.println(strikeCount + "스트라이크"); + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + break; + } else if (strikeCount == 0 && ballCount == 0) { + System.out.println("낫싱"); + } else { + System.out.println(ballCount + "볼 " + strikeCount + "스트라이크"); + } + } + } + + public boolean gameOver(User user) { + terminateGame(user); + + if (user.getRestartStatus() == User.RestartStatus.TERMINATE) { + System.out.println("완전 종료"); + return true; } else { - System.out.println(ballCount + "볼 " + strikeCount + "스트라이크"); + return false; } } @@ -72,10 +90,6 @@ public boolean isStrike(Integer computerRandomNumberDigit, Integer userNumberDig return false; } - /* - 1 ~ 9까지보면서 컴퓨터와 사용자가 둘 다 가지고 있는데 contain - 인덱스 자리는 다른 거의 갯수 세기 - */ public int getBallCount(User user, Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); @@ -111,7 +125,6 @@ public boolean hasBothNumberContain(List computerRandomNumber, List getNumber() { return number; } + + public RestartStatus getRestartStatus() { + return restartStatus; + } } From 45901c9ceba4fd3f73f439403d4d7c8a2801d7b0 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 21:56:47 +0900 Subject: [PATCH 19/30] =?UTF-8?q?test(BaseballController)=20:=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=20=EC=A2=85=EB=A3=8C=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballControllerTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index 154e6ee..456c2ca 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -141,4 +141,23 @@ void resultTest() { // then } + + @Test + @DisplayName("게임 종료 테스트") + void gameOverTest() { + // given + BaseballController controller = new BaseballController(); + User user = new User(); + + String userInput = "1"; + InputStream inputStream = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(inputStream); + + // when + boolean isGameOver = controller.gameOver(user); + + // then + assertThat(isGameOver).isFalse(); + assertThat(user.getRestartStatus()).isEqualTo(User.RestartStatus.RESTART); + } } \ No newline at end of file From 7ccf4e93568b43a10e7e6d7fbe928a4fb8876675 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Sat, 1 Jul 2023 23:10:14 +0900 Subject: [PATCH 20/30] =?UTF-8?q?refactor(BaseballController)=20:=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EB=82=98=EB=A6=AC=EC=98=A4?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20run=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - user의 RestartStatus에 재시작 여부를 입력하던 terminateGame 메서드를 삭제 - gameOver 메서드에서 terminateGame 메서드 제거 - 게임 재시작시 컴퓨터의 랜덤수가 동일한 문제 해결 --- src/main/java/baseball/Application.java | 3 +++ .../controller/BaseballController.java | 27 ++++++++----------- .../controller/BaseballControllerTest.java | 8 +++--- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34..1227abf 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: 프로그램 구현 + new BaseballController().run(); } } diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 53a9e7e..b12d583 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -8,6 +8,12 @@ import java.util.List; public class BaseballController { + public void run() { + do { + Computer computer = gameStart(); + playGame(computer); + } while (gameOver()); + } public Computer gameStart() { System.out.println("숫자 야구 게임을 시작합니다."); @@ -17,7 +23,6 @@ public Computer gameStart() { public void playGame(Computer computer) { User user = new User(); - while (true) { inputUserNumber(user); @@ -42,13 +47,11 @@ public void playGame(Computer computer) { } } - public boolean gameOver(User user) { - terminateGame(user); - - if (user.getRestartStatus() == User.RestartStatus.TERMINATE) { - System.out.println("완전 종료"); + public boolean gameOver() { + if (isTerminate(terminateSignUserInput())) { return true; } else { + System.out.println("완전 종료"); return false; } } @@ -122,23 +125,15 @@ public boolean hasBothNumberContain(List computerRandomNumber, List Date: Mon, 3 Jul 2023 10:37:08 +0900 Subject: [PATCH 21/30] =?UTF-8?q?refactor(OutputView)=20:=20=ED=95=98?= =?UTF-8?q?=EB=93=9C=EC=BD=94=EB=94=A9=20=ED=96=88=EB=8D=98=20=EA=B2=83=20?= =?UTF-8?q?view=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=83=81=EC=88=98?= =?UTF-8?q?=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/OutputView.java | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/baseball/view/OutputView.java diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java new file mode 100644 index 0000000..67f7bdb --- /dev/null +++ b/src/main/java/baseball/view/OutputView.java @@ -0,0 +1,27 @@ +package baseball.view; + +public class OutputView { + + public static final String GAME_START_MESSAGE = "숫자 야구 게임을 시작합니다."; + public static final String STRIKE_MESSAGE = "스트라이크"; + public static final String GAME_OVER_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임종료"; + public static final String GAME_RESTART_OR_END_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"; + public static final String NOTHING_MESSAGE = "낫싱"; + public static final String BALL_MESSAGE = "볼 "; + + public static void printGameStartMessage() { + System.out.println(GAME_START_MESSAGE); + } + + public static void printGameResultMessage(final int strikeCount, final int ballCount) { + if (strikeCount == 3) { + System.out.println(strikeCount + STRIKE_MESSAGE); + System.out.println(GAME_OVER_MESSAGE); + System.out.println(GAME_RESTART_OR_END_MESSAGE); + } else if (strikeCount == 0 && ballCount == 0) { + System.out.println(NOTHING_MESSAGE); + } else { + System.out.println(ballCount + BALL_MESSAGE + strikeCount + STRIKE_MESSAGE); + } + } +} From 4c2425886f554a9f33bcb21bcfc5d8b7bc05662e Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 10:37:19 +0900 Subject: [PATCH 22/30] =?UTF-8?q?refactor(InputView)=20:=20=ED=95=98?= =?UTF-8?q?=EB=93=9C=EC=BD=94=EB=94=A9=20=ED=96=88=EB=8D=98=20=EA=B2=83=20?= =?UTF-8?q?view=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=83=81=EC=88=98?= =?UTF-8?q?=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/view/InputView.java | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/baseball/view/InputView.java diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java new file mode 100644 index 0000000..c599c82 --- /dev/null +++ b/src/main/java/baseball/view/InputView.java @@ -0,0 +1,34 @@ +package baseball.view; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.List; + +public class InputView { + + public static final String INPUT_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; + public static final String STRING_REGEX = "[-+]?\\d*\\.?\\d+"; + public static final String RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; + + public static List inputNumber() { + System.out.print(INPUT_NUMBER_MESSAGE); + String inputNumber = Console.readLine(); + List number = new ArrayList<>(); + + for (int i = 0; i < inputNumber.length(); i++) { + char digitNumber = inputNumber.charAt(i); + String digitStringNumber = String.valueOf(digitNumber); + + validateNotStringRestartStatus(digitStringNumber); + number.add(Integer.valueOf(digitStringNumber)); + } + return number; + } + + public static void validateNotStringRestartStatus(final String restartStatus) { + if ( !(restartStatus != null && restartStatus.matches(STRING_REGEX)) ) { + throw new IllegalArgumentException(RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION); + } + } +} From c4321d5785bee5672572048976699b6b650997cd Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 10:42:23 +0900 Subject: [PATCH 23/30] =?UTF-8?q?refactor(BaseballController)=20:=20?= =?UTF-8?q?=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=20=ED=96=88=EB=8D=98=20?= =?UTF-8?q?=EA=B2=83=20=EC=83=81=EC=88=98=EB=A1=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 58 +++++-------------- 1 file changed, 16 insertions(+), 42 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index b12d583..922193e 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -3,12 +3,20 @@ import baseball.model.Computer; import baseball.model.User; import camp.nextstep.edu.missionutils.Console; - -import java.util.ArrayList; import java.util.List; +import static baseball.view.InputView.inputNumber; +import static baseball.view.OutputView.*; + public class BaseballController { + + public static final String NOT_RESTART_STATUS = "2"; + public static final String RESTART_OR_END_ONE_OR_TWO_EXCEPTION = "재시작은 1, 완전 종료는 2 입니다."; + public static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; + public static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."; + public void run() { + printGameStartMessage(); do { Computer computer = gameStart(); playGame(computer); @@ -16,33 +24,19 @@ public void run() { } public Computer gameStart() { - System.out.println("숫자 야구 게임을 시작합니다."); return new Computer(); } public void playGame(Computer computer) { User user = new User(); - while (true) { inputUserNumber(user); - - /* - System.out.println(user.getNumber()); - System.out.println(computer.getRandomNumber()); - */ - int strikeCount = getStrikeCount(user, computer); int ballCount = getBallCount(user, computer); + printGameResultMessage(strikeCount, ballCount); if (strikeCount == 3) { - System.out.println(strikeCount + "스트라이크"); - System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임종료"); - System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); break; - } else if (strikeCount == 0 && ballCount == 0) { - System.out.println("낫싱"); - } else { - System.out.println(ballCount + "볼 " + strikeCount + "스트라이크"); } } } @@ -51,25 +45,12 @@ public boolean gameOver() { if (isTerminate(terminateSignUserInput())) { return true; } else { - System.out.println("완전 종료"); return false; } } private void inputUserNumber(User user) { - System.out.print("숫자를 입력해주세요 : "); - String inputNumber = Console.readLine(); - List number = new ArrayList<>(); - - for (int i = 0; i < inputNumber.length(); i++) { - char digitNumber = inputNumber.charAt(i); - String digitStringNumber = String.valueOf(digitNumber); - - validateNotStringRestartStatus(digitStringNumber); - number.add(Integer.valueOf(digitStringNumber)); - } - - user.setNumber(number); + user.setNumber(inputNumber()); } public int getStrikeCount(User user, Computer computer) { @@ -81,7 +62,6 @@ public int getStrikeCount(User user, Computer computer) { strikeCnt += 1; } } - return strikeCnt; } @@ -89,7 +69,6 @@ public boolean isStrike(Integer computerRandomNumberDigit, Integer userNumberDig if (computerRandomNumberDigit == userNumberDigit) { return true; } - return false; } @@ -103,7 +82,6 @@ public int getBallCount(User user, Computer computer) { ballCnt += 1; } } - return ballCnt; } @@ -113,7 +91,6 @@ public boolean isBall(List computerRandomNumber, List userNumb return true; } } - return false; } @@ -121,7 +98,6 @@ public boolean hasBothNumberContain(List computerRandomNumber, List 2) { - throw new IllegalArgumentException("재시작은 1, 완전 종료는 2 입니다."); + throw new IllegalArgumentException(RESTART_OR_END_ONE_OR_TWO_EXCEPTION); } } public void validateNotStringRestartStatus(final String restartStatus) { if ( !(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+")) ) { - throw new IllegalArgumentException("재시작은 1, 완전 종료는 2인 정수입니다."); + throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION); } } public void validateNotDoubleRestartStatus(final String restartStatus) { if (!restartStatus.chars().allMatch(Character::isDigit)) { - throw new IllegalArgumentException("재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."); + throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION); } } From 4aa97f212fda38efec6f6e8fa07ba4e668975449 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 10:44:03 +0900 Subject: [PATCH 24/30] =?UTF-8?q?refactor(User)=20:=20=ED=95=98=EB=93=9C?= =?UTF-8?q?=EC=BD=94=EB=94=A9=20=ED=96=88=EB=8D=98=20=EA=B2=83=20=EC=83=81?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/model/User.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index cc4c55e..4fef780 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -4,6 +4,10 @@ import java.util.List; public class User { + + public static final String INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION = "입력 숫자는 3자리입니다."; + public static final String INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION = "입력 숫자는 3자리입니다."; + public enum RestartStatus { RESTART, TERMINATE } private List number; @@ -16,11 +20,11 @@ public void setNumber(List number) { public void validateNumber(final List number) { if (number.size() > 3 || number.size() < 3) { - throw new IllegalArgumentException("입력 숫자는 3자리입니다."); + throw new IllegalArgumentException(INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION); } if (!number.stream().allMatch(digit -> digit >= 1 && digit <= 9)) { - throw new IllegalArgumentException("입력 숫자는 3자리입니다."); + throw new IllegalArgumentException(INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION); } } From c133bc31ecbd56d9459e7615264213b72aa91870 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 11:10:08 +0900 Subject: [PATCH 25/30] =?UTF-8?q?refactor(BaseballController)=20:=20User,?= =?UTF-8?q?=20Computer=20=EC=A7=80=EC=97=AD=EB=B3=80=EC=88=98=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=84=EC=97=AD=20=EB=B3=80=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 17 +++++++------ .../controller/BaseballControllerTest.java | 25 ++++--------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 922193e..2cd507a 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -15,22 +15,25 @@ public class BaseballController { public static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; public static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."; + private User user; + private Computer computer; + public void run() { - printGameStartMessage(); do { - Computer computer = gameStart(); - playGame(computer); + computer = gameStart(); + playGame(); } while (gameOver()); } public Computer gameStart() { + printGameStartMessage(); return new Computer(); } - public void playGame(Computer computer) { - User user = new User(); + public void playGame() { + user = new User(); while (true) { - inputUserNumber(user); + inputUserNumber(); int strikeCount = getStrikeCount(user, computer); int ballCount = getBallCount(user, computer); @@ -49,7 +52,7 @@ public boolean gameOver() { } } - private void inputUserNumber(User user) { + private void inputUserNumber() { user.setNumber(inputNumber()); } diff --git a/src/test/java/baseball/controller/BaseballControllerTest.java b/src/test/java/baseball/controller/BaseballControllerTest.java index 8bfc3b5..1f7a7a9 100644 --- a/src/test/java/baseball/controller/BaseballControllerTest.java +++ b/src/test/java/baseball/controller/BaseballControllerTest.java @@ -2,6 +2,7 @@ import baseball.model.Computer; import baseball.model.User; +import baseball.view.InputView; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,8 +11,7 @@ import java.io.InputStream; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.InstanceOfAssertFactories.comparable; import static org.junit.jupiter.api.Assertions.*; @@ -114,32 +114,17 @@ void getBallCountTest() { @DisplayName("사용자 3자리 수 입력 테스트") void inputUserNumberTest() { // given - BaseballController controller = new BaseballController(); - - String userInput = "123"; - InputStream inputStream = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(inputStream); - - // when - controller.playGame(new Computer()); - - // then - } - - @Test - @DisplayName("사용자 입력에 따른 결과 반환 테스트") - void resultTest() { - // given - BaseballController controller = new BaseballController(); + InputView inputView = new InputView(); String userInput = "123"; InputStream inputStream = new ByteArrayInputStream(userInput.getBytes()); System.setIn(inputStream); // when - controller.playGame(new Computer()); + List inputNumber = inputView.inputNumber(); // then + assertThat(inputNumber).isEqualTo(List.of(1, 2, 3)); } @Test From 787d1e7a5a66e5d0031bba9efccc2b9108139512 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 11:27:55 +0900 Subject: [PATCH 26/30] =?UTF-8?q?refactor(BaseballController)=20:=20strike?= =?UTF-8?q?Count,=20ballCount=20=EC=A7=80=EC=97=AD=EB=B3=80=EC=88=98?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=84=EC=97=AD=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=A1=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 2cd507a..f74b705 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -17,8 +17,16 @@ public class BaseballController { private User user; private Computer computer; + private int strikeCount; + private int ballCount; + + public BaseballController() { + this.strikeCount = 0; + this.ballCount = 0; + } public void run() { + printGameStartMessage(); do { computer = gameStart(); playGame(); @@ -26,7 +34,6 @@ public void run() { } public Computer gameStart() { - printGameStartMessage(); return new Computer(); } @@ -34,8 +41,8 @@ public void playGame() { user = new User(); while (true) { inputUserNumber(); - int strikeCount = getStrikeCount(user, computer); - int ballCount = getBallCount(user, computer); + strikeCount = getStrikeCount(user, computer); + ballCount = getBallCount(user, computer); printGameResultMessage(strikeCount, ballCount); if (strikeCount == 3) { @@ -59,13 +66,13 @@ private void inputUserNumber() { public int getStrikeCount(User user, Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); - int strikeCnt = 0; + strikeCount = 0; for (int i = 0; i < computerRandomNumber.size(); i++) { if (isStrike(computerRandomNumber.get(i), userNumber.get(i))) { - strikeCnt += 1; + strikeCount += 1; } } - return strikeCnt; + return strikeCount; } public boolean isStrike(Integer computerRandomNumberDigit, Integer userNumberDigit) { @@ -78,14 +85,14 @@ public boolean isStrike(Integer computerRandomNumberDigit, Integer userNumberDig public int getBallCount(User user, Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); - int ballCnt = 0; + ballCount = 0; for (int i = 1; i <= 9; i++) { if (isBall(computerRandomNumber, userNumber, i)) { - ballCnt += 1; + ballCount += 1; } } - return ballCnt; + return ballCount; } public boolean isBall(List computerRandomNumber, List userNumber, int idx) { @@ -109,7 +116,7 @@ public boolean isTerminate(String restartStatus) { validateNotStringRestartStatus(restartStatus); validateNotDoubleRestartStatus(restartStatus); - if(restartStatus.equals(NOT_RESTART_STATUS) ){ + if(restartStatus.equals(NOT_RESTART_STATUS)){ return false; } else { return true; @@ -123,7 +130,7 @@ public void validateRangeRestartStatus(final String restartStatus) { } public void validateNotStringRestartStatus(final String restartStatus) { - if ( !(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+")) ) { + if (!(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+"))) { throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION); } } From 4e39001d55111ad471bf80acfb0ffa5c0c04db42 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 12:26:35 +0900 Subject: [PATCH 27/30] =?UTF-8?q?refactor(BaseballController)=20:=20strike?= =?UTF-8?q?,=20ball=20=EC=B9=B4=EC=9A=B4=ED=8A=B8=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20stream=EC=9C=BC=EB=A1=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 59 ++++--------------- src/main/java/baseball/view/InputView.java | 4 ++ 2 files changed, 16 insertions(+), 47 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index f74b705..f5ec185 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -2,8 +2,10 @@ import baseball.model.Computer; import baseball.model.User; +import baseball.view.InputView; import camp.nextstep.edu.missionutils.Console; import java.util.List; +import java.util.stream.Stream; import static baseball.view.InputView.inputNumber; import static baseball.view.OutputView.*; @@ -40,7 +42,7 @@ public Computer gameStart() { public void playGame() { user = new User(); while (true) { - inputUserNumber(); + user.setNumber(inputNumber()); strikeCount = getStrikeCount(user, computer); ballCount = getBallCount(user, computer); @@ -52,69 +54,36 @@ public void playGame() { } public boolean gameOver() { - if (isTerminate(terminateSignUserInput())) { + if (isTerminate(InputView.terminateSignUserInput())) { return true; } else { return false; } } - private void inputUserNumber() { - user.setNumber(inputNumber()); - } - public int getStrikeCount(User user, Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); - strikeCount = 0; - for (int i = 0; i < computerRandomNumber.size(); i++) { - if (isStrike(computerRandomNumber.get(i), userNumber.get(i))) { - strikeCount += 1; - } - } - return strikeCount; - } - public boolean isStrike(Integer computerRandomNumberDigit, Integer userNumberDigit) { - if (computerRandomNumberDigit == userNumberDigit) { - return true; - } - return false; + return Stream.iterate(0, n -> n + 1).limit(computerRandomNumber.size()) + .filter(i -> computerRandomNumber.get(i) == userNumber.get(i)) + .reduce(0, (cnt, b) -> cnt + 1); } public int getBallCount(User user, Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); - ballCount = 0; - for (int i = 1; i <= 9; i++) { - if (isBall(computerRandomNumber, userNumber, i)) { - ballCount += 1; - } - } - return ballCount; - } - - public boolean isBall(List computerRandomNumber, List userNumber, int idx) { - if (hasBothNumberContain(computerRandomNumber, userNumber, idx)) { - if (computerRandomNumber.indexOf(idx) != userNumber.indexOf(idx)) { - return true; - } - } - return false; - } - - public boolean hasBothNumberContain(List computerRandomNumber, List userNumber, int idx) { - if (computerRandomNumber.contains(idx) && userNumber.contains(idx)) { - return true; - } - return false; + return Stream.iterate(1, n -> n + 1).limit(9) + .filter(i -> computerRandomNumber.contains(i) && userNumber.contains(i)) + .filter(i -> computerRandomNumber.indexOf(i) != userNumber.indexOf(i)) + .reduce(0, (cnt, b) -> cnt + 1); } public boolean isTerminate(String restartStatus) { - validateRangeRestartStatus(restartStatus); validateNotStringRestartStatus(restartStatus); validateNotDoubleRestartStatus(restartStatus); + validateRangeRestartStatus(restartStatus); if(restartStatus.equals(NOT_RESTART_STATUS)){ return false; @@ -140,8 +109,4 @@ public void validateNotDoubleRestartStatus(final String restartStatus) { throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION); } } - - private String terminateSignUserInput() { - return Console.readLine(); - } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index c599c82..0d9a2e8 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -26,6 +26,10 @@ public static List inputNumber() { return number; } + public static String terminateSignUserInput() { + return Console.readLine(); + } + public static void validateNotStringRestartStatus(final String restartStatus) { if ( !(restartStatus != null && restartStatus.matches(STRING_REGEX)) ) { throw new IllegalArgumentException(RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION); From fbf08077e1d66b6cde7c6779f2db2c89cd0ab59c Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 12:31:06 +0900 Subject: [PATCH 28/30] =?UTF-8?q?fix(OutputView)=20:=20strike,=20ball?= =?UTF-8?q?=EC=9D=98=20=EA=B0=AF=EC=88=98=EA=B0=80=200=EC=9D=BC=20?= =?UTF-8?q?=EB=95=8C=200=EB=8F=84=20=EC=B6=9C=EB=A0=A5=EB=90=98=EB=8A=94?= =?UTF-8?q?=20=EB=B2=84=EA=B7=B8=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/baseball/view/OutputView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 67f7bdb..f36b9c9 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -20,6 +20,10 @@ public static void printGameResultMessage(final int strikeCount, final int ballC System.out.println(GAME_RESTART_OR_END_MESSAGE); } else if (strikeCount == 0 && ballCount == 0) { System.out.println(NOTHING_MESSAGE); + } else if (strikeCount != 0 && ballCount == 0) { + System.out.println(strikeCount + STRIKE_MESSAGE); + } else if (strikeCount == 0 && ballCount != 0) { + System.out.println(ballCount + BALL_MESSAGE); } else { System.out.println(ballCount + BALL_MESSAGE + strikeCount + STRIKE_MESSAGE); } From f4391a20511e649364b8638f4643beabb29a5089 Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 12:53:03 +0900 Subject: [PATCH 29/30] =?UTF-8?q?refactor=20:=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=A7=80=EC=A0=95=EC=9E=90=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 26 +++++++++---------- src/main/java/baseball/model/Computer.java | 12 ++++----- src/main/java/baseball/model/User.java | 19 +++----------- src/main/java/baseball/view/InputView.java | 10 +++---- src/main/java/baseball/view/OutputView.java | 12 ++++----- 5 files changed, 33 insertions(+), 46 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index f5ec185..91955fb 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -12,10 +12,10 @@ public class BaseballController { - public static final String NOT_RESTART_STATUS = "2"; - public static final String RESTART_OR_END_ONE_OR_TWO_EXCEPTION = "재시작은 1, 완전 종료는 2 입니다."; - public static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; - public static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."; + private static final String NOT_RESTART_STATUS = "2"; + private static final String RESTART_OR_END_ONE_OR_TWO_EXCEPTION = "재시작은 1, 완전 종료는 2 입니다."; + private static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; + private static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."; private User user; private Computer computer; @@ -35,11 +35,11 @@ public void run() { } while (gameOver()); } - public Computer gameStart() { + private static Computer gameStart() { return new Computer(); } - public void playGame() { + private void playGame() { user = new User(); while (true) { user.setNumber(inputNumber()); @@ -53,7 +53,7 @@ public void playGame() { } } - public boolean gameOver() { + private static boolean gameOver() { if (isTerminate(InputView.terminateSignUserInput())) { return true; } else { @@ -61,7 +61,7 @@ public boolean gameOver() { } } - public int getStrikeCount(User user, Computer computer) { + private int getStrikeCount(final User user, final Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); @@ -70,7 +70,7 @@ public int getStrikeCount(User user, Computer computer) { .reduce(0, (cnt, b) -> cnt + 1); } - public int getBallCount(User user, Computer computer) { + private int getBallCount(final User user, final Computer computer) { List computerRandomNumber = computer.getRandomNumber(); List userNumber = user.getNumber(); @@ -80,7 +80,7 @@ public int getBallCount(User user, Computer computer) { .reduce(0, (cnt, b) -> cnt + 1); } - public boolean isTerminate(String restartStatus) { + private static boolean isTerminate(final String restartStatus) { validateNotStringRestartStatus(restartStatus); validateNotDoubleRestartStatus(restartStatus); validateRangeRestartStatus(restartStatus); @@ -92,19 +92,19 @@ public boolean isTerminate(String restartStatus) { } } - public void validateRangeRestartStatus(final String restartStatus) { + private static void validateRangeRestartStatus(final String restartStatus) { if (Integer.parseInt(restartStatus) < 1 || Integer.parseInt(restartStatus) > 2) { throw new IllegalArgumentException(RESTART_OR_END_ONE_OR_TWO_EXCEPTION); } } - public void validateNotStringRestartStatus(final String restartStatus) { + private static void validateNotStringRestartStatus(final String restartStatus) { if (!(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+"))) { throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION); } } - public void validateNotDoubleRestartStatus(final String restartStatus) { + private static void validateNotDoubleRestartStatus(final String restartStatus) { if (!restartStatus.chars().allMatch(Character::isDigit)) { throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION); } diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index c862470..d925b09 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -6,7 +6,7 @@ import java.util.List; public class Computer { - public List randomNumber; + private List randomNumber; public Computer() { saveRandomNumberWithGameStart(); @@ -16,7 +16,7 @@ public List getRandomNumber() { return randomNumber; } - public void saveRandomNumberWithGameStart() { + private void saveRandomNumberWithGameStart() { randomNumber = new ArrayList<>(); Integer digit; @@ -28,25 +28,25 @@ public void saveRandomNumberWithGameStart() { } } - public boolean checkLengthSmallThanThree() { + private boolean checkLengthSmallThanThree() { if (randomNumber.size() < 3) { return true; } return false; } - public Integer getRandomDigit() { + private static Integer getRandomDigit() { return Randoms.pickNumberInRange(1, 9); } - public boolean hasDuplicateDigitInRandomNumber(Integer digit) { + private boolean hasDuplicateDigitInRandomNumber(final Integer digit) { if (randomNumber.contains(digit)) { return true; } return false; } - public void setRandomNumber(List randomNumber) { + public void setRandomNumber(final List randomNumber) { this.randomNumber = randomNumber; } } diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index 4fef780..6a5c01a 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -5,20 +5,19 @@ public class User { - public static final String INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION = "입력 숫자는 3자리입니다."; - public static final String INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION = "입력 숫자는 3자리입니다."; + private static final String INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION = "입력 숫자는 3자리입니다."; + private static final String INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION = "입력 숫자는 3자리입니다."; public enum RestartStatus { RESTART, TERMINATE } private List number; - public RestartStatus restartStatus; public void setNumber(List number) { validateNumber(number); this.number = number; } - public void validateNumber(final List number) { + private void validateNumber(final List number) { if (number.size() > 3 || number.size() < 3) { throw new IllegalArgumentException(INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION); } @@ -28,19 +27,7 @@ public void validateNumber(final List number) { } } - public void restart() { - this.restartStatus = RestartStatus.RESTART; - } - - public void terminate() { - this.restartStatus = RestartStatus.TERMINATE; - } - public List getNumber() { return number; } - - public RestartStatus getRestartStatus() { - return restartStatus; - } } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 0d9a2e8..3b7c658 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -7,9 +7,9 @@ public class InputView { - public static final String INPUT_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; - public static final String STRING_REGEX = "[-+]?\\d*\\.?\\d+"; - public static final String RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; + private static final String INPUT_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; + private static final String STRING_REGEX = "[-+]?\\d*\\.?\\d+"; + private static final String RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; public static List inputNumber() { System.out.print(INPUT_NUMBER_MESSAGE); @@ -30,8 +30,8 @@ public static String terminateSignUserInput() { return Console.readLine(); } - public static void validateNotStringRestartStatus(final String restartStatus) { - if ( !(restartStatus != null && restartStatus.matches(STRING_REGEX)) ) { + private static void validateNotStringRestartStatus(final String restartStatus) { + if (!(restartStatus != null && restartStatus.matches(STRING_REGEX))) { throw new IllegalArgumentException(RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION); } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index f36b9c9..8d97779 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -2,12 +2,12 @@ public class OutputView { - public static final String GAME_START_MESSAGE = "숫자 야구 게임을 시작합니다."; - public static final String STRIKE_MESSAGE = "스트라이크"; - public static final String GAME_OVER_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임종료"; - public static final String GAME_RESTART_OR_END_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"; - public static final String NOTHING_MESSAGE = "낫싱"; - public static final String BALL_MESSAGE = "볼 "; + private static final String GAME_START_MESSAGE = "숫자 야구 게임을 시작합니다."; + private static final String STRIKE_MESSAGE = "스트라이크"; + private static final String GAME_OVER_MESSAGE = "3개의 숫자를 모두 맞히셨습니다! 게임종료"; + private static final String GAME_RESTART_OR_END_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"; + private static final String NOTHING_MESSAGE = "낫싱"; + private static final String BALL_MESSAGE = "볼 "; public static void printGameStartMessage() { System.out.println(GAME_START_MESSAGE); From 0fe1f3183dfc38bd75a34b5273432d87e6964bec Mon Sep 17 00:00:00 2001 From: SangBeom-Hahn Date: Mon, 3 Jul 2023 18:54:12 +0900 Subject: [PATCH 30/30] =?UTF-8?q?refactor=20:=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BaseballController.java | 49 ++++------------- src/main/java/baseball/model/Computer.java | 9 ++- src/main/java/baseball/model/User.java | 29 +++++++--- src/main/java/baseball/view/InputView.java | 55 ++++++++++++++----- src/main/java/baseball/view/OutputView.java | 10 ++-- 5 files changed, 87 insertions(+), 65 deletions(-) diff --git a/src/main/java/baseball/controller/BaseballController.java b/src/main/java/baseball/controller/BaseballController.java index 91955fb..ab56d7b 100644 --- a/src/main/java/baseball/controller/BaseballController.java +++ b/src/main/java/baseball/controller/BaseballController.java @@ -11,11 +11,9 @@ import static baseball.view.OutputView.*; public class BaseballController { - - private static final String NOT_RESTART_STATUS = "2"; - private static final String RESTART_OR_END_ONE_OR_TWO_EXCEPTION = "재시작은 1, 완전 종료는 2 입니다."; - private static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; - private static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."; + private static final String RESTART_STATUS = "1"; + private static final int THREE_STRIKE = 3; + private static final boolean NOT_THREE_STRIKE = true; private User user; private Computer computer; @@ -35,30 +33,27 @@ public void run() { } while (gameOver()); } - private static Computer gameStart() { + private Computer gameStart() { return new Computer(); } private void playGame() { user = new User(); - while (true) { + + while (NOT_THREE_STRIKE) { user.setNumber(inputNumber()); strikeCount = getStrikeCount(user, computer); ballCount = getBallCount(user, computer); printGameResultMessage(strikeCount, ballCount); - if (strikeCount == 3) { + if (strikeCount == THREE_STRIKE) { break; } } } - private static boolean gameOver() { - if (isTerminate(InputView.terminateSignUserInput())) { - return true; - } else { - return false; - } + private boolean gameOver() { + return !isTerminate(InputView.terminateSignUserInput()); } private int getStrikeCount(final User user, final Computer computer) { @@ -80,33 +75,11 @@ private int getBallCount(final User user, final Computer computer) { .reduce(0, (cnt, b) -> cnt + 1); } - private static boolean isTerminate(final String restartStatus) { - validateNotStringRestartStatus(restartStatus); - validateNotDoubleRestartStatus(restartStatus); - validateRangeRestartStatus(restartStatus); - - if(restartStatus.equals(NOT_RESTART_STATUS)){ + private boolean isTerminate(final String restartStatus) { + if(restartStatus.equals(RESTART_STATUS)){ return false; } else { return true; } } - - private static void validateRangeRestartStatus(final String restartStatus) { - if (Integer.parseInt(restartStatus) < 1 || Integer.parseInt(restartStatus) > 2) { - throw new IllegalArgumentException(RESTART_OR_END_ONE_OR_TWO_EXCEPTION); - } - } - - private static void validateNotStringRestartStatus(final String restartStatus) { - if (!(restartStatus != null && restartStatus.matches("[-+]?\\d*\\.?\\d+"))) { - throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION); - } - } - - private static void validateNotDoubleRestartStatus(final String restartStatus) { - if (!restartStatus.chars().allMatch(Character::isDigit)) { - throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION); - } - } } diff --git a/src/main/java/baseball/model/Computer.java b/src/main/java/baseball/model/Computer.java index d925b09..5987645 100644 --- a/src/main/java/baseball/model/Computer.java +++ b/src/main/java/baseball/model/Computer.java @@ -6,6 +6,9 @@ import java.util.List; public class Computer { + public static final int NUMBER_LENGTH = 3; + public static final int MIN_RANGE = 1; + public static final int MAX_RANGE = 9; private List randomNumber; public Computer() { @@ -29,14 +32,14 @@ private void saveRandomNumberWithGameStart() { } private boolean checkLengthSmallThanThree() { - if (randomNumber.size() < 3) { + if (randomNumber.size() < NUMBER_LENGTH) { return true; } return false; } - private static Integer getRandomDigit() { - return Randoms.pickNumberInRange(1, 9); + private Integer getRandomDigit() { + return Randoms.pickNumberInRange(MIN_RANGE, MAX_RANGE); } private boolean hasDuplicateDigitInRandomNumber(final Integer digit) { diff --git a/src/main/java/baseball/model/User.java b/src/main/java/baseball/model/User.java index 6a5c01a..ba156d4 100644 --- a/src/main/java/baseball/model/User.java +++ b/src/main/java/baseball/model/User.java @@ -2,31 +2,46 @@ import java.util.List; +import java.util.Set; public class User { - private static final String INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION = "입력 숫자는 3자리입니다."; - private static final String INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION = "입력 숫자는 3자리입니다."; + private static final String INPUT_NUMBER_LENGTH_NOT_THREE_EXCEPTION = "입력 숫자는 3자리입니다."; + private static final String INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION = "입력 숫자는 1 ~ 9입니다."; + public static final int NUMBER_SIZE = 3; + public static final int MIN_DIGIT = 1; + public static final int MAX_DIGIT = 9; + public static final String INPUT_NUMBER_DUPLICATE_EXCEPTION = "입력숫자의 각 자리는 중복될 수 없습니다."; public enum RestartStatus { RESTART, TERMINATE } private List number; public void setNumber(List number) { - validateNumber(number); + validateNumberSize(number); + validateNumberRange(number); + validateDuplicateDigit(number); this.number = number; } - private void validateNumber(final List number) { - if (number.size() > 3 || number.size() < 3) { - throw new IllegalArgumentException(INPUT_NUMBER_LENGTH_NOT_TRHEE_EXCEPTION); + private void validateNumberSize(final List number) { + if (number.size() > NUMBER_SIZE || number.size() < NUMBER_SIZE) { + throw new IllegalArgumentException(INPUT_NUMBER_LENGTH_NOT_THREE_EXCEPTION); } + } - if (!number.stream().allMatch(digit -> digit >= 1 && digit <= 9)) { + private void validateNumberRange(final List number) { + if (!number.stream().allMatch(digit -> digit >= MIN_DIGIT && digit <= MAX_DIGIT)) { throw new IllegalArgumentException(INPUT_DIGIT_LENGTH_NOT_ONE_EXCEPTION); } } + private void validateDuplicateDigit(final List number) { + if (Set.copyOf(number).size() != number.size()) { + throw new IllegalArgumentException(INPUT_NUMBER_DUPLICATE_EXCEPTION); + } + } + public List getNumber() { return number; } diff --git a/src/main/java/baseball/view/InputView.java b/src/main/java/baseball/view/InputView.java index 3b7c658..d52ef93 100644 --- a/src/main/java/baseball/view/InputView.java +++ b/src/main/java/baseball/view/InputView.java @@ -3,36 +3,65 @@ import camp.nextstep.edu.missionutils.Console; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class InputView { private static final String INPUT_NUMBER_MESSAGE = "숫자를 입력해주세요 : "; - private static final String STRING_REGEX = "[-+]?\\d*\\.?\\d+"; - private static final String RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; + private static final String CHARACTER_REGEX = "[-+]?\\d*\\.?\\d+"; + private static final String RESTART_STATUS = "1"; + private static final String NOT_RESTART_STATUS = "2"; + private static final String RESTART_OR_END_ONE_OR_TWO_EXCEPTION = "재시작은 1, 완전 종료는 2 입니다."; + private static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수입니다."; + private static final String RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION = "재시작은 1, 완전 종료는 2인 정수로 소수를 입력할 수 없습니다."; + public static final String INPUT_NUMBER_SPECIAL_CHARACTER_EXCEPTION = "특수 문자는 입력할 수 없습니다."; public static List inputNumber() { System.out.print(INPUT_NUMBER_MESSAGE); String inputNumber = Console.readLine(); - List number = new ArrayList<>(); + validateNotSpecialCharacterInUserNumber(inputNumber); - for (int i = 0; i < inputNumber.length(); i++) { - char digitNumber = inputNumber.charAt(i); - String digitStringNumber = String.valueOf(digitNumber); + return Arrays.stream(inputNumber.split("")) + .map(Integer::parseInt) + .collect(Collectors.toList()); + } + + public static String terminateSignUserInput() { + String inputRestartStatus = Console.readLine(); + validateRestartStatus(inputRestartStatus); + return inputRestartStatus; + } - validateNotStringRestartStatus(digitStringNumber); - number.add(Integer.valueOf(digitStringNumber)); + private static void validateNotSpecialCharacterInUserNumber(String inputNumber) { + if (!Arrays.stream(inputNumber.split("")).allMatch(digit -> digit.matches(CHARACTER_REGEX))) { + throw new IllegalArgumentException(INPUT_NUMBER_SPECIAL_CHARACTER_EXCEPTION); } - return number; } - public static String terminateSignUserInput() { - return Console.readLine(); + private static void validateRestartStatus(final String restartStatus) { + validateNotStringRestartStatus(restartStatus); + validateNotDoubleRestartStatus(restartStatus); + validateRangeRestartStatus(restartStatus); + } + + private static void validateRangeRestartStatus(final String restartStatus) { + if (!restartStatus.equals(RESTART_STATUS) && !restartStatus.equals(NOT_RESTART_STATUS)) { + throw new IllegalArgumentException(RESTART_OR_END_ONE_OR_TWO_EXCEPTION); + } } private static void validateNotStringRestartStatus(final String restartStatus) { - if (!(restartStatus != null && restartStatus.matches(STRING_REGEX))) { - throw new IllegalArgumentException(RESTART_OR_END_NUMBER_NOT_NUMBER_EXCEPTION); + if (!(restartStatus != null && restartStatus.matches(CHARACTER_REGEX))) { + throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_STRING_EXCEPTION); + } + } + + private static void validateNotDoubleRestartStatus(final String restartStatus) { + if (!restartStatus.chars().allMatch(Character::isDigit)) { + throw new IllegalArgumentException(RESTART_OR_END_NOT_NUMBER_BECAUSE_DOUBLE_EXCEPTION); } } } diff --git a/src/main/java/baseball/view/OutputView.java b/src/main/java/baseball/view/OutputView.java index 8d97779..7a494e9 100644 --- a/src/main/java/baseball/view/OutputView.java +++ b/src/main/java/baseball/view/OutputView.java @@ -8,21 +8,23 @@ public class OutputView { private static final String GAME_RESTART_OR_END_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"; private static final String NOTHING_MESSAGE = "낫싱"; private static final String BALL_MESSAGE = "볼 "; + public static final int THREE_STRIKE = 3; + public static final int ZERO = 0; public static void printGameStartMessage() { System.out.println(GAME_START_MESSAGE); } public static void printGameResultMessage(final int strikeCount, final int ballCount) { - if (strikeCount == 3) { + if (strikeCount == THREE_STRIKE) { System.out.println(strikeCount + STRIKE_MESSAGE); System.out.println(GAME_OVER_MESSAGE); System.out.println(GAME_RESTART_OR_END_MESSAGE); - } else if (strikeCount == 0 && ballCount == 0) { + } else if (strikeCount == ZERO && ballCount == ZERO) { System.out.println(NOTHING_MESSAGE); - } else if (strikeCount != 0 && ballCount == 0) { + } else if (strikeCount != ZERO && ballCount == ZERO) { System.out.println(strikeCount + STRIKE_MESSAGE); - } else if (strikeCount == 0 && ballCount != 0) { + } else if (strikeCount == ZERO && ballCount != ZERO) { System.out.println(ballCount + BALL_MESSAGE); } else { System.out.println(ballCount + BALL_MESSAGE + strikeCount + STRIKE_MESSAGE);