diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000..5008ddfcf5 Binary files /dev/null and b/.DS_Store differ diff --git a/docs/README.md b/docs/README.md index e69de29bb2..5cc24ace0d 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,51 @@ +## πŸ“Œ ꡬ쑰 +- computer +- player +- game +- baseball_number +- end_number +- answer + + +## πŸ“Œ μ‹œλ‚˜λ¦¬μ˜€ +1. 숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•œλ‹€. +2. ν”Œλ ˆμ΄μ–΄κ°€ 컴퓨터에 숫자λ₯Ό μž…λ ₯ν•œλ‹€. +3. 컴퓨터가 μž…λ ₯ν•œ μˆ«μžμ— λŒ€ν•œ κ²°κ³Όλ₯Ό ν”Œλ ˆμ΄μ–΄μ—κ²Œ 보여쀀닀. +4. 컴퓨터가 κ²Œμž„ μ’…λ£Œ μ—¬λΆ€λ₯Ό λ¬»λŠ”λ‹€. + 4-a. κ²Œμž„μ„ μ’…λ£Œν•œλ‹€. + 4-b. κ²Œμž„μ„ μž¬μ‹œμž‘ν•œλ‹€. + +### μ—λŸ¬ λ°œμƒ +2a. ν”Œλ ˆμ΄μ–΄ μˆ«μžκ°€ μ•„λ‹Œ λ‹€λ₯Έ 값을 μž…λ ₯ν•œλ‹€. +2b. ν”Œλ ˆμ΄μ–΄ 숫자λ₯Ό μž…λ ₯ν•˜μ§€λ§Œ, 3μžλ¦¬κ°€ μ•„λ‹Œκ°’μ„ μž…λ ₯ν•œλ‹€. +2c. ν”Œλ ˆμ΄μ–΄ μ€‘λ³΅λœ 숫자λ₯Ό μž…λ ₯ν•œλ‹€. + +4a. ν”Œλ ˆμ΄μ–΄ μˆ«μžκ°€ μ•„λ‹Œ λ‹€λ₯Έ 값을 μž…λ ₯ν•œλ‹€. +4b. ν”Œλ ˆμ΄μ–΄ 숫자λ₯Ό μž…λ ₯ν•˜μ§€λ§Œ, 1μžλ¦¬κ°€ μ•„λ‹Œκ°’μ„ μž…λ ₯ν•œλ‹€. + +--- + +## πŸ€”κΈ°λŠ₯ +1. player(view) +- [ ] 숫자λ₯Ό μž…λ ₯ν•˜λΌ +- [ ] κ²Œμž„μ’…λ£Œ μ—¬λΆ€λ₯Ό 말해라 + +2. game +- [ ] κ²Œμž„μ„ μ‹œμž‘ν•΄λΌ +- [ ] κ²Œμž„μ„ μ’…λ£Œν•˜λΌ +- [ ] ν”Œλ ˆμ΄μ–΄μ˜ μž…λ ₯에 λŒ€ν•œ κ²°κ³Όλ₯Ό μ œκ³΅ν•΄λΌ + +3. computer +- [ ] μ •λ‹΅ 숫자λ₯Ό λ§Œλ“€μ–΄λΌ +- [ ] ν”Œλ ˆμ΄μ–΄μ˜ μž…λ ₯에 λŒ€ν•œ κ²°κ³Όλ₯Ό μ œκ³΅ν•΄λΌ + +4. baseball_number +- [ ] 숫자λ₯Ό κ²€μ¦ν•˜λΌ + +5. answer +- [ ] baseball_numberλ₯Ό κ³„μ‚°ν•˜λΌ +- [ ] 좜λ ₯ν•  λ¬Έμžμ—΄μ„ λ§Œλ“€μ–΄λΌ + +6. end_number +- [ ] 숫자λ₯Ό κ²€μ¦ν•˜λΌ +- [ ] game을 μ’…λ£Œν• μ§€ κ²°μ •ν•˜λΌ \ No newline at end of file diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..b9712012c4 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,15 @@ package baseball; +import baseball.game.Game; + public class Application { public static void main(String[] args) { // TODO: ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ + boolean end = false; + do { + Game game = new Game(); + game.start(); + end = game.end(); + } while (!end); } -} +} \ No newline at end of file diff --git a/src/main/java/baseball/domain/Answer.java b/src/main/java/baseball/domain/Answer.java new file mode 100644 index 0000000000..3081663a26 --- /dev/null +++ b/src/main/java/baseball/domain/Answer.java @@ -0,0 +1,48 @@ +package baseball.domain; + +import java.util.List; +import java.util.stream.IntStream; + +public class Answer { + private enum AnswerStatus {RIGHT, WRONG} + + private AnswerStatus status = AnswerStatus.WRONG; + private final Long strike; + private final Long ball; + + public Answer(List answerNumbers, List playerNumbers) { + strike = countStrike(answerNumbers, playerNumbers); + ball = countContain(answerNumbers, playerNumbers) - strike; + if (Long.valueOf(BaseballNumber.BASEBALL_LENGTH).equals(strike)) { + this.status = AnswerStatus.RIGHT; + } + } + + private Long countContain(List answerNumbers, List playerNumbers) { + return answerNumbers.stream().filter(playerNumbers::contains).count(); + } + + private Long countStrike(List answerNumbers, List playerNumbers) { + return IntStream.range(0, BaseballNumber.BASEBALL_LENGTH) + .filter(i -> answerNumbers.get(i).equals(playerNumbers.get(i))) + .count(); + } + + public boolean isStatusWRONG() { + return status.equals(AnswerStatus.WRONG); + } + + public String getString() { + String statement = ""; + if (ball > 0) { + statement = statement.concat(String.format("%dλ³Ό ", ball)); + } + if (strike > 0) { + statement = statement.concat(String.format("%d슀트라이크", strike)); + } + if (statement.isEmpty()) { + statement = statement.concat("λ‚«μ‹±"); + } + return statement; + } +} diff --git a/src/main/java/baseball/domain/BaseballNumber.java b/src/main/java/baseball/domain/BaseballNumber.java new file mode 100644 index 0000000000..98a4c5a680 --- /dev/null +++ b/src/main/java/baseball/domain/BaseballNumber.java @@ -0,0 +1,47 @@ +package baseball.domain; + + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class BaseballNumber { + public static final Integer BASEBALL_LENGTH = 3; + private final String REGEXP_PATTERN_INTEGER = String.format("[1-9]{%d}", BASEBALL_LENGTH); + private final List numbers; + + public BaseballNumber(String input) { + validate(input); + this.numbers = Stream.of(input.split("")).mapToInt(Integer::parseInt).boxed().toList(); + } + + private void validate(String input) { + isCorrectLength(input); + isInteger(input); + isDuplicate(input); + } + + private void isCorrectLength(String input) { + if (input.length() != BASEBALL_LENGTH) { + throw new IllegalArgumentException("μž…λ ₯의 길이가 μ•Œλ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€."); + } + } + + private void isInteger(String input) { + if (!Pattern.matches(REGEXP_PATTERN_INTEGER, input)) { + throw new IllegalArgumentException("μž…λ ₯이 μ •μˆ˜λ‘œ 이루어지지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€."); + } + } + + private void isDuplicate(String input) { + if (Stream.of(input.split("")).collect(Collectors.toSet()).size() < BASEBALL_LENGTH) { + throw new IllegalArgumentException("μž…λ ₯ 쀑 쀑볡이 μžˆμŠ΅λ‹ˆλ‹€."); + } + } + + public List getNumbers() { + return new ArrayList<>(this.numbers); + } +} \ No newline at end of file diff --git a/src/main/java/baseball/domain/Computer.java b/src/main/java/baseball/domain/Computer.java new file mode 100644 index 0000000000..184a735a7f --- /dev/null +++ b/src/main/java/baseball/domain/Computer.java @@ -0,0 +1,29 @@ +package baseball.domain; + +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class Computer { + private List answerNumbers; + + public Computer() { + this.answerNumbers = makeRandomNumbers(); + } + + private List makeRandomNumbers() { + List numbers = new ArrayList<>(); + while (numbers.size() < BaseballNumber.BASEBALL_LENGTH) { + int randomNumber = Randoms.pickNumberInRange(1, 9); + if (!numbers.contains(randomNumber)) { + numbers.add(randomNumber); + } + } + return numbers; + } + + public Answer calculate(BaseballNumber baseballNumber) { + List playerNumbers = baseballNumber.getNumbers(); + return new Answer(answerNumbers, playerNumbers); + } +} diff --git a/src/main/java/baseball/domain/EndNumber.java b/src/main/java/baseball/domain/EndNumber.java new file mode 100644 index 0000000000..2c1d670a43 --- /dev/null +++ b/src/main/java/baseball/domain/EndNumber.java @@ -0,0 +1,35 @@ +package baseball.domain; + +import java.util.regex.Pattern; + +public class EndNumber { + public static final Integer END_LENGTH = 1; + private final String REGEXP_PATTERN_FORMAT = String.format("[1-2]{%d}", END_LENGTH); + private final Integer number; + + public EndNumber(String input) { + validate(input); + this.number = Integer.parseInt(input); + } + + private void validate(String input) { + isCorrectLength(input); + isCorrectNumber(input); + } + + private void isCorrectLength(String input) { + if (input.length() != END_LENGTH) { + throw new IllegalArgumentException("μž…λ ₯의 길이가 μ•Œλ§žμ§€ μ•ŠμŠ΅λ‹ˆλ‹€."); + } + } + + private void isCorrectNumber(String input) { + if (!Pattern.matches(REGEXP_PATTERN_FORMAT, input)) { + throw new IllegalArgumentException("μž…λ ₯값이 ν˜•μ‹μ„ λ§Œμ‘±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."); + } + } + + public boolean isEnd() { + return this.number == 2; + } +} diff --git a/src/main/java/baseball/game/Game.java b/src/main/java/baseball/game/Game.java new file mode 100644 index 0000000000..28b1138159 --- /dev/null +++ b/src/main/java/baseball/game/Game.java @@ -0,0 +1,30 @@ +package baseball.game; + +import baseball.domain.Answer; +import baseball.domain.BaseballNumber; +import baseball.domain.Computer; +import baseball.domain.EndNumber; +import baseball.view.View; + +public class Game { + private Computer computer; + + public Game() { + this.computer = new Computer(); + } + + public void start() { + View.init(); + Answer answer; + do { + BaseballNumber baseballNumber = new BaseballNumber(View.input()); + answer = computer.calculate(baseballNumber); + View.showAnswer(answer.getString()); + } while (answer.isStatusWRONG()); + } + + public boolean end() { + EndNumber endNumber = new EndNumber(View.showEnd()); + return endNumber.isEnd(); + } +} diff --git a/src/main/java/baseball/view/View.java b/src/main/java/baseball/view/View.java new file mode 100644 index 0000000000..86cd4eb449 --- /dev/null +++ b/src/main/java/baseball/view/View.java @@ -0,0 +1,25 @@ +package baseball.view; + +import camp.nextstep.edu.missionutils.Console; + +public class View { + + public static void init() { + System.out.println("숫자 야ꡬ κ²Œμž„μ„ μ‹œμž‘ν•©λ‹ˆλ‹€."); + } + + public static String input() { + System.out.println("숫자λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš” : "); + return Console.readLine(); + } + + public static void showAnswer(String statement) { + System.out.println(statement); + } + + public static String showEnd() { + System.out.println("3개의 숫자λ₯Ό λͺ¨λ‘ λ§žνžˆμ…¨μŠ΅λ‹ˆλ‹€! κ²Œμž„ μ’…λ£Œ"); + System.out.println("κ²Œμž„μ„ μƒˆλ‘œ μ‹œμž‘ν•˜λ €λ©΄ 1, μ’…λ£Œν•˜λ €λ©΄ 2λ₯Ό μž…λ ₯ν•˜μ„Έμš”."); + return Console.readLine(); + } +}