diff --git a/README.md b/README.md index fcf3f057..856914fb 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,14 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 구현할 기능 목록 +- [X] 게임을 시작하면 1에서 9까지 서로 다른 임의의 수 3개가 생성된다. +- [X] 사용자에게 3개의 숫자를 입력 받는다. +- [X] 입력한 숫자와 임의의 숫자를 비교하여 결과를 출력한다. + - 숫자와 위치가 일치하는 경우: 스트라이크 + - 숫자는 일치하지만 위치가 일치하지 않는 경우: 볼 + - 스트라이크, 볼에 해당하는 숫자가 없는 경우: 낫싱 + - 컴퓨터가 선택한 3개의 숫자와 사용자가 입력한 3개의 숫자가 일치하면 게임이 종료된다. +- [X] 게임이 종료된 후 1을 입력하면 게임을 다시 시작할 수 있다. +- [X] 게임이 종료된 후 2를 입력하면 프로그램을 완전히 종료할 수 있다. diff --git a/src/main/java/Baseball.java b/src/main/java/Baseball.java new file mode 100644 index 00000000..2bea2502 --- /dev/null +++ b/src/main/java/Baseball.java @@ -0,0 +1,65 @@ +import java.util.LinkedHashSet; +import java.util.Random; +import java.util.Scanner; +import java.util.Set; + +public class Baseball { + + private static Set numbers = new LinkedHashSet<>(); + private static Set numbers2 = new LinkedHashSet<>(); + + public static void main(String[] args) { + while (true){ + create3Number(); + playGame(); + int choice = endOrRestart(); + + if (choice == 1) continue; + if (choice == 2) break; + } + } + + public static void playGame() { + String result = ""; + + while (!result.equals("3개의 숫자를 모두 맞히셨습니다! 게임 종료")){ + insert3Number(); + result = Result.getResult(numbers, numbers2); + System.out.println(result); + } + } + + /* 게임을 시작하면 1에서 9까지 서로 다른 임의의 수 3개가 생성된다. */ + public static void create3Number() { + numbers.clear(); + Random random = new Random(); + + while (numbers.size() < 3) { + numbers.add(random.nextInt(9) + 1); + } + } + + public static void insert3Number() { + numbers2.clear(); + Scanner sc = new Scanner(System.in); + System.out.print("숫자를 입력해주세요 : "); + String number = sc.nextLine(); + + stringToSet(number); + } + + public static void stringToSet(String number) { + for (int i = 0; i < number.length(); i++) + { + numbers2.add(number.charAt(i) - '0'); + } + } + + public static int endOrRestart() { + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + Scanner sc = new Scanner(System.in); + int choice = sc.nextInt(); + + return choice; + } +} diff --git a/src/main/java/CountBallStrike.java b/src/main/java/CountBallStrike.java new file mode 100644 index 00000000..13ff6b78 --- /dev/null +++ b/src/main/java/CountBallStrike.java @@ -0,0 +1,23 @@ +import java.util.Set; + +public class CountBallStrike { + public static int countBall(Set numbers, Set numbers2) { + int ball = 0; + + for (Integer number : numbers) { + if (numbers2.contains(number)) ball++; + } + return ball; + } + + public static int countStrike(Integer[] nums, Integer[] nums2) { + int strike = 0; + + for (int i = 0; i < 3; i++) { + if (nums[i] == nums2[i]) { + strike++; + } + } + return strike; + } +} diff --git a/src/main/java/Result.java b/src/main/java/Result.java new file mode 100644 index 00000000..60729c7a --- /dev/null +++ b/src/main/java/Result.java @@ -0,0 +1,25 @@ +import java.util.Set; + +public class Result { + + public static String getResult(Set numbers, Set numbers2) { + int ball = CountBallStrike.countBall(numbers, numbers2); + int strike = CountBallStrike.countStrike(numbers.toArray(new Integer[0]), numbers2.toArray(new Integer[0])); + ball = ball - strike; + + if (strike == 3) { + return "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + } + return getStringResult(ball, strike); + } + + public static String getStringResult(int ball, int strike) { + if (strike > 0 && ball > 0 ) return strike + "스트라이크 " + ball + "볼"; + + if (strike > 0) return strike + "스트라이크"; + + if (ball > 0) return ball + "볼"; + + return "낫싱"; + } +} diff --git a/src/test/java/BaseballTest.java b/src/test/java/BaseballTest.java new file mode 100644 index 00000000..aca2762e --- /dev/null +++ b/src/test/java/BaseballTest.java @@ -0,0 +1,71 @@ +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashSet; +import java.util.Random; +import java.util.Scanner; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; + +class BaseballTest { + + private Set numbers = new LinkedHashSet<>(); + private Set numbers2 = new LinkedHashSet<>(); + + void init() { + numbers = new LinkedHashSet<>(); + numbers2 = new LinkedHashSet<>(); + } + @BeforeEach + void setUp() { + init(); + numbers.add(1); + numbers.add(2); + numbers.add(3); + + numbers2.add(3); + numbers2.add(2); + numbers2.add(1); + } + + @Test + @DisplayName("게임을 시작하면 1에서 9까지 서로 다른 임의의 수 3개가 생성된다.") + void create3Number() { + numbers.clear(); + Random random = new Random(); + + while (numbers.size() < 3) { + numbers.add(random.nextInt(9) + 1); + } + + assertThat(numbers.size()).isEqualTo(3); + } + + @Test + @DisplayName("사용자에게 3개의 숫자를 입력 받는다.") + void insert3Number() { + numbers2.clear(); + Scanner sc = TestUtil.getScanner("123"); + String number = sc.nextLine(); + + stringToSet(number); + + assertThat(numbers2.size()).isEqualTo(3); + } + + void stringToSet(String number) { + for (int i = 0; i < number.length(); i++) + { + numbers2.add(number.charAt(i) - '0'); + } + } + + @Test + @DisplayName("입력한 숫자와 임의의 숫자를 비교한다.") + void getResult() { + String result = Result.getResult(numbers, numbers2); + assertThat(result).isEqualTo("1스트라이크 2볼"); + } +} \ No newline at end of file diff --git a/src/test/java/TestUtil.java b/src/test/java/TestUtil.java new file mode 100644 index 00000000..0d3ab8fb --- /dev/null +++ b/src/test/java/TestUtil.java @@ -0,0 +1,13 @@ +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Scanner; + +public class TestUtil { + + public static Scanner getScanner(String input) { + InputStream in = new ByteArrayInputStream(input.getBytes()); + + return new Scanner(in); + } + +} diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java new file mode 100644 index 00000000..3253dd18 --- /dev/null +++ b/src/test/java/study/SetTest.java @@ -0,0 +1,44 @@ +package study; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.HashSet; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class SetTest { + private Set numbers; + + @BeforeEach + void setUp() { + numbers = new HashSet<>(); + numbers.add(1); + numbers.add(2); + numbers.add(3); + } + + @Test + void size() { + int setSize = numbers.size(); + assertThat(setSize).isEqualTo(3); + } + + @ParameterizedTest + @ValueSource(ints = {1,2,3}) + void contains(int number) { + assertThat(numbers.contains(number)).isTrue(); + } + + @ParameterizedTest + @CsvSource(value = {"1:True","2:True","3:True","4:False","5:False"}, delimiterString = ":") + void contains2(int number, boolean result) { + assertEquals(numbers.contains(number), result); + } + +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java index 43e47d90..14a9e68b 100644 --- a/src/test/java/study/StringTest.java +++ b/src/test/java/study/StringTest.java @@ -1,8 +1,10 @@ package study; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class StringTest { @Test @@ -10,4 +12,24 @@ void replace() { String actual = "abc".replace("b", "d"); assertThat(actual).isEqualTo("adc"); } + + @Test + void split() { + String [] actual = "1,2".split(","); + assertThat(actual).containsExactly("1", "2"); + } + + @Test + void substring() { + String actual = "(1,2)".substring(1, 4); + assertThat(actual).isEqualTo("1,2"); + } + + @Test + @DisplayName("StringIndexOutOfBoundsException 테스트") + void charAt() { + assertThatThrownBy(() -> "abc".charAt(3)) + .isInstanceOf(StringIndexOutOfBoundsException.class) + .hasMessageContaining("Index 3 out of bounds for length 3"); + } }