diff --git a/README.md b/README.md index fcf3f057..1c36dc47 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,15 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 구현할 기능 목록 +* 유저에게 메세지를 출력하는 기능 + * 유저에게 인풋을 요구하는 메세지 + * 결과 메세지 +* 유저의 인풋을 저장하는 기능 +* 유저의 인풋에 대한 결과를 확인하는 기능 +* 서로 다른 3개의 digit으로 이루어진 랜덤한 세자리 숫자 선정하는 기능 + +## 구현하면 좋을 기능 +* input의 validity check 기능 +* 더 많은 Test들 diff --git a/src/main/java/baseball/Console.java b/src/main/java/baseball/Console.java new file mode 100644 index 00000000..ede8eb2d --- /dev/null +++ b/src/main/java/baseball/Console.java @@ -0,0 +1,30 @@ +package baseball; +import java.util.Scanner; + +public class Console { + public String getInput() { + System.out.print("숫자를 입력해주세요 : "); + Scanner scanner = new Scanner(System.in); + return scanner.next(); + } + + public void printResult(int strike, int ball) { + if (strike + ball == 0) { + System.out.print("낫씽"); + } + if (strike != 0) { + System.out.print(strike + " 스트라이크 "); + } + if (ball != 0) { + System.out.print(ball + " 볼"); + } + System.out.println(); + } + + public int endGame() { + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하시려면 1, 종료하려면 2를 입력하세요."); + Scanner scanner = new Scanner(System.in); + return scanner.nextInt(); + } +} diff --git a/src/main/java/baseball/Controller.java b/src/main/java/baseball/Controller.java new file mode 100644 index 00000000..6789cf13 --- /dev/null +++ b/src/main/java/baseball/Controller.java @@ -0,0 +1,8 @@ +package baseball; + +public class Controller { + public static void main(String[] args) { + Engine engine = new Engine(); + engine.playBall(); + } +} diff --git a/src/main/java/baseball/Engine.java b/src/main/java/baseball/Engine.java new file mode 100644 index 00000000..bc37d007 --- /dev/null +++ b/src/main/java/baseball/Engine.java @@ -0,0 +1,31 @@ +package baseball; + +public class Engine { + public void playBall() { + int flag = 1; + while (flag == 1) { + flag = match(); + } + } + + private int match() { + Console console = new Console(); + Pitcher pitcher = new Pitcher(); + String target = pitcher.generateNumber(); + batting(console, target); + return console.endGame(); + } + + private void batting(Console console, String target) { + int strike = 0; + int ball; + Referee referee = new Referee(); + while (strike != 3) { + String input = console.getInput(); + int[] result = referee.judge(target, input); + strike = result[0]; + ball = result[1]; + console.printResult(strike, ball); + } + } +} diff --git a/src/main/java/baseball/Pitcher.java b/src/main/java/baseball/Pitcher.java new file mode 100644 index 00000000..fe58e6e0 --- /dev/null +++ b/src/main/java/baseball/Pitcher.java @@ -0,0 +1,18 @@ +package baseball; +import java.util.Random; +import java.util.ArrayList; +import java.util.Arrays; + +public class Pitcher { + public String generateNumber() { + Random random = new Random(); + ArrayList digits = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); + StringBuilder number = new StringBuilder(); + for (int i = 0; i < 3; i++) { + int randomIndex = random.nextInt(digits.size()); + number.append(digits.get(randomIndex)); + digits.remove(randomIndex); + } + return number.toString(); + } +} diff --git a/src/main/java/baseball/Referee.java b/src/main/java/baseball/Referee.java new file mode 100644 index 00000000..1ecc0be0 --- /dev/null +++ b/src/main/java/baseball/Referee.java @@ -0,0 +1,45 @@ +package baseball; +import java.util.ArrayList; +import java.util.List; + +public class Referee { + public int[] judge(String target, String input) { + return new int[] {countStrike(convert(target), convert(input)), countBall(convert(target), convert(input))}; + } + + private List convert(String string) { + List career = new ArrayList<>(); + for(String number: string.split("")) { + career.add(Integer.parseInt(number)); + } + return career; + } + + private int countBall(List target, List input) { + int ball = 0; + if (target.get(0) == input.get(1) || target.get(0) == input.get(2)) { + ball++; + } + if (target.get(1) == input.get(0) || target.get(1) == input.get(2)) { + ball++; + } + if (target.get(2) == input.get(0) || target.get(2) == input.get(1)) { + ball++; + } + return ball; + } + + private int countStrike(List target, List input) { + int strike = 0; + if (target.get(0) == input.get(0)) { + strike ++; + } + if (target.get(1) == input.get(1)) { + strike ++; + } + if (target.get(2) == input.get(2)) { + strike ++; + } + return strike; + } +} diff --git a/src/test/java/baseball/PitcherTest.java b/src/test/java/baseball/PitcherTest.java new file mode 100644 index 00000000..fac14d88 --- /dev/null +++ b/src/test/java/baseball/PitcherTest.java @@ -0,0 +1,22 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class PitcherTest { + Pitcher pitcher; + + @BeforeEach + void setUp() { + pitcher = new Pitcher(); + } + + @Test + @DisplayName("랜덤 세자리 숫자 생성 확인") + void lengthTest() { + String number = pitcher.generateNumber(); + assertThat(3).isEqualTo(number.length()); + } +} diff --git a/src/test/java/baseball/RefereeTest.java b/src/test/java/baseball/RefereeTest.java new file mode 100644 index 00000000..f7989f73 --- /dev/null +++ b/src/test/java/baseball/RefereeTest.java @@ -0,0 +1,21 @@ +package baseball; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +public class RefereeTest { + Referee referee; + + @BeforeEach + void setUp() { + referee = new Referee(); + } + + @Test + @DisplayName("스트라이크 볼 판단 확인") + void judgeTest() { + assertThat(new int[] {2, 0}).isEqualTo(referee.judge("123", "125")); + } +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java deleted file mode 100644 index 43e47d90..00000000 --- a/src/test/java/study/StringTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package study; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class StringTest { - @Test - void replace() { - String actual = "abc".replace("b", "d"); - assertThat(actual).isEqualTo("adc"); - } -}