diff --git a/README.md b/README.md index 8d7e8aee..e6b011c8 100644 --- a/README.md +++ b/README.md @@ -1 +1,12 @@ -# java-baseball-precourse \ No newline at end of file +# java-baseball-precourse + +## 구현할 기능 + +### 야구 게임 기능 +- 컴퓨터가 1부터 9까지 ***서로 다른 수***로 이루어진 3자리 수를 생성하는 기능 +- 게임 종료 및 시작 기능 (1: 시작, 2: 종료) +- 스트라이크, 볼, 낫싱 구분 + +### 사용자 입력값 확인 기능 +- 야구 게임에서 세자리 숫자를 입력 했는 지 확인하는 기능 +- 게임 시작, 종료 선택에서 1 또는 2의 값을 선택했는지 확인하는 기능 \ No newline at end of file diff --git a/build.gradle b/build.gradle index 20a92c9e..a96103f3 100644 --- a/build.gradle +++ b/build.gradle @@ -23,3 +23,7 @@ dependencies { test { useJUnitPlatform() } + +tasks.withType(JavaCompile){ + options.encoding = "UTF-8" +} \ No newline at end of file diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..1bf88096 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,38 @@ +import java.util.Scanner; + +public class Application { + public static void main(String[] args) { + Scanner sc = new Scanner(System.in); + try { + int opt = 1; + while (opt == 1) { + // 난수 생성 + String answer = Computer.makeRandomNumber(); + + // 게임 실행 + Player.playBaseballGame(answer); + + // 게임 종료 + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + + // 옵션 입력 받기 + opt = getInputOption(sc); + } + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } finally { + sc.close(); + } + } + + private static int getInputOption(Scanner sc) { + String input = sc.nextLine(); + System.out.println(input); + if ("1".equals(input) || "2".equals(input)) { + return Integer.parseInt(input); + } else { + throw new IllegalArgumentException("올바르지 않은 입력입니다. 게임을 종료합니다."); + } + } +} \ No newline at end of file diff --git a/src/main/java/Computer.java b/src/main/java/Computer.java new file mode 100644 index 00000000..9b8f9cbe --- /dev/null +++ b/src/main/java/Computer.java @@ -0,0 +1,43 @@ +import java.util.Random; + +public class Computer { + // 난수 생성 메서드 + public static String makeRandomNumber() { + String answer = ""; + int[] vis = new int[10]; // 중복 확인 배열 + Random random = new Random(); + int cnt = 0; + + while (cnt < 3) { + int ranNum = random.nextInt(9) + 1; + if (vis[ranNum] == 0) { + vis[ranNum] = 1; + answer += Integer.toString(ranNum); + cnt++; + } + } + return answer; + } + + // 점수 계산 메서드 + public static int[] checkScore(char[] answerArray, char[] numberArray, int[] vis) { + int[] score = new int[2]; + int strike = 0; + int ball = 0; + + for (int i = 0; i < 3; i++) { + if (answerArray[i] == numberArray[i]) { + strike++; + continue; + } + if (vis[numberArray[i] - '0'] == 1) { + ball++; + } + } + + score[0] = strike; + score[1] = ball; + + return score; + } +} \ No newline at end of file diff --git a/src/main/java/Player.java b/src/main/java/Player.java new file mode 100644 index 00000000..d4cc1f67 --- /dev/null +++ b/src/main/java/Player.java @@ -0,0 +1,48 @@ +import java.util.Scanner; + +public class Player { + public static void playBaseballGame(String answer) { + Scanner sc = new Scanner(System.in); + + // 볼 확인을 위한 배열 생성 + int[] vis = new int[10]; + char[] answerArray = answer.toCharArray(); + for (char c : answerArray) { + vis[c - '0'] = 1; + } + + while (true) { + // 사용자 입력 받기 + System.out.print("숫자를 입력해 주세요: "); + String number = sc.nextLine(); + + // 입력값 검증 + if (number.length() != 3 || !number.matches("^\\d+$")) { + sc.close(); // 스캐너 자원 정리 + throw new IllegalArgumentException("올바르지 않은 입력입니다. 게임을 종료합니다."); + } + + char[] numberArray = number.toCharArray(); + + // 점수 계산 (스트라이크, 볼) + int[] score = Computer.checkScore(answerArray, numberArray, vis); + int strike = score[0]; + int ball = score[1]; + + // 스트라이크, 볼 결과 출력 + if (ball > 0 && strike > 0) { + System.out.println(ball + "볼 " + strike + "스트라이크"); + } else if (ball > 0) { + System.out.println(ball + "볼"); + } else if (strike > 0) { + System.out.println(strike + "스트라이크"); + } else { + System.out.println("낫싱"); + } + + if (strike == 3) { + return; + } + } + } +} \ No newline at end of file diff --git a/src/test/java/ComputerTest.java b/src/test/java/ComputerTest.java new file mode 100644 index 00000000..c53f8acc --- /dev/null +++ b/src/test/java/ComputerTest.java @@ -0,0 +1,42 @@ +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ComputerTest { + // 난수 생성 점검 + @Test + public void testMakeRandomNumber() { + String number = Computer.makeRandomNumber(); + assertTrue(number.matches("\\d{3}")); // 3자리 숫자인지 확인 + assertTrue(number.chars().distinct().count() == 3); // 중복 숫자가 없는지 확인 + } + + // 스트라이크, 볼 계산 점검 + @Test + public void testCheckScore_AllStrikes() { + char[] answer = {'1', '2', '3'}; + char[] guess = {'1', '2', '3'}; + int[] vis = {0, 1, 1, 1, 0, 0, 0 ,0, 0 ,0}; + int[] score = Computer.checkScore(answer, guess, vis); + assertArrayEquals(new int[]{3, 0}, score); // 3 스트라이크, 0 볼 + } + + @Test + public void testCheckScore_NoMatches() { + char[] answer = {'1', '2', '3'}; + char[] guess = {'4', '5', '6'}; + int[] vis = {0, 1, 1, 1, 0, 0, 0 ,0, 0 ,0}; + int[] score = Computer.checkScore(answer, guess, vis); + assertArrayEquals(new int[]{0, 0}, score); // 낫싱 + } + + @Test + public void testCheckScore_Mixed() { + char[] answer = {'1', '2', '3'}; + char[] guess = {'3', '2', '1'}; + int[] vis = {0, 1, 1, 1, 0, 0, 0 ,0, 0 ,0}; + int[] score = Computer.checkScore(answer, guess, vis); + assertArrayEquals(new int[]{1, 2}, score); // 1 스트라이크, 2 볼 + } +}