-
Notifications
You must be signed in to change notification settings - Fork 174
Expand file tree
/
Copy pathBaseballController.java
More file actions
83 lines (71 loc) · 2.28 KB
/
BaseballController.java
File metadata and controls
83 lines (71 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package baseball.controller;
import baseball.model.*;
import baseball.view.InputView;
import baseball.view.OutputView;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class BaseballController {
private final InputView inputView;
private final OutputView outputView;
private final NumberGenerator numberGenerator;
public BaseballController() {
this.inputView = new InputView();
this.outputView = new OutputView();
this.numberGenerator = new NumberGenerator();
}
public void run() {
outputView.printStartMessage();
do {
playGame();
} while (shouldRestart());
}
private void playGame() {
BaseballNumbers computerNumbers = new BaseballNumbers(numberGenerator.createRandomNumbers());
boolean isGameWon = false;
while (!isGameWon) {
isGameWon = playTurn(computerNumbers);
}
}
private boolean playTurn(BaseballNumbers computerNumbers) {
try {
BaseballNumbers playerNumbers = parseInput(inputView.readNumbers());
GameResult result = computerNumbers.compare(playerNumbers);
outputView.printResult(result);
return checkWin(result);
} catch (IllegalArgumentException e) {
outputView.printErrorMessage(e.getMessage());
return false;
}
}
private boolean checkWin(GameResult result) {
if (result.getStrikes() == 3) {
outputView.printGameEnd();
return true;
}
return false;
}
private BaseballNumbers parseInput(String input) {
if (input.length() != 3 || !input.matches("^[1-9]+$")) {
throw new IllegalArgumentException("1~9 사이의 숫자 3개를 입력해야 합니다.");
}
List<Integer> numbers = Arrays.stream(input.split(""))
.map(Integer::parseInt)
.collect(Collectors.toList());
if (numbers.stream().distinct().count() != 3) {
throw new IllegalArgumentException("중복된 숫자는 입력할 수 없습니다.");
}
return new BaseballNumbers(numbers);
}
private boolean shouldRestart() {
try {
String command = inputView.readRestartCommand();
if (command.equals("1")) return true;
if (command.equals("2")) return false;
throw new IllegalArgumentException("1 또는 2만 입력 가능합니다.");
} catch (IllegalArgumentException e) {
outputView.printErrorMessage(e.getMessage());
return shouldRestart(); // 올바른 입력이 올 때까지 재귀 호출
}
}
}