From 51f5e18005186d4cd17131dcc7bc0ec7ba8cd319 Mon Sep 17 00:00:00 2001 From: wvssm Date: Mon, 6 May 2024 06:50:30 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=88=AB=EC=9E=90=20=EC=95=BC=EA=B5=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++- src/main/java/Application/BaseballGame.java | 25 ++++++++++++ src/main/java/Application/Computer.java | 44 +++++++++++++++++++++ src/main/java/Application/Player.java | 36 +++++++++++++++++ 4 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Application/BaseballGame.java create mode 100644 src/main/java/Application/Computer.java create mode 100644 src/main/java/Application/Player.java 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/src/main/java/Application/BaseballGame.java b/src/main/java/Application/BaseballGame.java new file mode 100644 index 00000000..8805fd14 --- /dev/null +++ b/src/main/java/Application/BaseballGame.java @@ -0,0 +1,25 @@ +package Application; +import java.util.Scanner; + +public class BaseballGame { + public static void main(String[] args) { + Scanner sc = new Scanner(java.lang.System.in); + int opt = 1; + + while(opt == 1){ + // 난수 생성 + String answer = Computer.makeRandomNumber(); + java.lang.System.out.println(answer); + + // 게임 실행 + Player.playBaseballGame(answer); + + // 게임 종료 + java.lang.System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + java.lang.System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + + // 옵션 입력 받기 + opt = Integer.parseInt(sc.nextLine()); + } + } +} diff --git a/src/main/java/Application/Computer.java b/src/main/java/Application/Computer.java new file mode 100644 index 00000000..a1ddfa60 --- /dev/null +++ b/src/main/java/Application/Computer.java @@ -0,0 +1,44 @@ +package Application; + +import java.util.Random; + +public class Computer { + // 난수 생성 메서드 + public static String makeRandomNumber(){ + String answer = ""; + int ran_num = 0; + int[] vis = new int[10]; // 중복 확인 + + Random random = new Random(); + + int cnt=0; + while(cnt<3){ + ran_num = random.nextInt(9)+1; + if(vis[ran_num] == 0){ + vis[ran_num] = 1; + answer += Integer.toString(ran_num); + cnt++; + } + } + return answer; + } + + // 점수 계산 메서드 + public static int[] checkScore(char [] answerArray, char [] numberArray, int [] vis){ + int [] score = new int[2]; + int strike = 0, 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; + } +} diff --git a/src/main/java/Application/Player.java b/src/main/java/Application/Player.java new file mode 100644 index 00000000..a07342f4 --- /dev/null +++ b/src/main/java/Application/Player.java @@ -0,0 +1,36 @@ +package Application; + +import java.util.Scanner; + +public class Player { + public static void playBaseballGame(String answer){ + Scanner sc = new Scanner(System.in); + + // ball 확인을 위한 배열 생성 + 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(); + 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; + } + } +} From c2ffcf65037deda46c2177a782c7b863a7810459 Mon Sep 17 00:00:00 2001 From: wvssm Date: Mon, 6 May 2024 10:40:11 +0900 Subject: [PATCH 2/4] feat(all): add the user input check feature --- src/main/java/Application.java | 39 ++++++++++++++++ src/main/java/Application/BaseballGame.java | 25 ----------- src/main/java/Application/Computer.java | 44 ------------------ src/main/java/Application/Player.java | 36 --------------- src/main/java/Computer.java | 43 ++++++++++++++++++ src/main/java/Player.java | 49 +++++++++++++++++++++ 6 files changed, 131 insertions(+), 105 deletions(-) create mode 100644 src/main/java/Application.java delete mode 100644 src/main/java/Application/BaseballGame.java delete mode 100644 src/main/java/Application/Computer.java delete mode 100644 src/main/java/Application/Player.java create mode 100644 src/main/java/Computer.java create mode 100644 src/main/java/Player.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..640d570d --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,39 @@ +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(); + System.out.println(answer); + + // 게임 실행 + 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/Application/BaseballGame.java b/src/main/java/Application/BaseballGame.java deleted file mode 100644 index 8805fd14..00000000 --- a/src/main/java/Application/BaseballGame.java +++ /dev/null @@ -1,25 +0,0 @@ -package Application; -import java.util.Scanner; - -public class BaseballGame { - public static void main(String[] args) { - Scanner sc = new Scanner(java.lang.System.in); - int opt = 1; - - while(opt == 1){ - // 난수 생성 - String answer = Computer.makeRandomNumber(); - java.lang.System.out.println(answer); - - // 게임 실행 - Player.playBaseballGame(answer); - - // 게임 종료 - java.lang.System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); - java.lang.System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - - // 옵션 입력 받기 - opt = Integer.parseInt(sc.nextLine()); - } - } -} diff --git a/src/main/java/Application/Computer.java b/src/main/java/Application/Computer.java deleted file mode 100644 index a1ddfa60..00000000 --- a/src/main/java/Application/Computer.java +++ /dev/null @@ -1,44 +0,0 @@ -package Application; - -import java.util.Random; - -public class Computer { - // 난수 생성 메서드 - public static String makeRandomNumber(){ - String answer = ""; - int ran_num = 0; - int[] vis = new int[10]; // 중복 확인 - - Random random = new Random(); - - int cnt=0; - while(cnt<3){ - ran_num = random.nextInt(9)+1; - if(vis[ran_num] == 0){ - vis[ran_num] = 1; - answer += Integer.toString(ran_num); - cnt++; - } - } - return answer; - } - - // 점수 계산 메서드 - public static int[] checkScore(char [] answerArray, char [] numberArray, int [] vis){ - int [] score = new int[2]; - int strike = 0, 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; - } -} diff --git a/src/main/java/Application/Player.java b/src/main/java/Application/Player.java deleted file mode 100644 index a07342f4..00000000 --- a/src/main/java/Application/Player.java +++ /dev/null @@ -1,36 +0,0 @@ -package Application; - -import java.util.Scanner; - -public class Player { - public static void playBaseballGame(String answer){ - Scanner sc = new Scanner(System.in); - - // ball 확인을 위한 배열 생성 - 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(); - 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; - } - } -} 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..22723f9c --- /dev/null +++ b/src/main/java/Player.java @@ -0,0 +1,49 @@ +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) { + sc.close(); // 스캐너 자원 정리 + return; + } + } + } +} \ No newline at end of file From c174636df7bad7b0edb10bae0d1bffc0b9f593ec Mon Sep 17 00:00:00 2001 From: wvssm Date: Mon, 6 May 2024 11:04:41 +0900 Subject: [PATCH 3/4] test(Computer): test Computer class's makeRandomNumber and checkScore --- src/test/java/ComputerTest.java | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/test/java/ComputerTest.java 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 볼 + } +} From 057df553a6e2630471cd48b4dd0c8e37c5b73386 Mon Sep 17 00:00:00 2001 From: wvssm Date: Mon, 6 May 2024 12:22:57 +0900 Subject: [PATCH 4/4] scanner error and UTF-8 encoding issue --- build.gradle | 4 ++++ src/main/java/Application.java | 1 - src/main/java/Player.java | 1 - 3 files changed, 4 insertions(+), 2 deletions(-) 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 index 640d570d..1bf88096 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -8,7 +8,6 @@ public static void main(String[] args) { while (opt == 1) { // 난수 생성 String answer = Computer.makeRandomNumber(); - System.out.println(answer); // 게임 실행 Player.playBaseballGame(answer); diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 22723f9c..d4cc1f67 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -41,7 +41,6 @@ public static void playBaseballGame(String answer) { } if (strike == 3) { - sc.close(); // 스캐너 자원 정리 return; } }