-
Notifications
You must be signed in to change notification settings - Fork 829
Expand file tree
/
Copy pathRacingCarGame.java
More file actions
93 lines (78 loc) · 2.86 KB
/
Copy pathRacingCarGame.java
File metadata and controls
93 lines (78 loc) · 2.86 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
84
85
86
87
88
89
90
91
92
93
package racingcar;
import camp.nextstep.edu.missionutils.Console;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class RacingCarGame {
Map<String, Integer> carMap = new HashMap<>();
public Map<String, Integer> getCarMap() {
return carMap;
}
public void play() {
readCarNames();
int numOfGames = receiceNumOfGames();
System.out.println("\n실행결과");
for (int i = 0; i < numOfGames; i++) {
playOneRound();
}
announceWinners();
}
public void playOneRound() {
for (Map.Entry<String, Integer> entry : carMap.entrySet()) {
int numOfDice = Randoms.pickNumberInRange(0, 9);
moveForward(entry.getKey(), numOfDice);
System.out.println(entry.getKey() + " : " + "-".repeat(carMap.get(entry.getKey())));
}
System.out.println("\n");
}
private void moveForward(String carName, int numOfDice) {
if (numOfDice >= 4) {
carMap.put(carName, carMap.get(carName) + 1);
}
}
public void readCarNames() {
System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)");
String input = Console.readLine();
String[] carNames = input.split(",");
for (String carName : carNames) {
validateCarName(carName);
carMap.put(carName, 0);
}
}
private void validateCarName(String carName) {
if (carName.length() > 5) {
throw new IllegalArgumentException("자동차 이름은 5자 이하만 가능합니다.");
}
}
public int receiceNumOfGames() {
System.out.println("시도할 횟수는 몇 회인가요?");
String numOfGames = Console.readLine();
return validateNumOfGames(numOfGames);
}
private int validateNumOfGames(String numOfGames) {
try {
return Integer.parseInt(numOfGames);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("정수가 아닌 값을 입력했습니다.");
}
}
private List<String> calculateWinners() {
if (carMap.isEmpty()) return Collections.emptyList();
int max = carMap.values().stream().mapToInt(Integer::intValue).max().orElse(0);
return carMap.entrySet().stream()
.filter(e -> e.getValue() == max)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}
public String getWinnersLine() {
List<String> winners = calculateWinners();
return "최종 우승자 : " + String.join(", ", winners);
}
public void announceWinners() {
System.out.println();
System.out.println(getWinnersLine());
}
}