From 6ebb01375dfd7ee22ba7b066520e0c89c4ebfac8 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 29 Apr 2024 16:37:13 +0900 Subject: [PATCH 01/35] docs: create README.md($Project): --- README.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d7e8aee..f9892320 100644 --- a/README.md +++ b/README.md @@ -1 +1,64 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +## 과제 요구 사항 + +* 미션은 숫자 야구 저장소를 포크하고 클론하는 것으로 시작한다. +* 기능을 구현하기 전 README.md 에 구현할 기능 목록을 정리해 추가한다. +* Git의 커밋 단위는 앞 단계에서 README.md 에 정리한 기능 목록 단위로 추가한다. +* AngularJS Git Commit Message Conventions을 참고해 커밋 메시지를 작성한다. + +## 기능 요구 사항 + +* 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다# + * 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. + ```Shell + * e.g. + * 상대방(컴퓨터)의 수가 425일 때, + * - 123을 제시한 경우: 1스트라이크 + - - 456을 제시한 경우: 1볼 1스트라이크 + - - 789를 제시한 경우: 낫싱 + * ``` + 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 + 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. + 이 같은 과정을 반복해 컴퓨터가 선택한 3개의 숫자를 모두 맞히면 게임이 종료된다. + 게임을 종료한 후 게임을 다시 시작하거나 완전히 종료할 수 있다. + 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException 을 발생시킨 후 애플리케이션은 종료되어야 한다. + +## 실행 결과 + +숫자를 입력해 주세요 : 123 +1볼 1스트라이크 +숫자를 입력해 주세요 : 145 +1볼 +숫자를 입력해 주세요 : 671 +2볼 +숫자를 입력해 주세요 : 216 +1스트라이크 +숫자를 입력해 주세요 : 713 +3스트라이크 +3개의 숫자를 모두 맞히셨습니다! 게임 종료 +게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요. +1 +숫자를 입력해 주세요 : 123 +1볼 +… + +## 프로그래밍 요구 사항 1 + +JDK 17 버전에서 실행 가능해야 한다. +프로그램 실행의 시작점은 Application 의 main() 이다. +build.gradle 파일은 변경할 수 없으며, 제공된 라이브러리 이외의 외부 라이브러리는 사용하지 않는다. +프로그램 종료 시 System.exit() 를 호출하지 않는다. +프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 등의 이름을 바꾸거나 이동하지 않는다. + +## 프로그래밍 요구 사항 2 + +자바 코드 컨벤션을 지키면서 프로그래밍한다. +기본적으로 Google Java Style Guide을 원칙으로 한다. +단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. +indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. +예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. +힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. +3항 연산자를 쓰지 않는다. +함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라. +JUnit 5와 AssertJ를 이용하여 정리한 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인한다. \ No newline at end of file From 27a3cf942e9e60ca7200baa08878ad72600b8169 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 29 Apr 2024 16:43:11 +0900 Subject: [PATCH 02/35] feat(Application): add function that make computer's number randomly --- src/main/java/Application.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..a828a793 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,17 @@ +import java.util.ArrayList; + +public class Application { + public static void main(String[] args) { + + NumberGenerating numberGenerating = new NumberGenerating(); + + // TODO: 숫자 랜덤하게 생성 + ArrayList computerNumber = numberGenerating.generateRandomNumber(); + + // TODO: 사용자가 숫자 입력 + + // TODO: 입력받은 숫자로 야구 결과 알기 + + + } +} From 2b1b6b02dd8d3b8e24a832a2c2b7a5bfc09d513a Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 29 Apr 2024 16:47:06 +0900 Subject: [PATCH 03/35] fix(NumberGenerating): create randomly number generating function --- src/main/java/NumberGenerating.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/NumberGenerating.java diff --git a/src/main/java/NumberGenerating.java b/src/main/java/NumberGenerating.java new file mode 100644 index 00000000..49fb418a --- /dev/null +++ b/src/main/java/NumberGenerating.java @@ -0,0 +1,14 @@ +import java.util.ArrayList; +import java.util.Random; +import java.util.Scanner; + +public class NumberGenerating { + public ArrayList generateRandomNumber() { + ArrayList numbers = new ArrayList<>(); + Random random = new Random(); + for (int i = 0; i < 3; i++) { + numbers.add(random.nextInt(1, 10)); + } + return numbers; + } +} From d4d96dba04c0c7dfa490ba01f09befa0141b55cf Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 29 Apr 2024 19:07:03 +0900 Subject: [PATCH 04/35] feat(NumberGenerating): create user input function --- src/main/java/NumberGenerating.java | 12 ++++++++++++ src/test/java/NumberGeneratingTest.java | 20 ++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/test/java/NumberGeneratingTest.java diff --git a/src/main/java/NumberGenerating.java b/src/main/java/NumberGenerating.java index 49fb418a..97ebd49c 100644 --- a/src/main/java/NumberGenerating.java +++ b/src/main/java/NumberGenerating.java @@ -3,6 +3,7 @@ import java.util.Scanner; public class NumberGenerating { + public ArrayList generateRandomNumber() { ArrayList numbers = new ArrayList<>(); Random random = new Random(); @@ -11,4 +12,15 @@ public ArrayList generateRandomNumber() { } return numbers; } + + public ArrayList inputUserNumber() { + Scanner scanner = new Scanner(System.in); + + ArrayList userNumber = new ArrayList<>(); + for (int i = 0; i < 3; i++) { + userNumber.add(scanner.nextInt()); + } + scanner.close(); + return userNumber; + } } diff --git a/src/test/java/NumberGeneratingTest.java b/src/test/java/NumberGeneratingTest.java new file mode 100644 index 00000000..b9050d93 --- /dev/null +++ b/src/test/java/NumberGeneratingTest.java @@ -0,0 +1,20 @@ +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.*; + +class NumberGeneratingTest { + + @Test + void generateRandomNumber() { + NumberGenerating numberGenerating = new NumberGenerating(); + ArrayList result = numberGenerating.generateRandomNumber(); + Assertions.assertThat(result.size()) + .isEqualTo(3); + for (Integer i : result) { + System.out.println("i = " + i); + } + } +} \ No newline at end of file From d3b7080c83bdabcf7e2e151c1743f1f84d31dc21 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 29 Apr 2024 22:47:39 +0900 Subject: [PATCH 05/35] feat(BaseballStatus): create Status --- src/main/java/BaseballStatus.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/BaseballStatus.java diff --git a/src/main/java/BaseballStatus.java b/src/main/java/BaseballStatus.java new file mode 100644 index 00000000..6a3038ae --- /dev/null +++ b/src/main/java/BaseballStatus.java @@ -0,0 +1,4 @@ +public enum BaseballStatus { + Nothing, Ball, Strike + +} From e6058174189d51d7e2bdbc64d978c41ae84685c1 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Tue, 30 Apr 2024 23:22:27 +0900 Subject: [PATCH 06/35] fix(NumberGenerating): fix the number is generated not duplicately --- src/main/java/NumberGenerating.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/NumberGenerating.java b/src/main/java/NumberGenerating.java index 97ebd49c..c2ffecfd 100644 --- a/src/main/java/NumberGenerating.java +++ b/src/main/java/NumberGenerating.java @@ -1,26 +1,21 @@ -import java.util.ArrayList; -import java.util.Random; -import java.util.Scanner; +import java.util.*; public class NumberGenerating { - public ArrayList generateRandomNumber() { - ArrayList numbers = new ArrayList<>(); + public Set generateRandomNumber() { + Set numbers = new LinkedHashSet<>(); Random random = new Random(); - for (int i = 0; i < 3; i++) { + while (numbers.size() < 3){ numbers.add(random.nextInt(1, 10)); } return numbers; } - public ArrayList inputUserNumber() { - Scanner scanner = new Scanner(System.in); - + public ArrayList inputUserNumber(Scanner scanner) { ArrayList userNumber = new ArrayList<>(); for (int i = 0; i < 3; i++) { userNumber.add(scanner.nextInt()); } - scanner.close(); return userNumber; } } From b8776414a5d3c82b3ffe290cd8f20e5aeb9ab1c7 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:18:09 +0900 Subject: [PATCH 07/35] feat(Entity): Add user class --- src/main/java/Entity/User.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/Entity/User.java diff --git a/src/main/java/Entity/User.java b/src/main/java/Entity/User.java new file mode 100644 index 00000000..eb242c15 --- /dev/null +++ b/src/main/java/Entity/User.java @@ -0,0 +1,23 @@ +package Entity; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class User extends Player { + private List numberList; + + public User() { + numberList = new ArrayList<>(); + playerStatus = PlayerStatus.PERSON; + } + + public User setNumberList(List numberList) { + this.numberList = numberList; + return this; + } + + public List getNumberList() { + return numberList; + } +} From 8a5ad5b8e20e2a94a70785ca69cc6210e80e54b8 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:19:07 +0900 Subject: [PATCH 08/35] feat(Entity): Add player abstract class --- src/main/java/Entity/Player.java | 9 +++++++++ src/test/java/NumberGeneratingTest.java | 12 ++---------- 2 files changed, 11 insertions(+), 10 deletions(-) create mode 100644 src/main/java/Entity/Player.java diff --git a/src/main/java/Entity/Player.java b/src/main/java/Entity/Player.java new file mode 100644 index 00000000..9f90b81f --- /dev/null +++ b/src/main/java/Entity/Player.java @@ -0,0 +1,9 @@ +package Entity; + +import java.util.ArrayList; + +public abstract class Player { + final int INPUT_SIZE = 3; + PlayerStatus playerStatus; + ArrayList baseballStatuses = new ArrayList(); +} diff --git a/src/test/java/NumberGeneratingTest.java b/src/test/java/NumberGeneratingTest.java index b9050d93..9f3e11c8 100644 --- a/src/test/java/NumberGeneratingTest.java +++ b/src/test/java/NumberGeneratingTest.java @@ -1,20 +1,12 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import java.util.ArrayList; - -import static org.junit.jupiter.api.Assertions.*; +import java.util.Set; class NumberGeneratingTest { @Test void generateRandomNumber() { - NumberGenerating numberGenerating = new NumberGenerating(); - ArrayList result = numberGenerating.generateRandomNumber(); - Assertions.assertThat(result.size()) - .isEqualTo(3); - for (Integer i : result) { - System.out.println("i = " + i); - } + } } \ No newline at end of file From 4faa84eaad433f528abaa2877cd72b0c6cd08ba5 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:19:30 +0900 Subject: [PATCH 09/35] fix(NumberGenerating): fix the number is generated not duplicately --- src/main/java/Entity/BaseballStatus.java | 5 +++++ src/main/java/Entity/PlayerStatus.java | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 src/main/java/Entity/BaseballStatus.java create mode 100644 src/main/java/Entity/PlayerStatus.java diff --git a/src/main/java/Entity/BaseballStatus.java b/src/main/java/Entity/BaseballStatus.java new file mode 100644 index 00000000..016a8f1c --- /dev/null +++ b/src/main/java/Entity/BaseballStatus.java @@ -0,0 +1,5 @@ +package Entity; + +public enum BaseballStatus { + Ball, Strike +} diff --git a/src/main/java/Entity/PlayerStatus.java b/src/main/java/Entity/PlayerStatus.java new file mode 100644 index 00000000..7560d5c3 --- /dev/null +++ b/src/main/java/Entity/PlayerStatus.java @@ -0,0 +1,5 @@ +package Entity; + +public enum PlayerStatus { + PERSON, COMPUTER +} From 546acb297638e48c501a867dfc92c193e00484b4 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:19:52 +0900 Subject: [PATCH 10/35] feat(Entity): Add computer class --- src/main/java/Entity/Computer.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/Entity/Computer.java diff --git a/src/main/java/Entity/Computer.java b/src/main/java/Entity/Computer.java new file mode 100644 index 00000000..a6a0c165 --- /dev/null +++ b/src/main/java/Entity/Computer.java @@ -0,0 +1,21 @@ +package Entity; + +import java.util.*; + +public class Computer extends Player { + private Set numberSet; + + public Computer() { + numberSet = new LinkedHashSet<>(); + playerStatus = PlayerStatus.COMPUTER; + } + + public Computer setNumberSet(Set numberSet) { + this.numberSet = numberSet; + return this; + } + + public Set getNumberSet() { + return numberSet; + } +} From 5e7a4ffc6d0ccbd82b6a0f1c1fef80fba171dd64 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:20:42 +0900 Subject: [PATCH 11/35] feat(main): Add number baseballgame class --- src/main/java/NumberBaseballGame.java | 140 ++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 src/main/java/NumberBaseballGame.java diff --git a/src/main/java/NumberBaseballGame.java b/src/main/java/NumberBaseballGame.java new file mode 100644 index 00000000..26b6bf74 --- /dev/null +++ b/src/main/java/NumberBaseballGame.java @@ -0,0 +1,140 @@ +import Entity.BaseballStatus; +import Entity.Computer; +import Entity.User; + +import java.util.*; + +public class NumberBaseballGame { + // Property: Player.Player + private User user; + private Computer computer; + private Scanner scanner; + private static final String ALL_STRIKE_MESSAGE = "3스트라이크"; + private static final int MAX_SCORE = 3; + private static final String NO_SCORE = "낫싱"; + + + public NumberBaseballGame(User user, Computer computer) { + this.user = user; + this.computer = computer; + this.scanner = new Scanner(System.in); + } + + public NumberBaseballGame(Computer computer, User user) { + this.user = user; + this.computer = computer; + this.scanner = new Scanner(System.in); + } + + public void setUserNumbers() { + user.setNumberList(generateUserNumByInput()); + } + + public void setComputerNumbers() { + computer.setNumberSet(generateRandomNumber()); + } + + private ArrayList generateUserNumByInput() { + ArrayList userNumber = new ArrayList<>(); + // Scanner scanner = new Scanner(System.in); + System.out.print("숫자를 입력하세요: "); + for (int i = 0; i < 3; i++) { + if (scanner.hasNextInt()) { + userNumber.add(scanner.nextInt()); + } else { + scanner.next(); + i = 0; + } + } + return userNumber; + } + + private Set generateRandomNumber() { + Set numbers = new LinkedHashSet<>(); + Random random = new Random(); + while (numbers.size() < 3) { + numbers.add(random.nextInt(1, 10)); + } + return numbers; + } + + public String calculateScore() { + ArrayList ballCount = new ArrayList<>(); + + compareScoreStrike(ballCount); + + if (ballCount.size() == MAX_SCORE) { + return ALL_STRIKE_MESSAGE; + } + + compareScoreBall(ballCount); + + return convertScoreListToString(ballCount); + } + + private void compareScoreBall(ArrayList score) { + for (Integer userDatum : user.getNumberList()) { + if (computer.getNumberSet() + .stream() + .anyMatch(userDatum::equals) && score.size() <= MAX_SCORE) { + score.add(BaseballStatus.Ball); + } + } + } + + private void compareScoreStrike(ArrayList score) { + ArrayList computerNumberList = new ArrayList<>(computer.getNumberSet()); + for (int i = 0; i < user.getNumberList() + .size(); i++) { + if (computerNumberList.get(i) + .intValue() == user.getNumberList() + .get(i) + .intValue()) { + score.add(BaseballStatus.Strike); + } + } + } + + private String convertScoreListToString(ArrayList score) { + if (score.isEmpty()) { + return NO_SCORE; + } else { + long ballNumber = getScoreCount(score, BaseballStatus.Ball); + long strikeNumber = getScoreCount(score, BaseballStatus.Strike); + ballNumber -= strikeNumber; + String ballResult = (ballNumber) + "볼"; + String strikeResult = strikeNumber + "스트라이크"; + StringBuilder result = new StringBuilder(); + if (ballNumber > 0) { + result.append(ballResult); + } + if (strikeNumber > 0) { + if (ballNumber > 0) result.append(" "); + result.append(strikeResult); + } + return result.toString(); + } + } + + private long getScoreCount(ArrayList score, BaseballStatus status) { + long socreCount = score.stream() + .filter(x -> x == status) + .count(); + return socreCount; + } + + public void closeScanner() { + if (scanner != null) { + scanner.close(); + + } + } + + public String printStartingGame() { + return "================ 숫자 야구 ================"; + } + + public String printEndingGmae() { + return "================ 게임 종료 ================"; + } +} From 39a97a7c35a1992dd5bd4eb8767d549d6632fd3b Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:21:34 +0900 Subject: [PATCH 12/35] feat(main): Add execution of number baseball game --- src/main/java/Application.java | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index a828a793..085b6134 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,17 +1,24 @@ -import java.util.ArrayList; +import Entity.Computer; +import Entity.User; public class Application { - public static void main(String[] args) { - - NumberGenerating numberGenerating = new NumberGenerating(); - - // TODO: 숫자 랜덤하게 생성 - ArrayList computerNumber = numberGenerating.generateRandomNumber(); - - // TODO: 사용자가 숫자 입력 - - // TODO: 입력받은 숫자로 야구 결과 알기 + private final static String threeStrike = "3스트라이크"; + public static void main(String[] args) { + // NOTE 사용자 또는 컴퓨터의 숫자를 생성하는 NumberGenerating 클래스 + User user = new User(); + Computer computer = new Computer(); + NumberBaseballGame numberBaseballGame = new NumberBaseballGame(user, computer); + System.out.println(numberBaseballGame.printStartingGame()); + numberBaseballGame.setComputerNumbers(); + String result = ""; + do { + numberBaseballGame.setUserNumbers(); + result = numberBaseballGame.calculateScore(); + System.out.println(result); + } while (!result.equals(threeStrike)); + numberBaseballGame.closeScanner(); + System.out.println(numberBaseballGame.printEndingGmae()); } } From 1d72cf57d2d1f9c544d65daa0fdd2a5b8302148f Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Thu, 2 May 2024 14:21:48 +0900 Subject: [PATCH 13/35] fix($Project): Delete these files --- src/main/java/BaseballStatus.java | 4 ---- src/main/java/NumberGenerating.java | 21 --------------------- 2 files changed, 25 deletions(-) delete mode 100644 src/main/java/BaseballStatus.java delete mode 100644 src/main/java/NumberGenerating.java diff --git a/src/main/java/BaseballStatus.java b/src/main/java/BaseballStatus.java deleted file mode 100644 index 6a3038ae..00000000 --- a/src/main/java/BaseballStatus.java +++ /dev/null @@ -1,4 +0,0 @@ -public enum BaseballStatus { - Nothing, Ball, Strike - -} diff --git a/src/main/java/NumberGenerating.java b/src/main/java/NumberGenerating.java deleted file mode 100644 index c2ffecfd..00000000 --- a/src/main/java/NumberGenerating.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.*; - -public class NumberGenerating { - - public Set generateRandomNumber() { - Set numbers = new LinkedHashSet<>(); - Random random = new Random(); - while (numbers.size() < 3){ - numbers.add(random.nextInt(1, 10)); - } - return numbers; - } - - public ArrayList inputUserNumber(Scanner scanner) { - ArrayList userNumber = new ArrayList<>(); - for (int i = 0; i < 3; i++) { - userNumber.add(scanner.nextInt()); - } - return userNumber; - } -} From 739985fc2600da0061ebd1dc6c76c0c225a4ff9a Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:35:43 +0900 Subject: [PATCH 14/35] test: Add testSetUserNum --- .../java/controller/GameControllerTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/test/java/controller/GameControllerTest.java diff --git a/src/test/java/controller/GameControllerTest.java b/src/test/java/controller/GameControllerTest.java new file mode 100644 index 00000000..57c83f3e --- /dev/null +++ b/src/test/java/controller/GameControllerTest.java @@ -0,0 +1,50 @@ +package controller; + +import model.Computer; +import model.User; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +class GameControllerTest { + User user = new User(); + Computer computer = new Computer(); + GameController gameController = new GameController(user, computer); + + @Test + void setUserNumbers() { + // Given + ArrayList expectedNumbers = new ArrayList<>(Arrays.asList(1, 2, 3)); + GameController gameController = new GameController(user, computer); + + // When + String input = "1 2 3"; + System.setIn(new ByteArrayInputStream(input.getBytes())); + gameController.setUserNumbers(); + + // Then + Assertions.assertThat(user.getNumberList()).isEqualTo(expectedNumbers); + } + // + // @Test + // void setComputerNumbers() { + // // Given + // Set expectedNumbers = new LinkedHashSet<>(); + // expectedNumbers.add(1); + // expectedNumbers.add(2); + // expectedNumbers.add(3); + // + // // When + // gameController.setComputerNumbers(); + // + // // Then + // Assertions.assertThat(computer.getNumberSet().size()).isEqualTo(expectedNumbers.size()); + // } +} From 781e69334ddc163540cc7324b58768a39a26db1b Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:36:34 +0900 Subject: [PATCH 15/35] test: Add testComputerNumbers --- .../java/controller/GameControllerTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/java/controller/GameControllerTest.java b/src/test/java/controller/GameControllerTest.java index 57c83f3e..cf74da7c 100644 --- a/src/test/java/controller/GameControllerTest.java +++ b/src/test/java/controller/GameControllerTest.java @@ -32,19 +32,19 @@ void setUserNumbers() { // Then Assertions.assertThat(user.getNumberList()).isEqualTo(expectedNumbers); } - // - // @Test - // void setComputerNumbers() { - // // Given - // Set expectedNumbers = new LinkedHashSet<>(); - // expectedNumbers.add(1); - // expectedNumbers.add(2); - // expectedNumbers.add(3); - // - // // When - // gameController.setComputerNumbers(); - // - // // Then - // Assertions.assertThat(computer.getNumberSet().size()).isEqualTo(expectedNumbers.size()); - // } + + @Test + void setComputerNumbers() { + // Given + Set expectedNumbers = new LinkedHashSet<>(); + expectedNumbers.add(1); + expectedNumbers.add(2); + expectedNumbers.add(3); + + // When + gameController.setComputerNumbers(); + + // Then + Assertions.assertThat(computer.getNumberSet().size()).isEqualTo(expectedNumbers.size()); + } } From f39a2a3a8407f7fae5df7a8493f5c502d74f4e50 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:37:09 +0900 Subject: [PATCH 16/35] test: Add number generating test --- .../java/controller/InputControllerTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/controller/InputControllerTest.java diff --git a/src/test/java/controller/InputControllerTest.java b/src/test/java/controller/InputControllerTest.java new file mode 100644 index 00000000..6a000fe7 --- /dev/null +++ b/src/test/java/controller/InputControllerTest.java @@ -0,0 +1,38 @@ +package controller; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; +import java.util.ArrayList; +import java.util.Set; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; + +class InputControllerTest { + + InputController inputController = new InputController(); + + @Test // [MethodName][StateUnderTest][ExpectedBehavior] + void testGeneratedUserNum() { + String input = "1 2 3"; + // String을 setIn을 통해 입력시킨다.new ByteArrayInputStream(input.getBytes())는 input 문자열을 바이트 배열로 + // 변환한 후, 이를 사용하여 새로운 ByteArrayInputStream 객체를 생성합니다. ByteArrayInputStream은 InputStream의 하위 + // 클래스로, 바이트 배열에서 데이터를 읽는 데 사용됩니다. + System.setIn(new ByteArrayInputStream(input.getBytes())); + + ArrayList result = inputController.generateUserNum(); + + assertThat(result.size()).isEqualTo(3); + assertThat(result.get(0)).isEqualTo(1); + assertThat(result.get(1)).isEqualTo(2); + assertThat(result.get(2)).isEqualTo(3); + } + + @Test + void testGenerateComputerNumSize() { + Set result = inputController.generateComputerNum(); + assertThat(result.size()).isEqualTo(3); + } +} From 0204760ff89a10ad1ff19b7ae76bdbeb5c1bb7d7 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:37:59 +0900 Subject: [PATCH 17/35] test(ScoreControllerTest): Add baseBallCount score test --- .../java/controller/ScoreControllerTest.java | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 src/test/java/controller/ScoreControllerTest.java diff --git a/src/test/java/controller/ScoreControllerTest.java b/src/test/java/controller/ScoreControllerTest.java new file mode 100644 index 00000000..e29db138 --- /dev/null +++ b/src/test/java/controller/ScoreControllerTest.java @@ -0,0 +1,141 @@ +package controller; + +import model.BallCountStatus; +import model.Computer; +import 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.sql.Array; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ScoreControllerTest { + ScoreController scoreController = new ScoreController(); + InputController inputController = new InputController(); + + + @Test + void compareScoreBall() { + ArrayList inputStatus = new ArrayList<>(); // empty score board + User user = new User(); + + Computer computer = new Computer(); + Set computerNumbers = new LinkedHashSet<>(); + computerNumbers.add(1); + computerNumbers.add(2); + computerNumbers.add(3); + computer.setNumberSet(computerNumbers); + + String expectedUserNum = "3 1 2"; + System.setIn(new ByteArrayInputStream(expectedUserNum.getBytes())); + user.setNumberList(inputController.generateUserNum()); + + scoreController.compareScoreBall(inputStatus, user, computer); + + assertThat(inputStatus.size()).isEqualTo(3); + for (BallCountStatus status : inputStatus) { + assertThat(status).isEqualTo(BallCountStatus.Ball); + } + } + + @Test + void compareScoreStrike() { + ArrayList inputStatus = new ArrayList<>(); // empty score board + User user = new User(); + + Computer computer = new Computer(); + Set computerNumbers = new LinkedHashSet<>(); + computerNumbers.add(1); + computerNumbers.add(2); + computerNumbers.add(3); + computer.setNumberSet(computerNumbers); + + String expectedUserNum = "1 2 3"; + System.setIn(new ByteArrayInputStream(expectedUserNum.getBytes())); + user.setNumberList(inputController.generateUserNum()); + + scoreController.compareScoreStrike(inputStatus, user, computer); + + assertThat(inputStatus.size()).isEqualTo(3); + for (BallCountStatus status : inputStatus) { + assertThat(status).isEqualTo(BallCountStatus.Strike); + } + } + + @Test + @DisplayName("OneBall OneStrike") + void testConvertScoreListToStringOneBallOneStrike() { + // given + String expected = "1볼 1스트라이크"; + ArrayList myScore = new ArrayList<>(); + myScore.add(BallCountStatus.Ball); + myScore.add(BallCountStatus.Strike); + myScore.add(BallCountStatus.Ball); + ScoreController scoreController = new ScoreController(); + + // when + String result = scoreController.convertScoreListToString(myScore); + + // then + assertThat(result).isEqualTo(expected); + } + + @Test + @DisplayName("ThreeStrike") + void testConvertScoreListToStringThreeStrike() { + // given + String expected = "3스트라이크"; + ArrayList myScore = new ArrayList<>(); + myScore.add(BallCountStatus.Strike); + myScore.add(BallCountStatus.Strike); + myScore.add(BallCountStatus.Strike); + ScoreController scoreController = new ScoreController(); + + // when + String result = scoreController.convertScoreListToString(myScore); + + // then + assertThat(result).isEqualTo(expected); + } + @Test + @DisplayName("ThreeBall") + void testConvertScoreListToStringThreeBall() { + // given + String expected = "3볼"; + ArrayList myScore = new ArrayList<>(); + myScore.add(BallCountStatus.Ball); + myScore.add(BallCountStatus.Ball); + myScore.add(BallCountStatus.Ball); + ScoreController scoreController = new ScoreController(); + + // when + String result = scoreController.convertScoreListToString(myScore); + + // then + assertThat(result).isEqualTo(expected); + } + @Test + @DisplayName("Nothing") + void testConvertScoreListToStringNothing() { + // given + String expected = "낫싱"; + ArrayList myScore = new ArrayList<>(); + ScoreController scoreController = new ScoreController(); + + // when + String result = scoreController.convertScoreListToString(myScore); + + // then + assertThat(result).isEqualTo(expected); + } + + +} From a12c1122b8f19d5295d1275e4076a70914cdd533 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:38:38 +0900 Subject: [PATCH 18/35] chore(Entity): Delete these files --- src/main/java/Entity/Player.java | 9 --------- src/main/java/Entity/PlayerStatus.java | 5 ----- 2 files changed, 14 deletions(-) delete mode 100644 src/main/java/Entity/Player.java delete mode 100644 src/main/java/Entity/PlayerStatus.java diff --git a/src/main/java/Entity/Player.java b/src/main/java/Entity/Player.java deleted file mode 100644 index 9f90b81f..00000000 --- a/src/main/java/Entity/Player.java +++ /dev/null @@ -1,9 +0,0 @@ -package Entity; - -import java.util.ArrayList; - -public abstract class Player { - final int INPUT_SIZE = 3; - PlayerStatus playerStatus; - ArrayList baseballStatuses = new ArrayList(); -} diff --git a/src/main/java/Entity/PlayerStatus.java b/src/main/java/Entity/PlayerStatus.java deleted file mode 100644 index 7560d5c3..00000000 --- a/src/main/java/Entity/PlayerStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package Entity; - -public enum PlayerStatus { - PERSON, COMPUTER -} From e74a0c3550746620d80ae6fac445c9c904f23c94 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:39:32 +0900 Subject: [PATCH 19/35] feat(view): Create user interface class --- src/main/java/view/UserInterface.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/view/UserInterface.java diff --git a/src/main/java/view/UserInterface.java b/src/main/java/view/UserInterface.java new file mode 100644 index 00000000..0b82297f --- /dev/null +++ b/src/main/java/view/UserInterface.java @@ -0,0 +1,26 @@ +package view; + +import java.util.Scanner; + +public class UserInterface { + private static final String THREE_STRIKE = "3스트라이크"; + private Scanner scanner; + + public UserInterface() { + this.scanner = new Scanner(System.in); + } + + public static void printStartingGame() { + System.out.println("=============== 숫자 야구 ================"); + } + + public static void printEndingGame() { + System.out.println("=============== 게임 종료 ================"); + } + + public void closeScanner() { + if (scanner != null) { + scanner.close(); + } + } +} From ac94f34ba3825547ee5419f18275fe610d5342f5 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:47:39 +0900 Subject: [PATCH 20/35] feat: Add baseballcount score compare methods --- src/main/java/controller/ScoreController.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/main/java/controller/ScoreController.java diff --git a/src/main/java/controller/ScoreController.java b/src/main/java/controller/ScoreController.java new file mode 100644 index 00000000..3f6c6fb0 --- /dev/null +++ b/src/main/java/controller/ScoreController.java @@ -0,0 +1,72 @@ +package controller; + +import model.BallCountStatus; +import model.Computer; +import model.User; + +import java.util.ArrayList; + +public class ScoreController { + private static final String ALL_STRIKE_MESSAGE = "3스트라이크"; + private static final int MAX_SCORE = 3; + private static final String NO_SCORE = "낫싱"; + + public String calculateScore(User user, Computer computer) { + ArrayList ballCount = new ArrayList<>(); + + compareScoreStrike(ballCount, user, computer); + + if (ballCount.size() == MAX_SCORE) { + return ALL_STRIKE_MESSAGE; + } + + compareScoreBall(ballCount, user, computer); + + return convertScoreListToString(ballCount); + } + + protected void compareScoreBall( + ArrayList score, User user, Computer computer) { + for (Integer userDatum : user.getNumberList()) { + if (computer.getNumberSet().stream().anyMatch(userDatum::equals) + && score.size() <= MAX_SCORE) { + score.add(BallCountStatus.Ball); + } + } + } + + protected void compareScoreStrike( + ArrayList score, User user, Computer computer) { + ArrayList computerNumberList = new ArrayList<>(computer.getNumberSet()); + for (int i = 0; i < user.getNumberList().size(); i++) { + if (computerNumberList.get(i).intValue() == user.getNumberList().get(i).intValue()) { + score.add(BallCountStatus.Strike); + } + } + } + // + // protected String convertScoreListToString(ArrayList score) { + // if (score.isEmpty()) { + // return NO_SCORE; + // } else { + // long ballNumber = getScoreCount(score, BallCountStatus.Ball); + // long strikeNumber = getScoreCount(score, BallCountStatus.Strike); + // ballNumber -= strikeNumber; + // String ballResult = (ballNumber) + "볼"; + // String strikeResult = strikeNumber + "스트라이크"; + // StringBuilder result = new StringBuilder(); + // if (ballNumber > 0) { + // result.append(ballResult); + // } + // if (strikeNumber > 0) { + // if (ballNumber > 0) result.append(" "); + // result.append(strikeResult); + // } + // return result.toString(); + // } + // } + // + // private long getScoreCount(ArrayList score, BallCountStatus status) { + // return score.stream().filter(x -> x == status).count(); + // } +} From 7dc18e79745d018fd1eeeaaa3ec77fde0c1e4657 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:48:28 +0900 Subject: [PATCH 21/35] feat: Add converting to string methods --- src/main/java/controller/ScoreController.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/main/java/controller/ScoreController.java b/src/main/java/controller/ScoreController.java index 3f6c6fb0..a81c444e 100644 --- a/src/main/java/controller/ScoreController.java +++ b/src/main/java/controller/ScoreController.java @@ -45,28 +45,28 @@ protected void compareScoreStrike( } } // - // protected String convertScoreListToString(ArrayList score) { - // if (score.isEmpty()) { - // return NO_SCORE; - // } else { - // long ballNumber = getScoreCount(score, BallCountStatus.Ball); - // long strikeNumber = getScoreCount(score, BallCountStatus.Strike); - // ballNumber -= strikeNumber; - // String ballResult = (ballNumber) + "볼"; - // String strikeResult = strikeNumber + "스트라이크"; - // StringBuilder result = new StringBuilder(); - // if (ballNumber > 0) { - // result.append(ballResult); - // } - // if (strikeNumber > 0) { - // if (ballNumber > 0) result.append(" "); - // result.append(strikeResult); - // } - // return result.toString(); - // } - // } - // - // private long getScoreCount(ArrayList score, BallCountStatus status) { - // return score.stream().filter(x -> x == status).count(); - // } + protected String convertScoreListToString(ArrayList score) { + if (score.isEmpty()) { + return NO_SCORE; + } else { + long ballNumber = getScoreCount(score, BallCountStatus.Ball); + long strikeNumber = getScoreCount(score, BallCountStatus.Strike); + ballNumber -= strikeNumber; + String ballResult = (ballNumber) + "볼"; + String strikeResult = strikeNumber + "스트라이크"; + StringBuilder result = new StringBuilder(); + if (ballNumber > 0) { + result.append(ballResult); + } + if (strikeNumber > 0) { + if (ballNumber > 0) result.append(" "); + result.append(strikeResult); + } + return result.toString(); + } + } + + private long getScoreCount(ArrayList score, BallCountStatus status) { + return score.stream().filter(x -> x == status).count(); + } } From de0859a2b3cb4433578933d1912fdcdfa02fd858 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:49:50 +0900 Subject: [PATCH 22/35] feat: Add number generating methods --- src/main/java/controller/InputController.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/controller/InputController.java diff --git a/src/main/java/controller/InputController.java b/src/main/java/controller/InputController.java new file mode 100644 index 00000000..1a56f925 --- /dev/null +++ b/src/main/java/controller/InputController.java @@ -0,0 +1,29 @@ +package controller; + +import java.util.*; + +public class InputController { + public ArrayList generateUserNum() { + ArrayList userNumber = new ArrayList<>(); + // Scanner scanner = new Scanner(System.in); + System.out.print("숫자를 입력하세요: "); + for (int i = 0; i < 3; i++) { + // if (scanner.hasNextInt()) { + // userNumber.add(scanner.nextInt()); + // } else { + // scanner.next(); + // i = 0; + // } + } + return userNumber; + } + + public Set generateComputerNum() { + Set numbers = new LinkedHashSet<>(); + Random random = new Random(); + while (numbers.size() < 3) { + numbers.add(random.nextInt(1, 10)); + } + return numbers; + } +} From 7fd471ea36a881e2430b95cc376b2ac731abeec4 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:50:58 +0900 Subject: [PATCH 23/35] fix: scanner bug --- src/main/java/controller/InputController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/InputController.java b/src/main/java/controller/InputController.java index 1a56f925..ef8fee0e 100644 --- a/src/main/java/controller/InputController.java +++ b/src/main/java/controller/InputController.java @@ -5,15 +5,15 @@ public class InputController { public ArrayList generateUserNum() { ArrayList userNumber = new ArrayList<>(); - // Scanner scanner = new Scanner(System.in); + Scanner scanner = new Scanner(System.in); System.out.print("숫자를 입력하세요: "); for (int i = 0; i < 3; i++) { - // if (scanner.hasNextInt()) { - // userNumber.add(scanner.nextInt()); - // } else { - // scanner.next(); - // i = 0; - // } + if (scanner.hasNextInt()) { + userNumber.add(scanner.nextInt()); + } else { + scanner.next(); + i = 0; + } } return userNumber; } From 1d2b4330cc3b057b008f5d4e4af2c6f6766df071 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:51:38 +0900 Subject: [PATCH 24/35] feat: Add GameController --- src/main/java/controller/GameController.java | 43 ++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/controller/GameController.java diff --git a/src/main/java/controller/GameController.java b/src/main/java/controller/GameController.java new file mode 100644 index 00000000..a79d5293 --- /dev/null +++ b/src/main/java/controller/GameController.java @@ -0,0 +1,43 @@ +package controller; + +import model.BallCountStatus; +import model.Computer; +import model.User; + +import java.util.*; + +public class GameController { + private User user; + private Computer computer; + private InputController inputController; + private ScoreController scoreController; + private static final String ALL_STRIKE_MESSAGE = "3스트라이크"; + + + public GameController(User user, Computer computer) { + this.user = user; + this.computer = computer; + this.inputController = new InputController(); + this.scoreController = new ScoreController(); + } + + public void startGame() { + setComputerNumbers(); + String result = ""; + while (!result.equals(ALL_STRIKE_MESSAGE)) { + setUserNumbers(); + result = scoreController.calculateScore(user, computer); + System.out.println(result); + } + System.out.println("승리!"); + } + + public void setUserNumbers() { + user.setNumberList(inputController.generateUserNum()); + } + + public void setComputerNumbers() { + computer.setNumberSet(inputController.generateComputerNum()); + } + +} From a5223512a40fb31dada25cb38c53bf057141e9a2 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:53:06 +0900 Subject: [PATCH 25/35] chore: Delete these files --- src/main/java/Entity/BaseballStatus.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/main/java/Entity/BaseballStatus.java diff --git a/src/main/java/Entity/BaseballStatus.java b/src/main/java/Entity/BaseballStatus.java deleted file mode 100644 index 016a8f1c..00000000 --- a/src/main/java/Entity/BaseballStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package Entity; - -public enum BaseballStatus { - Ball, Strike -} From 2793f47ca9de42dcf9847192ac324b134c95a54d Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:53:29 +0900 Subject: [PATCH 26/35] chore: Delete these files --- src/main/java/NumberBaseballGame.java | 140 -------------------------- 1 file changed, 140 deletions(-) delete mode 100644 src/main/java/NumberBaseballGame.java diff --git a/src/main/java/NumberBaseballGame.java b/src/main/java/NumberBaseballGame.java deleted file mode 100644 index 26b6bf74..00000000 --- a/src/main/java/NumberBaseballGame.java +++ /dev/null @@ -1,140 +0,0 @@ -import Entity.BaseballStatus; -import Entity.Computer; -import Entity.User; - -import java.util.*; - -public class NumberBaseballGame { - // Property: Player.Player - private User user; - private Computer computer; - private Scanner scanner; - private static final String ALL_STRIKE_MESSAGE = "3스트라이크"; - private static final int MAX_SCORE = 3; - private static final String NO_SCORE = "낫싱"; - - - public NumberBaseballGame(User user, Computer computer) { - this.user = user; - this.computer = computer; - this.scanner = new Scanner(System.in); - } - - public NumberBaseballGame(Computer computer, User user) { - this.user = user; - this.computer = computer; - this.scanner = new Scanner(System.in); - } - - public void setUserNumbers() { - user.setNumberList(generateUserNumByInput()); - } - - public void setComputerNumbers() { - computer.setNumberSet(generateRandomNumber()); - } - - private ArrayList generateUserNumByInput() { - ArrayList userNumber = new ArrayList<>(); - // Scanner scanner = new Scanner(System.in); - System.out.print("숫자를 입력하세요: "); - for (int i = 0; i < 3; i++) { - if (scanner.hasNextInt()) { - userNumber.add(scanner.nextInt()); - } else { - scanner.next(); - i = 0; - } - } - return userNumber; - } - - private Set generateRandomNumber() { - Set numbers = new LinkedHashSet<>(); - Random random = new Random(); - while (numbers.size() < 3) { - numbers.add(random.nextInt(1, 10)); - } - return numbers; - } - - public String calculateScore() { - ArrayList ballCount = new ArrayList<>(); - - compareScoreStrike(ballCount); - - if (ballCount.size() == MAX_SCORE) { - return ALL_STRIKE_MESSAGE; - } - - compareScoreBall(ballCount); - - return convertScoreListToString(ballCount); - } - - private void compareScoreBall(ArrayList score) { - for (Integer userDatum : user.getNumberList()) { - if (computer.getNumberSet() - .stream() - .anyMatch(userDatum::equals) && score.size() <= MAX_SCORE) { - score.add(BaseballStatus.Ball); - } - } - } - - private void compareScoreStrike(ArrayList score) { - ArrayList computerNumberList = new ArrayList<>(computer.getNumberSet()); - for (int i = 0; i < user.getNumberList() - .size(); i++) { - if (computerNumberList.get(i) - .intValue() == user.getNumberList() - .get(i) - .intValue()) { - score.add(BaseballStatus.Strike); - } - } - } - - private String convertScoreListToString(ArrayList score) { - if (score.isEmpty()) { - return NO_SCORE; - } else { - long ballNumber = getScoreCount(score, BaseballStatus.Ball); - long strikeNumber = getScoreCount(score, BaseballStatus.Strike); - ballNumber -= strikeNumber; - String ballResult = (ballNumber) + "볼"; - String strikeResult = strikeNumber + "스트라이크"; - StringBuilder result = new StringBuilder(); - if (ballNumber > 0) { - result.append(ballResult); - } - if (strikeNumber > 0) { - if (ballNumber > 0) result.append(" "); - result.append(strikeResult); - } - return result.toString(); - } - } - - private long getScoreCount(ArrayList score, BaseballStatus status) { - long socreCount = score.stream() - .filter(x -> x == status) - .count(); - return socreCount; - } - - public void closeScanner() { - if (scanner != null) { - scanner.close(); - - } - } - - public String printStartingGame() { - return "================ 숫자 야구 ================"; - } - - public String printEndingGmae() { - return "================ 게임 종료 ================"; - } -} From 2d5f50c5f034908b0dba7b25523cedeb82312566 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:53:54 +0900 Subject: [PATCH 27/35] feat: Add ballcount status --- src/main/java/Application.java | 28 ++++++++++-------------- src/main/java/model/BallCountStatus.java | 5 +++++ 2 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 src/main/java/model/BallCountStatus.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 085b6134..c62d7ad3 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,24 +1,20 @@ -import Entity.Computer; -import Entity.User; +import model.Computer; +import model.User; +import controller.GameController; +import view.UserInterface; public class Application { - private final static String threeStrike = "3스트라이크"; - public static void main(String[] args) { - // NOTE 사용자 또는 컴퓨터의 숫자를 생성하는 NumberGenerating 클래스 User user = new User(); Computer computer = new Computer(); - NumberBaseballGame numberBaseballGame = new NumberBaseballGame(user, computer); - System.out.println(numberBaseballGame.printStartingGame()); - numberBaseballGame.setComputerNumbers(); - String result = ""; - do { - numberBaseballGame.setUserNumbers(); - result = numberBaseballGame.calculateScore(); - System.out.println(result); - } while (!result.equals(threeStrike)); - numberBaseballGame.closeScanner(); - System.out.println(numberBaseballGame.printEndingGmae()); + + UserInterface userInterface = new UserInterface(); + GameController gameController = new GameController(user, computer); + + UserInterface.printStartingGame(); + gameController.startGame(); + UserInterface.printEndingGame(); + userInterface.closeScanner(); } } diff --git a/src/main/java/model/BallCountStatus.java b/src/main/java/model/BallCountStatus.java new file mode 100644 index 00000000..b2f87b8c --- /dev/null +++ b/src/main/java/model/BallCountStatus.java @@ -0,0 +1,5 @@ +package model; + +public enum BallCountStatus { + Ball, Strike +} From dfb91fb4763ecf2dcf5da1c09368a4f118426409 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:56:22 +0900 Subject: [PATCH 28/35] refactor: devide userinterface --- src/main/java/Application.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index c62d7ad3..9815edc7 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -15,6 +15,7 @@ public static void main(String[] args) { UserInterface.printStartingGame(); gameController.startGame(); UserInterface.printEndingGame(); + userInterface.closeScanner(); } } From ce005bbf7cc3cbadde094713ed686b39f509428b Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:57:03 +0900 Subject: [PATCH 29/35] feat: Add computer player class --- src/main/java/{Entity => model}/Computer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename src/main/java/{Entity => model}/Computer.java (76%) diff --git a/src/main/java/Entity/Computer.java b/src/main/java/model/Computer.java similarity index 76% rename from src/main/java/Entity/Computer.java rename to src/main/java/model/Computer.java index a6a0c165..75ac499b 100644 --- a/src/main/java/Entity/Computer.java +++ b/src/main/java/model/Computer.java @@ -1,13 +1,12 @@ -package Entity; +package model; import java.util.*; -public class Computer extends Player { +public class Computer { private Set numberSet; public Computer() { numberSet = new LinkedHashSet<>(); - playerStatus = PlayerStatus.COMPUTER; } public Computer setNumberSet(Set numberSet) { From 2f20a2f13bd9d60f28b8087639621cacbf18f579 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 04:57:21 +0900 Subject: [PATCH 30/35] feat: Add user player class --- src/main/java/{Entity => model}/User.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) rename src/main/java/{Entity => model}/User.java (74%) diff --git a/src/main/java/Entity/User.java b/src/main/java/model/User.java similarity index 74% rename from src/main/java/Entity/User.java rename to src/main/java/model/User.java index eb242c15..13c22549 100644 --- a/src/main/java/Entity/User.java +++ b/src/main/java/model/User.java @@ -1,15 +1,13 @@ -package Entity; +package model; import java.util.ArrayList; import java.util.List; -import java.util.Scanner; -public class User extends Player { +public class User { private List numberList; public User() { numberList = new ArrayList<>(); - playerStatus = PlayerStatus.PERSON; } public User setNumberList(List numberList) { From 70903f6d55045134a251ecb779af124b7eafb859 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 12:09:16 +0900 Subject: [PATCH 31/35] feat: Add readme file --- README.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f9892320..ef523fcd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,16 @@ # java-baseball-precourse +## 기능 목록 + +- 사용자로부터 3개의 숫자 입력 받기 +- 컴퓨터 플레이어의 경우 1~9까지의 중복되지 않은 랜덤 숫자 생성 +- 사용자와 컴퓨터의 숫자 비교 하여 볼과 스트라이크 판단 +- 반복하여 사용자의 입력을 받아 스트라이크와 볼 비교 +- 자리와 숫자까지 맞으면 스트라이크 +- 숫자만 맞으면 볼 +- 아무것도 맞지 않으면 낫싱 +- 3스트라이크면 게임 종료하기 +- 숫자는 3대만 들어오게 함 +- 숫자는 10이상의 숫자는 들어오지 않게 함 ## 과제 요구 사항 @@ -11,12 +23,12 @@ * 기본적으로 1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 게임이다# * 같은 수가 같은 자리에 있으면 스트라이크, 다른 자리에 있으면 볼, 같은 수가 전혀 없으면 낫싱이란 힌트를 얻고, 그 힌트를 이용해서 먼저 상대방(컴퓨터)의 수를 맞추면 승리한다. - ```Shell + ```textmate * e.g. * 상대방(컴퓨터)의 수가 425일 때, - * - 123을 제시한 경우: 1스트라이크 - - - 456을 제시한 경우: 1볼 1스트라이크 - - - 789를 제시한 경우: 낫싱 + * 123을 제시한 경우: 1스트라이크 + * 456을 제시한 경우: 1볼 1스트라이크 + * 789를 제시한 경우: 낫싱 * ``` 위 숫자 야구 게임에서 상대방의 역할을 컴퓨터가 한다. 컴퓨터는 1에서 9까지 서로 다른 임의의 수 3개를 선택한다. 게임 플레이어는 컴퓨터가 생각하고 있는 3개의 숫자를 입력하고, 컴퓨터는 입력한 숫자에 대한 결과를 출력한다. @@ -60,5 +72,4 @@ indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. 3항 연산자를 쓰지 않는다. -함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라. -JUnit 5와 AssertJ를 이용하여 정리한 기능 목록이 정상적으로 작동하는지 테스트 코드로 확인한다. \ No newline at end of file +함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라. \ No newline at end of file From 5559b7ff5901393d19899bac925786b995434627 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 12:10:46 +0900 Subject: [PATCH 32/35] fix: prevent input of number greater than 9 --- src/main/java/controller/InputController.java | 4 ++++ src/main/java/controller/ScoreController.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/controller/InputController.java b/src/main/java/controller/InputController.java index ef8fee0e..8ed0773e 100644 --- a/src/main/java/controller/InputController.java +++ b/src/main/java/controller/InputController.java @@ -15,6 +15,10 @@ public ArrayList generateUserNum() { i = 0; } } + if(userNumber.stream().anyMatch(x->x>10)){ + System.out.println("한자리 수만 입력할 수 있습니다. 다시 입력해주세요"); + userNumber.clear(); + } return userNumber; } diff --git a/src/main/java/controller/ScoreController.java b/src/main/java/controller/ScoreController.java index a81c444e..7eeec651 100644 --- a/src/main/java/controller/ScoreController.java +++ b/src/main/java/controller/ScoreController.java @@ -12,6 +12,7 @@ public class ScoreController { private static final String NO_SCORE = "낫싱"; public String calculateScore(User user, Computer computer) { + if (user.getNumberList().isEmpty()) return ""; ArrayList ballCount = new ArrayList<>(); compareScoreStrike(ballCount, user, computer); From 1e6de963a83eec1f031a1b4399d3720abcbd230b Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 12:15:56 +0900 Subject: [PATCH 33/35] fix: prevent input of number greater than 9 not 10 --- src/main/java/controller/InputController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/controller/InputController.java b/src/main/java/controller/InputController.java index 8ed0773e..fdb5bd60 100644 --- a/src/main/java/controller/InputController.java +++ b/src/main/java/controller/InputController.java @@ -15,7 +15,7 @@ public ArrayList generateUserNum() { i = 0; } } - if(userNumber.stream().anyMatch(x->x>10)){ + if(userNumber.stream().anyMatch(x->x>9)){ System.out.println("한자리 수만 입력할 수 있습니다. 다시 입력해주세요"); userNumber.clear(); } From c34e814df84a83205c1fd67b558ba5e2ed388462 Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 12:16:11 +0900 Subject: [PATCH 34/35] chore: Delete these files --- src/test/java/NumberGeneratingTest.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 src/test/java/NumberGeneratingTest.java diff --git a/src/test/java/NumberGeneratingTest.java b/src/test/java/NumberGeneratingTest.java deleted file mode 100644 index 9f3e11c8..00000000 --- a/src/test/java/NumberGeneratingTest.java +++ /dev/null @@ -1,12 +0,0 @@ -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.Set; - -class NumberGeneratingTest { - - @Test - void generateRandomNumber() { - - } -} \ No newline at end of file From afdde709750e8ee7ffa1d9a8c85e3e67c133cf7b Mon Sep 17 00:00:00 2001 From: Kim Sanghae Date: Mon, 6 May 2024 12:17:05 +0900 Subject: [PATCH 35/35] feat: Add input test when the input number is greater than 9 --- src/test/java/controller/InputControllerTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/controller/InputControllerTest.java b/src/test/java/controller/InputControllerTest.java index 6a000fe7..e63391ab 100644 --- a/src/test/java/controller/InputControllerTest.java +++ b/src/test/java/controller/InputControllerTest.java @@ -35,4 +35,14 @@ void testGenerateComputerNumSize() { Set result = inputController.generateComputerNum(); assertThat(result.size()).isEqualTo(3); } + + @Test + void testInputNumberGreaterThan9() { + String input = "10 2 1"; + System.setIn(new ByteArrayInputStream(input.getBytes())); + + ArrayList result = inputController.generateUserNum(); + + assertThat(result.size()).isEqualTo(0); + } }