From cc8c06f4b5ced5d6a8f07dc1e7e520545f441bff Mon Sep 17 00:00:00 2001 From: Jeongns Date: Sat, 23 Dec 2023 04:07:52 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 9 +++ src/main/java/baseball/AppConfig.java | 26 ++++++ src/main/java/baseball/Application.java | 36 ++++++++- .../baseball/Computer/ComputerService.java | 7 ++ .../Computer/ComputerServiceImpl.java | 24 ++++++ src/main/java/baseball/Constant.java | 10 +++ .../java/baseball/Parse/ParseService.java | 8 ++ .../java/baseball/Parse/ParseServiceImpl.java | 29 +++++++ .../java/baseball/check/CheckService.java | 9 +++ .../java/baseball/check/CheckServiceImpl.java | 27 +++++++ src/main/java/baseball/check/Hint.java | 35 ++++++++ .../java/baseball/input/InputService.java | 7 ++ .../java/baseball/input/InputServiceImpl.java | 11 +++ .../java/baseball/print/PrintService.java | 19 +++++ .../java/baseball/print/PrintServiceImpl.java | 39 +++++++++ src/test/java/baseball/ApplicationTest.java | 3 + .../Computer/ComputerServiceTest.java | 34 ++++++++ .../java/baseball/Parse/ParseServiceTest.java | 52 ++++++++++++ .../java/baseball/check/CheckServiceTest.java | 79 +++++++++++++++++++ 19 files changed, 463 insertions(+), 1 deletion(-) create mode 100644 src/main/java/baseball/AppConfig.java create mode 100644 src/main/java/baseball/Computer/ComputerService.java create mode 100644 src/main/java/baseball/Computer/ComputerServiceImpl.java create mode 100644 src/main/java/baseball/Constant.java create mode 100644 src/main/java/baseball/Parse/ParseService.java create mode 100644 src/main/java/baseball/Parse/ParseServiceImpl.java create mode 100644 src/main/java/baseball/check/CheckService.java create mode 100644 src/main/java/baseball/check/CheckServiceImpl.java create mode 100644 src/main/java/baseball/check/Hint.java create mode 100644 src/main/java/baseball/input/InputService.java create mode 100644 src/main/java/baseball/input/InputServiceImpl.java create mode 100644 src/main/java/baseball/print/PrintService.java create mode 100644 src/main/java/baseball/print/PrintServiceImpl.java create mode 100644 src/test/java/baseball/Computer/ComputerServiceTest.java create mode 100644 src/test/java/baseball/Parse/ParseServiceTest.java create mode 100644 src/test/java/baseball/check/CheckServiceTest.java diff --git a/docs/README.md b/docs/README.md index e69de29bb2..617a8df7c3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,9 @@ +컴퓨터가 가지는 난수 리스트를 생성한다. + +사용자의 입력을 받는 서비스를 만든다. + +사용자의 입력값과 난수를 비교하여 결과를 뱉는다 + +출력을 하는 서비스를 만든다. + +이걸 감싸는 루프도는 친구를 만든다. diff --git a/src/main/java/baseball/AppConfig.java b/src/main/java/baseball/AppConfig.java new file mode 100644 index 0000000000..871bd2daa4 --- /dev/null +++ b/src/main/java/baseball/AppConfig.java @@ -0,0 +1,26 @@ +package baseball; + +import baseball.Computer.ComputerService; +import baseball.Computer.ComputerServiceImpl; +import baseball.Parse.ParseService; +import baseball.Parse.ParseServiceImpl; +import baseball.check.CheckService; +import baseball.check.CheckServiceImpl; +import baseball.input.InputService; +import baseball.input.InputServiceImpl; +import baseball.print.PrintService; +import baseball.print.PrintServiceImpl; + +public class AppConfig { + + public PrintService printService() {return new PrintServiceImpl();} + + public ComputerService computerService() {return new ComputerServiceImpl();} + + public InputService inputService() {return new InputServiceImpl();} + + public ParseService parseService() {return new ParseServiceImpl();} + + public CheckService checkService() {return new CheckServiceImpl();} + +} diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..d26c0109ce 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,41 @@ package baseball; +import baseball.Computer.ComputerService; +import baseball.Parse.ParseService; +import baseball.check.CheckService; +import baseball.check.Hint; +import baseball.input.InputService; +import baseball.print.PrintService; + +import java.util.List; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + AppConfig appConfig = new AppConfig(); + + PrintService printService = appConfig.printService(); + ComputerService computerService = appConfig.computerService(); + InputService inputService = appConfig.inputService(); + ParseService parseService = appConfig.parseService(); + CheckService checkService = appConfig.checkService(); + + List computer = computerService.settingComputer(); + printService.gameStartMessage(); + + while(true){ + printService.inputMessage(); + List numbers = parseService.stringParseToNumbers(inputService.readLine()); + Hint hint = checkService.checkNumber(computer, numbers); + printService.resultMessage(hint.getStrike(), hint.getBall()); + if(checkService.checkGameOver(hint)){ + printService.gameEndMessage(); + printService.restartMessage(); + if(parseService.isRestart(inputService.readLine())){ + computer = computerService.settingComputer(); + continue; + } + break; + } + } } } diff --git a/src/main/java/baseball/Computer/ComputerService.java b/src/main/java/baseball/Computer/ComputerService.java new file mode 100644 index 0000000000..924de4bc7f --- /dev/null +++ b/src/main/java/baseball/Computer/ComputerService.java @@ -0,0 +1,7 @@ +package baseball.Computer; + +import java.util.List; + +public interface ComputerService { + List settingComputer(); +} diff --git a/src/main/java/baseball/Computer/ComputerServiceImpl.java b/src/main/java/baseball/Computer/ComputerServiceImpl.java new file mode 100644 index 0000000000..dad74668fc --- /dev/null +++ b/src/main/java/baseball/Computer/ComputerServiceImpl.java @@ -0,0 +1,24 @@ +package baseball.Computer; + + + +import static camp.nextstep.edu.missionutils.Randoms.*; +import static baseball.Constant.*; + +import java.util.ArrayList; +import java.util.List; + +public class ComputerServiceImpl implements ComputerService{ + + @Override + public List settingComputer() { + List computer = new ArrayList<>(); + while (computer.size() < SIZE) { + int randomNumber = pickNumberInRange(COMPUTER_MIN, COMPUTER_MAX); + if (!computer.contains(randomNumber)) { + computer.add(randomNumber); + } + } + return computer; + } +} diff --git a/src/main/java/baseball/Constant.java b/src/main/java/baseball/Constant.java new file mode 100644 index 0000000000..04588e2a29 --- /dev/null +++ b/src/main/java/baseball/Constant.java @@ -0,0 +1,10 @@ +package baseball; + +public class Constant { + public final static int COMPUTER_MIN = 1; + public final static int COMPUTER_MAX = 9; + public final static int SIZE = 3; + + public final static String RESTART_FLAG = "1"; + public final static String END_FLAG = "2"; +} diff --git a/src/main/java/baseball/Parse/ParseService.java b/src/main/java/baseball/Parse/ParseService.java new file mode 100644 index 0000000000..118fa0ec30 --- /dev/null +++ b/src/main/java/baseball/Parse/ParseService.java @@ -0,0 +1,8 @@ +package baseball.Parse; + +import java.util.List; + +public interface ParseService { + List stringParseToNumbers(String StringNumbers); + boolean isRestart(String flag); +} diff --git a/src/main/java/baseball/Parse/ParseServiceImpl.java b/src/main/java/baseball/Parse/ParseServiceImpl.java new file mode 100644 index 0000000000..7f31a4c87a --- /dev/null +++ b/src/main/java/baseball/Parse/ParseServiceImpl.java @@ -0,0 +1,29 @@ +package baseball.Parse; + +import java.util.ArrayList; +import java.util.List; + +import static baseball.Constant.*; + +public class ParseServiceImpl implements ParseService{ + @Override + public List stringParseToNumbers(String StringNumbers) { + if(StringNumbers.length() != SIZE) + throw new IllegalArgumentException(); + + List numbers = new ArrayList<>(); + for(String string : StringNumbers.split("")){ + numbers.add(Integer.parseInt(string)); + } + return numbers; + } + + @Override + public boolean isRestart(String flag) { + if (flag.equals(RESTART_FLAG)) + return true; + if (flag.equals(END_FLAG)) + return false; + throw new IllegalArgumentException(); + } +} diff --git a/src/main/java/baseball/check/CheckService.java b/src/main/java/baseball/check/CheckService.java new file mode 100644 index 0000000000..27857aab2a --- /dev/null +++ b/src/main/java/baseball/check/CheckService.java @@ -0,0 +1,9 @@ +package baseball.check; + +import java.util.List; + +public interface CheckService { + Hint checkNumber(List computer, List numbers); + + boolean checkGameOver(Hint hint); +} diff --git a/src/main/java/baseball/check/CheckServiceImpl.java b/src/main/java/baseball/check/CheckServiceImpl.java new file mode 100644 index 0000000000..042d6b7435 --- /dev/null +++ b/src/main/java/baseball/check/CheckServiceImpl.java @@ -0,0 +1,27 @@ +package baseball.check; + +import java.util.ArrayList; +import java.util.List; + +public class CheckServiceImpl implements CheckService { + + @Override + public Hint checkNumber(List computer, List numbers) { + Hint hint = new Hint(); + for(int i = 0; i < computer.size(); i++){ + if(computer.get(i).equals(numbers.get(i))){ + hint.strikeCounting(); + continue; + } + if(computer.contains(numbers.get(i))){ + hint.ballCounting(); + } + } + return hint; + } + + @Override + public boolean checkGameOver(Hint hint) { + return hint.getStrike() == 3; + } +} diff --git a/src/main/java/baseball/check/Hint.java b/src/main/java/baseball/check/Hint.java new file mode 100644 index 0000000000..da07906b98 --- /dev/null +++ b/src/main/java/baseball/check/Hint.java @@ -0,0 +1,35 @@ +package baseball.check; + +public class Hint { + private int strike; + private int ball; + + public Hint( ) { + this.strike = 0; + this.ball = 0; + } + + public int getBall() { + return ball; + } + + public void setBall(int ball) { + this.ball = ball; + } + + public int getStrike() { + return strike; + } + + public void setStrike(int strike) { + this.strike = strike; + } + + public void strikeCounting(){ + this.strike++; + } + + public void ballCounting(){ + this.ball++; + } +} diff --git a/src/main/java/baseball/input/InputService.java b/src/main/java/baseball/input/InputService.java new file mode 100644 index 0000000000..76533059d1 --- /dev/null +++ b/src/main/java/baseball/input/InputService.java @@ -0,0 +1,7 @@ +package baseball.input; + +import java.util.List; + +public interface InputService { + String readLine(); +} diff --git a/src/main/java/baseball/input/InputServiceImpl.java b/src/main/java/baseball/input/InputServiceImpl.java new file mode 100644 index 0000000000..53fa427ed1 --- /dev/null +++ b/src/main/java/baseball/input/InputServiceImpl.java @@ -0,0 +1,11 @@ +package baseball.input; + +import camp.nextstep.edu.missionutils.Console; + +public class InputServiceImpl implements InputService{ + + public String readLine(){ + String line = Console.readLine(); + return line; + } +} diff --git a/src/main/java/baseball/print/PrintService.java b/src/main/java/baseball/print/PrintService.java new file mode 100644 index 0000000000..ce9fbc8355 --- /dev/null +++ b/src/main/java/baseball/print/PrintService.java @@ -0,0 +1,19 @@ +package baseball.print; + +import baseball.check.Hint; + +import java.util.List; + +public interface PrintService { + + void gameStartMessage(); + + void inputMessage(); + + void gameEndMessage(); + + void restartMessage(); + + void resultMessage(int strikeCount, int ballCount); + +} diff --git a/src/main/java/baseball/print/PrintServiceImpl.java b/src/main/java/baseball/print/PrintServiceImpl.java new file mode 100644 index 0000000000..3c0f0bd20e --- /dev/null +++ b/src/main/java/baseball/print/PrintServiceImpl.java @@ -0,0 +1,39 @@ +package baseball.print; + +import static baseball.Constant.*; + +public class PrintServiceImpl implements PrintService{ + @Override + public void gameStartMessage() { + System.out.println("숫자 야구 게임을 시작합니다."); + } + + @Override + public void inputMessage() { + System.out.print("숫자를 입력해주세요 : "); + } + + @Override + public void gameEndMessage() { + System.out.println(String.format("%d개의 숫자를 모두 맞히셨습니다! 게임 종료", SIZE)); + } + + @Override + public void restartMessage() { + System.out.println(String.format("게임을 새로 시작하려면 %s, 종료하려면 %s를 입력하세요.", RESTART_FLAG, END_FLAG)); + } + + @Override + public void resultMessage(int strikeCount, int ballCount) { + if(strikeCount == 0 && ballCount ==0) + System.out.print("낫싱"); + + if(ballCount > 0) + System.out.print(String.format("%d볼 ", ballCount)); + if(strikeCount > 0) + System.out.print(String.format("%d스트라이크 ", strikeCount)); + + System.out.println(); + } + +} diff --git a/src/test/java/baseball/ApplicationTest.java b/src/test/java/baseball/ApplicationTest.java index 3fa29fa67b..35590055ba 100644 --- a/src/test/java/baseball/ApplicationTest.java +++ b/src/test/java/baseball/ApplicationTest.java @@ -9,6 +9,9 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; class ApplicationTest extends NsTest { + + + @Test void 게임종료_후_재시작() { assertRandomNumberInRangeTest( diff --git a/src/test/java/baseball/Computer/ComputerServiceTest.java b/src/test/java/baseball/Computer/ComputerServiceTest.java new file mode 100644 index 0000000000..d2eecdcb46 --- /dev/null +++ b/src/test/java/baseball/Computer/ComputerServiceTest.java @@ -0,0 +1,34 @@ +package baseball.Computer; + +import baseball.AppConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +import static baseball.Constant.*; + +class ComputerServiceTest { + + private ComputerService computerService; + + @BeforeEach + void beforeEach(){ + AppConfig appConfig = new AppConfig(); + computerService = appConfig.computerService(); + } + + @Test + @DisplayName("computer에 값이 올바르게 할당되는가 ") + void checkSettingComputer() { + // given + List computer = computerService.settingComputer(); + // when, then + assertTrue(computer.size() == SIZE); + assertTrue(computer.size() == computer.stream().distinct().count()); + } + +} \ No newline at end of file diff --git a/src/test/java/baseball/Parse/ParseServiceTest.java b/src/test/java/baseball/Parse/ParseServiceTest.java new file mode 100644 index 0000000000..fa97cf91a0 --- /dev/null +++ b/src/test/java/baseball/Parse/ParseServiceTest.java @@ -0,0 +1,52 @@ +package baseball.Parse; + +import baseball.AppConfig; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static baseball.Constant.*; + +import static org.junit.jupiter.api.Assertions.*; + +class ParseServiceTest { + + private ParseService parseService; + + @BeforeEach + void beforeEach(){ + AppConfig appConfig = new AppConfig(); + parseService = appConfig.parseService(); + } + + @Test + @DisplayName("문자열을 List형태로 치환한다,") + void stringParseToNumbers() { + // given + String line = "123"; + // when + List numbers = parseService.stringParseToNumbers(line); + // then + Assertions.assertThat(numbers).containsExactly(1,2,3); + } + + @Test + @DisplayName("올바르지 않은 입력 값이 들어올 경우 IllegalArgumentException을 발생시킨다.") + void stringParsingError() { + // given, when, then + Assertions.assertThatThrownBy(() -> parseService.stringParseToNumbers("1234")); + Assertions.assertThatThrownBy(() -> parseService.stringParseToNumbers("12")); + Assertions.assertThatThrownBy(() -> parseService.stringParseToNumbers("asdf")); + } + + @Test + @DisplayName("RESTART_FLAG를 누르면 재시작(true), END_FLAG를 누르면 종료(false)를 한다") + void checkRestart() { + // given, when, then + assertTrue(parseService.isRestart(RESTART_FLAG)); + assertFalse(parseService.isRestart(END_FLAG)); + } +} \ No newline at end of file diff --git a/src/test/java/baseball/check/CheckServiceTest.java b/src/test/java/baseball/check/CheckServiceTest.java new file mode 100644 index 0000000000..84ce24889d --- /dev/null +++ b/src/test/java/baseball/check/CheckServiceTest.java @@ -0,0 +1,79 @@ +package baseball.check; + +import baseball.AppConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CheckServiceTest { + + private CheckService checkService; + + @BeforeEach + void beforeEach(){ + AppConfig appConfig = new AppConfig(); + checkService = appConfig.checkService(); + } + + @Test + @DisplayName("사용자가 준 값이 컴퓨터의 값과 순서가 일치할때 STRIKE가 카운트 되는지 확인한다.") + void checkStrike() { + // given + List computer = Arrays.asList(1,2,3); + List numbers = Arrays.asList(1,2,3); + // when + Hint hint = checkService.checkNumber(computer, numbers); + // then + assertEquals(hint.getStrike(), 3); + } + + @Test + @DisplayName("사용자가 준 값이 컴퓨터의 존재 할때 BALL이 카운트 되는지 확인한다.") + void checkBall() { + // given + List computer = Arrays.asList(2,3,1); + List numbers = Arrays.asList(1,2,3); + // when + Hint hint = checkService.checkNumber(computer, numbers); + // then + assertEquals(hint.getBall(), 3); + } + + @Test + @DisplayName("사용자가 준 값이 컴퓨터의 없을때 카운트 안되는지 확인한다.") + void checkNothing() { + // given + List computer = Arrays.asList(1,2,3); + List numbers = Arrays.asList(4,5,6); + // when + Hint hint = checkService.checkNumber(computer, numbers); + // then + assertEquals(hint.getStrike(), 0); + assertEquals(hint.getBall(), 0); + } + + @Test + @DisplayName("모든 값이 스트라이크라면 게임을 끝낸다.") + void checkGameOver() { + // given + Hint hint = new Hint(); + hint.setStrike(3); + // when then + assertTrue(checkService.checkGameOver(hint)); + } + + @Test + @DisplayName("모든 값이 스트라이크아니라면 게임을 계속한다.") + void checkGameAgain() { + // given + Hint hint = new Hint(); + // when then + assertFalse(checkService.checkGameOver(hint)); + } + +} \ No newline at end of file