forked from woowacourse/java-blackjack
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBlackJackGameMachine.java
80 lines (66 loc) · 2.58 KB
/
BlackJackGameMachine.java
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
package domain.blackjack;
import static domain.card.CardName.TEN;
import domain.card.Card;
import domain.card.CardDrawCondition;
import domain.card.CardSelectStrategy;
import domain.card.Deck;
import java.util.List;
class BlackJackGameMachine {
private static final int INITIAL_CARD_COUNT = 2;
private final HoldingCards holdingCards;
BlackJackGameMachine(HoldingCards holdingCards) {
this.holdingCards = holdingCards;
}
DrawResult draw(Deck deck, CardSelectStrategy cardSelectStrategy, CardDrawCondition cardDrawCondition) {
if (canDraw(deck, cardDrawCondition)) {
return DrawResult.fail();
}
try {
Card draw = deck.draw(cardSelectStrategy);
holdingCards.add(draw);
return DrawResult.success(!isBust());
} catch (IllegalArgumentException e) {
return DrawResult.fail(e, !isBust());
}
}
private boolean canDraw(Deck deck, CardDrawCondition cardDrawCondition) {
return isBust() || !cardDrawCondition.canDraw() || deck.isEmpty();
}
List<Card> getRawHoldingCards(CardShowStrategy cardShowStrategy) {
List<Card> allCards = holdingCards.getHoldingCards();
return List.copyOf(cardShowStrategy.show(allCards));
}
int calculateSummationCardPointAsInt() {
return calculateSummationCardPoint().summationCardPoint();
}
SummationCardPoint calculateSummationCardPoint() {
SummationCardPoint summationCardPoint = holdingCards.calculateTotalPoint();
if (hasAceInHoldingCards()) {
int rawPoint = fixPoint(summationCardPoint.summationCardPoint());
return new SummationCardPoint(rawPoint);
}
return summationCardPoint;
}
private boolean hasAceInHoldingCards() {
return holdingCards.hasAce();
}
private int fixPoint(int rawPoint) {
SummationCardPoint fixPoint = new SummationCardPoint(rawPoint + TEN.getCardNumber());
if (fixPoint.isDeadPoint()) {
return rawPoint;
}
return fixPoint.summationCardPoint();
}
boolean isBust() {
return calculateSummationCardPoint().isDeadPoint();
}
boolean isBlackJack() {
List<Card> rawHoldingCards = getRawHoldingCards();
int holdingCardCount = rawHoldingCards.size();
SummationCardPoint summationCardPoint = calculateSummationCardPoint();
return holdingCardCount == INITIAL_CARD_COUNT && summationCardPoint.isBlackJackPoint();
}
List<Card> getRawHoldingCards() {
return List.copyOf(holdingCards.getHoldingCards());
}
}