diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..0841f79933 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -2,6 +2,7 @@ public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + Game game = new Game(); + game.gameStart(); } } diff --git a/src/main/java/baseball/Game.java b/src/main/java/baseball/Game.java new file mode 100644 index 0000000000..e773423429 --- /dev/null +++ b/src/main/java/baseball/Game.java @@ -0,0 +1,105 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Console; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class Game { + private static final int DIGITS = 3; + private static final String StartMessage= "숫자 야구 게임을 시작합니다."; + private static final String rePlayNum = "1"; + private static final String ball = "볼 "; + private static final String strike = "스트라이크 "; + private static final String nothing = "낫싱"; + private static final String Clear = "3개의 숫자를 모두 맞히셨습니다! 게임 종료"; + private static final String rePlayQ = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."; + + private boolean exitFlag = false; + private List computer = new ArrayList<>(); + private List player = new ArrayList<>(); + Number number = new Number(); + + public void gameStart() { + System.out.println(StartMessage); + computer = number.getRandomNumbers(); + while (!exitFlag) { + player = number.getInputNumber(); + printHint(computer, player); + } + } + + private void rePlayMessage() { + String input = ReplayOrNot(); + if (input.equals(rePlayNum)) { + computer = number.getRandomNumbers(); + return; + } + exitFlag = true; + } + + private String ReplayOrNot() { + System.out.println(rePlayQ); + String input = Console.readLine(); + if (!RightAnswer(input)) { + throw new IllegalArgumentException(); + } + return input; + } + + private boolean RightAnswer(String input) { + Pattern pattern = Pattern.compile("[1-2]"); + return pattern.matcher(input).matches(); + } + + private void printHint(List answer, List input) { + int strike = countStrike(answer, input); + int ball = countBall(answer, input); + + System.out.println(getHint(strike, ball)); + if (strike == DIGITS) { + System.out.println(Clear); + rePlayMessage(); + } + } + + private String getHint(int strike, int ball) { + StringBuilder sb = new StringBuilder(); + if (strike != 0) { + if (ball != 0) { + sb.append(ball).append(ball).append(strike).append(strike).append("\n"); + return sb.toString(); + } + sb.append(strike).append(strike); + return sb.toString(); + } + if (ball != 0) { + sb.append(ball).append(ball); + return sb.toString(); + } + sb.append(nothing); + return sb.toString(); + } + + private int countStrike(List answer, List input) { + int count = 0; + for (int idx = 0; idx < answer.size(); idx++) { + if (answer.get(idx).equals(input.get(idx))) { + count++; + } + } + return count; + } + + private int countBall(List answer, List input) { + int count = 0; + for (int idx = 0; idx < answer.size(); idx++) { + if (!answer.get(idx).equals(input.get(idx)) && input.contains(answer.get(idx))) { + count++; + } + } + return count; + } + +} diff --git a/src/main/java/baseball/Number.java b/src/main/java/baseball/Number.java new file mode 100644 index 0000000000..b1d1517e95 --- /dev/null +++ b/src/main/java/baseball/Number.java @@ -0,0 +1,65 @@ +package baseball; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +public class Number { + private static final int NumberCount = 3; + + public List getRandomNumbers() { + Set NumberSet = new HashSet<>(); + while (NumberSet.size() < NumberCount) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + NumberSet.add(randomNumber); + } + return new ArrayList<>(NumberSet); + } + + public List getInputNumber() { + System.out.print("숫자를 입력해주세요 : "); + String input = Console.readLine(); + if (!isValidString(input)) { + throw new IllegalArgumentException(); + } + return stringToList(input); + } + + private List stringToList(String str) { + return Arrays.stream(str.split("")).map(Integer::parseInt).collect(Collectors.toCollection(ArrayList::new)); + } + + private boolean isValidString(String input) { + if (!isNotDuplicate(input) || !isNumber(input) || !isThreeDigits(input)) { + return false; + } + return true; + } + + private boolean isThreeDigits(String input) { + if (input.length() != NumberCount) { + return false; + } + return true; + } + + private boolean isNumber(String str) { + String pattern = "^[0-9]*$"; + return Pattern.matches(pattern, str); + } + + private boolean isNotDuplicate(String str) { + Set set = new HashSet<>(); + for (char num : str.toCharArray()) { + set.add(num); + } + return set.size() == str.length(); + } +}