From e8bd818545c379232839270251cb5c854988763d Mon Sep 17 00:00:00 2001 From: JONGTAE02 Date: Sun, 26 Jan 2025 14:27:23 +0900 Subject: [PATCH 1/3] =?UTF-8?q?1=EC=B0=A8=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 +- src/main/java/baseball/Application.java | 130 +++++++++++++++++++++++- src/main/java/result/ResultMain.java | 13 +++ 3 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 src/main/java/result/ResultMain.java diff --git a/build.gradle b/build.gradle index 080ed8c12e..8aeff2c1f8 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ version '1.0-SNAPSHOT' repositories { mavenCentral() - maven { url 'https://jitpack.io' } + maven { url 'https://jitpack.io/' } } dependencies { @@ -22,4 +22,4 @@ java { test { useJUnitPlatform() -} +} \ No newline at end of file diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..65ad46bb44 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,135 @@ package baseball; +import java.util.*; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + + Scanner scanner = new Scanner(System.in); + boolean playAgain = true; + + System.out.println("숫자 야구 게임을 시작합니다."); + + while (playAgain) { + //난수 생성 + List pc = Application.ComputerRandomNumbers(); + boolean gameWon = true; + + //사용자 입력 및 게임 실행 + while (gameWon) { + System.out.print("숫자를 입력해주세요 : "); + String userInput = scanner.nextLine(); //숫자 입력 + + // IllegalArgumentException + if (!Application.ValidInput(userInput)) { + System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다."); + throw new IllegalArgumentException(); + } + + List user = convertToIntegerList(userInput); // 입력값 -> 정수 + Result result = getResult(pc, user); // strike, ball 계산 + + if (result.strikes == 3) { + System.out.println("3스트라이크"); + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + gameWon = false; + } else if (result.strikes > 0 || result.balls > 0) { + System.out.printf("%d볼 %d스트라이크\n", result.balls, result.strikes); + } else { + System.out.println("낫싱"); + } + } + + // 게임 재시작 여부 + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String restart = scanner.nextLine(); // 1 또는 2 입력 + + if (restart.equals("1")) { + playAgain = true; + } else if (restart.equals("2")) { + playAgain = false; + } else { + System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다."); + throw new IllegalArgumentException(); + } + } + + System.out.println("게임을 종료합니다."); + scanner.close(); + } + + private static List ComputerRandomNumbers() { + Random random = new Random(); + Set numbers = new LinkedHashSet<>(); + + while (numbers.size() < 3) { + numbers.add(random.nextInt(9) + 1); // 1부터 9까지의 랜덤 3개 숫자 + } + + return new ArrayList<>(numbers); + } + + // 사용자 입력값 유효성 (IllegalArgumentException) + private static boolean ValidInput(String input) { + if (input.length() != 3) return false; + + Set unique = new HashSet<>(); + + + // 중복된 숫자를 확인하기 위해 숫자를 저장할 공간 생성 + Set uniqueNumbers = new HashSet<>(); + + // 입력값의 각 문자를 하나씩 확인 + for (int i = 0; i < input.length(); i++) { + char ch = input.charAt(i); // 입력값에서 한 글자 가져오기 + + //숫자가 아닌 경우 + if (!Character.isDigit(ch) || ch == '0') { + return false; + } + + uniqueNumbers.add(ch); + } + return uniqueNumbers.size() == 3; + } + + // 문자열 입력값을 정수 리스트로 변환 + private static List convertToIntegerList(String input) { + List numbers = new ArrayList<>(); + for (char ch : input.toCharArray()) { + numbers.add(Character.getNumericValue(ch)); + } + return numbers; + } + + // 결과를 계산하기 (볼과 스트라이크) + private static Result getResult(List computerNumbers, List userNumbers) { + int strikes = 0; + int balls = 0; + + for (int i = 0; i < 3; i++) { + if (computerNumbers.get(i).equals(userNumbers.get(i))) { + strikes++; + } else if (computerNumbers.contains(userNumbers.get(i))) { + balls++; + } + } + + return new Result(strikes, balls); + } + + // 결과 클래스 + private static class Result { + int strikes; + int balls; + + Result(int strikes, int balls) { + this.strikes = strikes; + this.balls = balls; + } } } + + + + diff --git a/src/main/java/result/ResultMain.java b/src/main/java/result/ResultMain.java new file mode 100644 index 0000000000..865440eb13 --- /dev/null +++ b/src/main/java/result/ResultMain.java @@ -0,0 +1,13 @@ +package result; + +public class ResultMain { + private static class Result { + int strikes; + int balls; + + Result(int strikes, int balls) { + this.strikes = strikes; + this.balls = balls; + } + } +} From 41e2b0c877a1e94caa44b13fe3d703d4d467e9e9 Mon Sep 17 00:00:00 2001 From: JONGTAE02 Date: Sun, 26 Jan 2025 16:52:42 +0900 Subject: [PATCH 2/3] =?UTF-8?q?1=EC=B0=A8=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/Application.java | 108 +++------------------ src/main/java/baseball/rule/CountNums.java | 22 +++++ src/main/java/baseball/rule/Result.java | 19 ++++ 3 files changed, 57 insertions(+), 92 deletions(-) create mode 100644 src/main/java/baseball/rule/CountNums.java create mode 100644 src/main/java/baseball/rule/Result.java diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index 65ad46bb44..a52d199674 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,39 +1,37 @@ package baseball; +import baseball.rule.CountNums; +import baseball.rule.CreateRandomNum; +import baseball.rule.*; +import camp.nextstep.edu.missionutils.Console; + import java.util.*; public class Application { public static void main(String[] args) { - - Scanner scanner = new Scanner(System.in); boolean playAgain = true; - System.out.println("숫자 야구 게임을 시작합니다."); + View.PrintGameStart(); while (playAgain) { //난수 생성 - List pc = Application.ComputerRandomNumbers(); + List computerNumbers = CreateRandomNum.ComputerRandomNumbers(); boolean gameWon = true; //사용자 입력 및 게임 실행 while (gameWon) { - System.out.print("숫자를 입력해주세요 : "); - String userInput = scanner.nextLine(); //숫자 입력 + String userInput = View.readUserNumbers(); - // IllegalArgumentException - if (!Application.ValidInput(userInput)) { - System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다."); - throw new IllegalArgumentException(); - } + InputValidator.validate(userInput); - List user = convertToIntegerList(userInput); // 입력값 -> 정수 - Result result = getResult(pc, user); // strike, ball 계산 + List userNumbers = Conversion.convertToIntegerList(userInput); // 입력값 -> 정수 + Result result = CountNums.getResult(computerNumbers, userNumbers); // strike, ball 계산 - if (result.strikes == 3) { + if (result.isAllStrike()) { // result.isAllStrike() System.out.println("3스트라이크"); System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); gameWon = false; - } else if (result.strikes > 0 || result.balls > 0) { + } else if (!result.isNothing()) { System.out.printf("%d볼 %d스트라이크\n", result.balls, result.strikes); } else { System.out.println("낫싱"); @@ -42,7 +40,7 @@ public static void main(String[] args) { // 게임 재시작 여부 System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); - String restart = scanner.nextLine(); // 1 또는 2 입력 + String restart = Console.readLine(); // 1 또는 2 입력 if (restart.equals("1")) { playAgain = true; @@ -54,82 +52,8 @@ public static void main(String[] args) { } } - System.out.println("게임을 종료합니다."); - scanner.close(); - } - - private static List ComputerRandomNumbers() { - Random random = new Random(); - Set numbers = new LinkedHashSet<>(); - - while (numbers.size() < 3) { - numbers.add(random.nextInt(9) + 1); // 1부터 9까지의 랜덤 3개 숫자 - } - - return new ArrayList<>(numbers); - } - - // 사용자 입력값 유효성 (IllegalArgumentException) - private static boolean ValidInput(String input) { - if (input.length() != 3) return false; - - Set unique = new HashSet<>(); - - - // 중복된 숫자를 확인하기 위해 숫자를 저장할 공간 생성 - Set uniqueNumbers = new HashSet<>(); - - // 입력값의 각 문자를 하나씩 확인 - for (int i = 0; i < input.length(); i++) { - char ch = input.charAt(i); // 입력값에서 한 글자 가져오기 - - //숫자가 아닌 경우 - if (!Character.isDigit(ch) || ch == '0') { - return false; - } - - uniqueNumbers.add(ch); - } - return uniqueNumbers.size() == 3; - } - - // 문자열 입력값을 정수 리스트로 변환 - private static List convertToIntegerList(String input) { - List numbers = new ArrayList<>(); - for (char ch : input.toCharArray()) { - numbers.add(Character.getNumericValue(ch)); - } - return numbers; + View.PrintGameEnd(); + Console.close(); } - // 결과를 계산하기 (볼과 스트라이크) - private static Result getResult(List computerNumbers, List userNumbers) { - int strikes = 0; - int balls = 0; - - for (int i = 0; i < 3; i++) { - if (computerNumbers.get(i).equals(userNumbers.get(i))) { - strikes++; - } else if (computerNumbers.contains(userNumbers.get(i))) { - balls++; - } - } - - return new Result(strikes, balls); - } - - // 결과 클래스 - private static class Result { - int strikes; - int balls; - - Result(int strikes, int balls) { - this.strikes = strikes; - this.balls = balls; - } - } } - - - - diff --git a/src/main/java/baseball/rule/CountNums.java b/src/main/java/baseball/rule/CountNums.java new file mode 100644 index 0000000000..dcb2741561 --- /dev/null +++ b/src/main/java/baseball/rule/CountNums.java @@ -0,0 +1,22 @@ +package baseball.rule; + +import java.util.List; + +public abstract class CountNums { + + public static Result getResult(List computerNumbers, List userNumbers) { + int strikes = 0; + int balls = 0; + + for (int i = 0; i < 3; i++) { + if (computerNumbers.get(i).equals(userNumbers.get(i))) { + strikes++; + } else if (computerNumbers.contains(userNumbers.get(i))) { + balls++; + } + } + + return new Result(strikes, balls); + } + } + diff --git a/src/main/java/baseball/rule/Result.java b/src/main/java/baseball/rule/Result.java new file mode 100644 index 0000000000..5c5b47d4f8 --- /dev/null +++ b/src/main/java/baseball/rule/Result.java @@ -0,0 +1,19 @@ +package baseball.rule; + +public class Result { + public int strikes; + public int balls; + + public Result(int strikes, int balls) { + this.strikes = strikes; + this.balls = balls; + } + + public boolean isAllStrike() { + return strikes == 3; + } + + public boolean isNothing() { + return strikes == 0 && balls == 0; + } +} From 493870b3b534291efed59e6ea79f8b307758272f Mon Sep 17 00:00:00 2001 From: JONGTAE02 Date: Sun, 26 Jan 2025 16:53:36 +0900 Subject: [PATCH 3/3] =?UTF-8?q?2=EC=B0=A8=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/baseball/rule/Conversion.java | 15 ++++++++ .../java/baseball/rule/CreateRandomNum.java | 18 ++++++++++ .../java/baseball/rule/InputValidator.java | 34 +++++++++++++++++++ src/main/java/baseball/rule/View.java | 19 +++++++++++ src/main/java/result/ResultMain.java | 13 ------- 5 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 src/main/java/baseball/rule/Conversion.java create mode 100644 src/main/java/baseball/rule/CreateRandomNum.java create mode 100644 src/main/java/baseball/rule/InputValidator.java create mode 100644 src/main/java/baseball/rule/View.java delete mode 100644 src/main/java/result/ResultMain.java diff --git a/src/main/java/baseball/rule/Conversion.java b/src/main/java/baseball/rule/Conversion.java new file mode 100644 index 0000000000..28c5f6453b --- /dev/null +++ b/src/main/java/baseball/rule/Conversion.java @@ -0,0 +1,15 @@ +package baseball.rule; + +import java.util.ArrayList; +import java.util.List; + +public class Conversion { + + public static List convertToIntegerList(String input) { + List numbers = new ArrayList<>(); + for (char ch : input.toCharArray()) { + numbers.add(Character.getNumericValue(ch)); + } + return numbers; + } +} diff --git a/src/main/java/baseball/rule/CreateRandomNum.java b/src/main/java/baseball/rule/CreateRandomNum.java new file mode 100644 index 0000000000..706523b3b8 --- /dev/null +++ b/src/main/java/baseball/rule/CreateRandomNum.java @@ -0,0 +1,18 @@ +package baseball.rule; + +import java.util.*; + +public class CreateRandomNum { + // 난수 생성 + public static List ComputerRandomNumbers() { + Random random = new Random(); + Set numbers = new HashSet<>(); + + while (numbers.size() < 3) { + numbers.add(random.nextInt(9) + 1); // 1부터 9까지의 랜덤 3개 숫자 + } + + return new ArrayList<>(numbers); + + } +} diff --git a/src/main/java/baseball/rule/InputValidator.java b/src/main/java/baseball/rule/InputValidator.java new file mode 100644 index 0000000000..dd80e68f51 --- /dev/null +++ b/src/main/java/baseball/rule/InputValidator.java @@ -0,0 +1,34 @@ +package baseball.rule; + +import java.util.HashSet; +import java.util.Set; + +public class InputValidator { + public static void validate(String userInput) { + // IllegalArgumentException + if (!ValidInput(userInput)) { + System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다."); + throw new IllegalArgumentException(); + } + } + + // 사용자 입력값 유효성 (IllegalArgumentException) + private static boolean ValidInput(String input) { + if (input.length() != 3) return false; + + Set unique = new HashSet<>(); + // 중복된 숫자를 확인하기 위해 숫자를 저장할 공간 생성 + Set uniqueNumbers = new HashSet<>(); + // 입력값의 각 문자를 하나씩 확인 + for (int i = 0; i < input.length(); i++) { + char ch = input.charAt(i); // 입력값에서 한 글자 가져오기 + + //숫자가 아닌 경우 + if (!Character.isDigit(ch) || ch == '0') { + return false; + } + uniqueNumbers.add(ch); + } + return uniqueNumbers.size() == 3; + } +} diff --git a/src/main/java/baseball/rule/View.java b/src/main/java/baseball/rule/View.java new file mode 100644 index 0000000000..7ce515c194 --- /dev/null +++ b/src/main/java/baseball/rule/View.java @@ -0,0 +1,19 @@ +package baseball.rule; + +import camp.nextstep.edu.missionutils.Console; + +public class View { + public static String readUserNumbers() { + System.out.print("숫자 3개 입력하세요: "); + + return Console.readLine(); + } + + public static void PrintGameStart(){ + System.out.println("숫자 야구 게임을 시작합니다."); + } + + public static void PrintGameEnd(){ + System.out.println("게임을 종료합니다."); + } +} diff --git a/src/main/java/result/ResultMain.java b/src/main/java/result/ResultMain.java deleted file mode 100644 index 865440eb13..0000000000 --- a/src/main/java/result/ResultMain.java +++ /dev/null @@ -1,13 +0,0 @@ -package result; - -public class ResultMain { - private static class Result { - int strikes; - int balls; - - Result(int strikes, int balls) { - this.strikes = strikes; - this.balls = balls; - } - } -}