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..a52d199674 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,59 @@ 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) { - // TODO: 프로그램 구현 + boolean playAgain = true; + + View.PrintGameStart(); + + while (playAgain) { + //난수 생성 + List computerNumbers = CreateRandomNum.ComputerRandomNumbers(); + boolean gameWon = true; + + //사용자 입력 및 게임 실행 + while (gameWon) { + String userInput = View.readUserNumbers(); + + InputValidator.validate(userInput); + + List userNumbers = Conversion.convertToIntegerList(userInput); // 입력값 -> 정수 + Result result = CountNums.getResult(computerNumbers, userNumbers); // strike, ball 계산 + + if (result.isAllStrike()) { // result.isAllStrike() + System.out.println("3스트라이크"); + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + gameWon = false; + } else if (!result.isNothing()) { + System.out.printf("%d볼 %d스트라이크\n", result.balls, result.strikes); + } else { + System.out.println("낫싱"); + } + } + + // 게임 재시작 여부 + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String restart = Console.readLine(); // 1 또는 2 입력 + + if (restart.equals("1")) { + playAgain = true; + } else if (restart.equals("2")) { + playAgain = false; + } else { + System.out.println("잘못된 값을 입력하셨습니다. 게임을 종료합니다."); + throw new IllegalArgumentException(); + } + } + + View.PrintGameEnd(); + Console.close(); } + } 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/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/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/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; + } +} 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("게임을 종료합니다."); + } +}