-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBridgeGame.java
More file actions
129 lines (110 loc) · 4.05 KB
/
BridgeGame.java
File metadata and controls
129 lines (110 loc) · 4.05 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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package bridge.controller;
import bridge.BridgeMaker;
import bridge.BridgeRandomNumberGenerator;
import bridge.model.bridge.Bridge;
import bridge.model.bridge.BridgeDirection;
import bridge.model.game.GameProcessDecisionCommand;
import bridge.model.game.GameRoundStatus;
import bridge.model.game.GameTracker;
import bridge.view.InputView;
import bridge.view.OutputView;
import java.util.List;
import static bridge.model.game.GameRoundStatus.ROUND_FAIL;
import static bridge.model.game.GameRoundStatus.ROUND_SUCCESS;
import static bridge.model.game.GameStatus.GAME_CLEAR;
import static bridge.model.game.GameStatus.GAME_FAIL;
/**
* 다리 건너기 게임을 관리하는 클래스
*/
public class BridgeGame {
private Bridge bridge;
private GameTracker gameTracker;
public void run() {
try {
initializeGame();
startGame();
printGameResult();
} catch (final IllegalArgumentException e) {
OutputView.printErrorMessage(e.getMessage());
}
}
private void initializeGame() {
OutputView.printStartGame();
initializeBridge();
initalizeGameTracker();
}
private void initializeBridge() {
final BridgeMaker bridgeMaker = new BridgeMaker(new BridgeRandomNumberGenerator());
final List<String> bridgeDirections = bridgeMaker.makeBridge(InputView.readBridgeSize());
bridge = new Bridge(bridgeDirections);
}
private void initalizeGameTracker() {
gameTracker = new GameTracker();
}
private void startGame() {
while (gameTracker.isGameInProgress()) {
processEachRound();
handleGameProcess();
}
}
private void processEachRound() {
final int currentOrder = gameTracker.getCurrentOrder();
final GameRoundStatus roundStatus = moveEachRound(currentOrder);
if (roundStatus.isRoundFail()) {
gameTracker.updateGameStatus(GAME_FAIL);
return;
}
if (roundStatus.isRoundSuccess() && bridge.isEndOfBridge(currentOrder)) {
gameTracker.updateGameStatus(GAME_CLEAR);
}
}
private GameRoundStatus moveEachRound(final int currentOrder) {
final BridgeDirection bridgeDirection = bridge.getBridgeDirectionByIndex(currentOrder);
final BridgeDirection playerMoveCommand = BridgeDirection.fromCommand(InputView.readMoving());
return move(bridgeDirection, playerMoveCommand);
}
/**
* 사용자가 칸을 이동할 때 사용하는 메서드
* <p>
* 이동을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다.
*/
private GameRoundStatus move(
final BridgeDirection bridgeDirection,
final BridgeDirection playerDirection
) {
final GameRoundStatus roundStatus = judgeRoundByDirection(bridgeDirection, playerDirection);
gameTracker.updateMap(playerDirection, roundStatus);
return roundStatus;
}
private GameRoundStatus judgeRoundByDirection(
final BridgeDirection bridgeDirection,
final BridgeDirection playerDirection
) {
if (bridgeDirection == playerDirection) {
return ROUND_SUCCESS;
}
return ROUND_FAIL;
}
private void handleGameProcess() {
if (gameTracker.isGameFail()) {
handleRetryProcess();
}
}
private void handleRetryProcess() {
final GameProcessDecisionCommand decisionCommand = GameProcessDecisionCommand.from(InputView.readGameCommand());
if (decisionCommand.isRetryDecision()) {
retry();
}
}
/**
* 사용자가 게임을 다시 시도할 때 사용하는 메서드
* <p>
* 재시작을 위해 필요한 메서드의 반환 타입(return type), 인자(parameter)는 자유롭게 추가하거나 변경할 수 있다.
*/
private void retry() {
gameTracker.retryGame();
}
private void printGameResult() {
OutputView.printResult(gameTracker);
}
}