diff --git a/README.md b/README.md index fcf3f057..33d893c7 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,14 @@ ## 과제 제출 과정 * [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse) + +## 구현할 기능 목록 +* 게임을 진행할 메소드 정의 +* 변수 초기화 하기 +* 컴퓨터의 숫자 정하기 +* 컴퓨터의 숫자 카운트하기(어떤 숫자가 등장했는지) +* 숫자 입력받기 +* 결과 구하기 +* 결과 출력하기 +* 계속할지 여부 묻기 +* 테스트 코드 작성하기 \ No newline at end of file diff --git a/src/main/java/NumberBaseball.java b/src/main/java/NumberBaseball.java new file mode 100644 index 00000000..1fa298c7 --- /dev/null +++ b/src/main/java/NumberBaseball.java @@ -0,0 +1,119 @@ +import java.util.Collections; +import java.util.List; +import java.util.Scanner; +import java.util.Arrays; + +public class NumberBaseball { + final int NUMBER_COUNT = 3; + final int MAX_NUM = 9; + final int MIN_NUM = 1; + final int CONTINUE = 1; + final int END = 2; + int[] random_numbers = new int[NUMBER_COUNT]; + boolean[] random_numbers_count = new boolean[MAX_NUM + 1]; + int[] input_numbers = new int[NUMBER_COUNT]; + int strike; + int ball; + + public void initialize_parameter(){ + Arrays.fill(random_numbers, 0); + Arrays.fill(random_numbers_count, false); + Arrays.fill(input_numbers, 0); + strike = 0; + ball = 0; + } + + public void generate_random_numbers() { + Integer[] numbers = new Integer[MAX_NUM + 1]; + Arrays.setAll(numbers, i -> i + 1); + List numberList = Arrays.asList(numbers); + Collections.shuffle(numberList); + for(int i = 0; i < NUMBER_COUNT; ++i){ + random_numbers[i] = numberList.get(i); + } + } + + public void get_input_numbers() { + System.out.print("숫자를 입력해주세요 : "); + Scanner scanner = new Scanner(System.in); + String input = scanner.nextLine(); + for(int i = 0; i < NUMBER_COUNT; ++i){ + input_numbers[i] = input.charAt(i) - '0'; + } + } + + public void get_random_numbers_count() { + for(int i = 0; i < NUMBER_COUNT; ++i){ + random_numbers_count[random_numbers[i]] = true; + } + } + + public void count_strike_or_ball(int idx) { + if(random_numbers[idx] == input_numbers[idx]){ + ++strike; + return; + } + if(random_numbers_count[input_numbers[idx]]){ + ++ball; + } + } + + public void get_game_result() { + strike = 0; + ball = 0; + for(int i = 0; i < NUMBER_COUNT; ++i) { + count_strike_or_ball(i); + } + } + + public void print_game_result() { + if(strike > 0){ + System.out.print(strike + " 스트라이크 "); + } + if(ball > 0){ + System.out.print(ball + "볼"); + } + if(strike == 0 && ball == 0){ + System.out.print("낫싱"); + } + System.out.print("\n"); + } + + public boolean continue_or_end(int input){ + if (input == CONTINUE){ + return true; + } + if (input == END){ + return false; + } + return false; + } + + public boolean print_end_message(){ + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요"); + Scanner scanner = new Scanner(System.in); + int input = Integer.parseInt(scanner.nextLine()); + return continue_or_end(input); + } + + public boolean do_game() { + initialize_parameter(); + generate_random_numbers(); + get_random_numbers_count(); + while(strike != NUMBER_COUNT) { + get_input_numbers(); + get_game_result(); + print_game_result(); + } + return print_end_message(); + } + + public static void main(String[] args) { + NumberBaseball numberBaseball = new NumberBaseball(); + boolean game_continue = true; + while(game_continue){ + game_continue = numberBaseball.do_game(); + } + } +} diff --git a/src/test/java/NumberBaseballTest.java b/src/test/java/NumberBaseballTest.java new file mode 100644 index 00000000..b679c7e9 --- /dev/null +++ b/src/test/java/NumberBaseballTest.java @@ -0,0 +1,103 @@ +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static org.assertj.core.api.Assertions.assertThat; + +public class NumberBaseballTest { + NumberBaseball numberBaseball = new NumberBaseball(); + + void set_random_numbers() { + numberBaseball.random_numbers[0] = 7; + numberBaseball.random_numbers[1] = 1; + numberBaseball.random_numbers[2] = 3; + } + + void set_random_numbers_count() { + numberBaseball.random_numbers_count[1] = true; + numberBaseball.random_numbers_count[3] = true; + numberBaseball.random_numbers_count[7] = true; + } + + + void set_input_numbers_same() { + numberBaseball.input_numbers[0] = 7; + numberBaseball.input_numbers[1] = 1; + numberBaseball.input_numbers[2] = 3; + } + + @Test + void initialize_parameter_test() { + numberBaseball.initialize_parameter(); + assertThat(numberBaseball.random_numbers).containsOnly(0, 0, 0); + assertThat(numberBaseball.random_numbers_count).contains(false); + assertThat(numberBaseball.input_numbers).containsOnly(0, 0, 0); + assertThat(numberBaseball.strike).isEqualTo(0); + assertThat(numberBaseball.ball).isEqualTo(0); + } + + @ParameterizedTest + @ValueSource(ints = {0, 1, 2}) + void generate_random_numbers_test(int idx) { + numberBaseball.generate_random_numbers(); + assertThat(numberBaseball.random_numbers[idx]). + isGreaterThanOrEqualTo(numberBaseball.MIN_NUM); + assertThat(numberBaseball.random_numbers[idx]). + isLessThanOrEqualTo(numberBaseball.MAX_NUM); + } + + + @Test + void get_random_numbers_count() { + set_random_numbers(); + numberBaseball.get_random_numbers_count(); + assertThat(numberBaseball.random_numbers_count[1]).isEqualTo(true); + assertThat(numberBaseball.random_numbers_count[3]).isEqualTo(true); + assertThat(numberBaseball.random_numbers_count[7]).isEqualTo(true); + } + + @Test + void count_strike_test() { + set_random_numbers(); + set_random_numbers_count(); + numberBaseball.input_numbers[0] = 7; + numberBaseball.count_strike_or_ball(0); + assertThat(numberBaseball.strike).isEqualTo(1); + assertThat(numberBaseball.ball).isEqualTo(0); + } + + @Test + void count_ball_test() { + set_random_numbers(); + set_random_numbers_count(); + numberBaseball.input_numbers[0] = 1; + numberBaseball.count_strike_or_ball(0); + assertThat(numberBaseball.strike).isEqualTo(0); + assertThat(numberBaseball.ball).isEqualTo(1); + } + + @Test + void count_nothing_test() { + set_random_numbers(); + set_random_numbers_count(); + numberBaseball.input_numbers[0] = 2; + numberBaseball.count_strike_or_ball(0); + assertThat(numberBaseball.strike).isEqualTo(0); + assertThat(numberBaseball.ball).isEqualTo(0); + } + + @Test + void get_game_result_test() { + set_random_numbers(); + set_input_numbers_same(); + numberBaseball.get_game_result(); + assertThat(numberBaseball.strike).isEqualTo(3); + assertThat(numberBaseball.ball).isEqualTo(0); + } + + @Test + void continue_or_end_test() { + assertThat(numberBaseball.continue_or_end(1)).isEqualTo(true); + assertThat(numberBaseball.continue_or_end(2)).isEqualTo(false); + } +} diff --git a/src/test/java/study/SetTest.java b/src/test/java/study/SetTest.java new file mode 100644 index 00000000..df3f5141 --- /dev/null +++ b/src/test/java/study/SetTest.java @@ -0,0 +1,41 @@ +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; + +public class SetTest { + private Set numbers; + + @BeforeEach + void setUp() { + numbers = new HashSet<>(); + numbers.add(1); + numbers.add(2); + numbers.add(2); + numbers.add(3); + } + + @Test + void test1() { + assertThat(numbers.size()).isEqualTo(3); + } + + @ParameterizedTest + @ValueSource(ints = {1, 2, 3}) + void test2(int number) { + assertThat(numbers.contains(number)).isTrue(); + } + + @ParameterizedTest + @CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':') + void test3(String number, String expected){ + assertThat(numbers.contains(Integer.parseInt(number))).isEqualTo(expected.equals("true")); + } +} diff --git a/src/test/java/study/StringTest.java b/src/test/java/study/StringTest.java index 43e47d90..b8358669 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.assertThatIndexOutOfBoundsException; public class StringTest { @Test @@ -10,4 +12,35 @@ void replace() { String actual = "abc".replace("b", "d"); assertThat(actual).isEqualTo("adc"); } + + @Test + void test1() { + String[] split_test1 = "1,2".split(","); + assertThat(split_test1).containsExactly("1","2"); + + String[] split_test2 = "1".split(","); + assertThat(split_test2).containsExactly("1"); + } + + @Test + void test2() { + String test = "(1,2)"; + String substring_test = test.substring(1, test.length()-1); + assertThat(substring_test).isEqualTo("1,2"); + } + + @Test + void test3_1() { + String test = "abc"; + assertThat(test.charAt(1)).isEqualTo('b'); + } + + @Test + @DisplayName("Test string charAt exception") + void test3_2() { + String test = "abc"; + assertThatIndexOutOfBoundsException().isThrownBy(() ->{ + test.charAt(4); + }).withFailMessage("Index: \\d+"); + } }