Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2단계 - 블랙잭 베팅] 몰리(김지민) 미션 제출합니다. #728

Merged
merged 74 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from 57 commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
937c772
docs(README.md): 추가된 요구사항에 대한 명세 작성
jminkkk Mar 13, 2024
c33f8a9
refactor(Player): 필드의 접근제한자를 private로 수정
jminkkk Mar 13, 2024
acb508f
feat(InputView): 금액 입력 시 숫자가 아닌 입력값인 경우 예외를 처리하는 로직 작성
jminkkk Mar 13, 2024
0f479e8
feat(InputView): 플레이어별 배팅 금액을 입력받는 기능 구현
jminkkk Mar 13, 2024
ded534e
feat(BettingAmount): 금액 입력 시 0 이하의 숫자인 경우 예외를 던지는 기능 구현
jminkkk Mar 13, 2024
390884d
feat(BettingPool): 플레이어가 만약 블랙잭으로 승리한 경우, 베팅 금액의 1.5배를 딜러에게 받는 기능 구현
jminkkk Mar 13, 2024
119ca9f
feat(BettingPool): 플레이어가 만약 블랙잭으로 무승부인 경우, 베팅 금액을 돌려받는 기능 구현
jminkkk Mar 13, 2024
eabc67f
feat(BettingPool): 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승…
jminkkk Mar 13, 2024
19e4c6c
refactor(BettingBoard): BettingPool을 의미를 나타낼 수 있도록 이름 변경
jminkkk Mar 13, 2024
0276cf0
feat(BettingBoard): 21을 초과한 경우 플레이어의 배팅 금액은 모두 잃는 기능 구현
jminkkk Mar 13, 2024
a43adea
style(BettingAmountTest): 테스트명을 더 자세히 수정
jminkkk Mar 13, 2024
8f60a47
test(BettingAmount): 배팅 금액의 곱을 구하는 테스트 작성
jminkkk Mar 13, 2024
b71033b
test(BettingAmount): 배팅 금액의 전체를 잃는 테스트 작성
jminkkk Mar 13, 2024
296da7e
refactor(betting/): 배팅 관련 패키지 생성 및 파일 이동
jminkkk Mar 14, 2024
9656899
refactor(BettingBoardTest): 공통 부분 @BeforeEach로 제거
jminkkk Mar 14, 2024
f54664a
docs(README.md): 베팅 금액 조건을 다시 분석
jminkkk Mar 14, 2024
722fc6a
fix(BettingBoardTest): 변경된 명세에 맞춰 결과에 따른 플레이어 금액 수정
jminkkk Mar 14, 2024
d28bd3a
refactor(Money): BettingAmount를 Money로 변경
jminkkk Mar 14, 2024
b332dc0
refactor(Money, MoneyTest): money의 책임을 변경
jminkkk Mar 14, 2024
5e593f0
test(PlayerFixture): player에 대한 테스트용 픽스처 이넘 생성
jminkkk Mar 14, 2024
5ea704a
feat(BettingAccount): 계좌에 돈을 받는 기능 구현
jminkkk Mar 14, 2024
251a10f
feat(BettingAccount): 계좌에 돈을 빼는 기능 구현
jminkkk Mar 14, 2024
3511b10
feat(BettingAccount): 특정 플레이어가 해당 배팅 계좌의 주인인지를 반환하는 기능 구현
jminkkk Mar 14, 2024
5101980
feat(BettingBoard): 배팅 목록에 해당 플레이어의 베팅 정보가 존재하지 않을 경우 예외를 던지는 기능 구현
jminkkk Mar 14, 2024
5c7a475
hotfix(README.md, betting/): 객체 도출 다시, 배팅 관련 객체, 테스트 제거
jminkkk Mar 14, 2024
388d0d7
feat(HandStatus): 카드 목록의 상태를 나타내는 HandStatus 생성 및 블랙잭인 경우 테스트
jminkkk Mar 14, 2024
3a8e53a
test(HandStatus): 카드 목록이 Bust인 경우는 총 스코어가 21을 초과한 경우임에 대한 테스트 작성
jminkkk Mar 14, 2024
aa65ec9
test(HandStatus): 카드 목록이 NotBlackJackBut21인 경우는 총 스코어가 21, 갯수가 2개 이상인…
jminkkk Mar 14, 2024
a358fe6
fix(HandStatus): 21 미만인 경우 조건 수정 및 테스트 작성
jminkkk Mar 14, 2024
2d1d6d9
refactor(Hand, HandTest): 불필요한 상태 확인 메서드 제거
jminkkk Mar 14, 2024
3c710d1
feat(Money): 돈에 대한 포장 객체 생성 및 곱셈 기능 구현
jminkkk Mar 14, 2024
8e422d6
feat(Player): 블랙잭인 경우 참을 반환하는 기능 구현
jminkkk Mar 14, 2024
b59b057
feat(BettingRule): 플레이어가 BlackJack으로 승리한 경우, 수익률인 1.5를 반환하는 기능 구현
jminkkk Mar 14, 2024
adaecfd
feat(BettingRule): 플레이어가 딜러가 버스트여서 승리한 경우, 수익률인 0를 반환하는 기능 구현
jminkkk Mar 14, 2024
06b4cb4
test(BettingRule): 플레이어가 딜러가 버스트가 아닌데도 승리한 경우, 수익률인 1를 반환하는 테스트 작성
jminkkk Mar 14, 2024
71f4b2e
refactor(BettingRuleTest): @Nest 사용하여 이긴 경우 그룹화
jminkkk Mar 14, 2024
79b6622
feat(BettingRule): 무승부인 경우 수익률이 0임을 테스트
jminkkk Mar 14, 2024
2c9064a
test(BettingRule): 플레이어가 지는 경우, -1의 수익률을 반환하는 테스트 작성
jminkkk Mar 14, 2024
b8fa92e
feat(MoneyStaff): 수익률 목록을 받아 플레이어들의 수익금을 계산하는 기능 구현
jminkkk Mar 15, 2024
75afa78
feat(MoneyStaff): 딜러의 수익을 계산하는 기능 구현
jminkkk Mar 15, 2024
043085e
refactor(HandFixture): 쉬운 테스트를 위한 카드목록 픽스처 생성
jminkkk Mar 15, 2024
834cd64
style(InputView): 출력 간격 조정
jminkkk Mar 15, 2024
a9741ff
feat(BlackJackGame): 참가자들의 수익을 계산하고 출력하는 기능 구현
jminkkk Mar 15, 2024
082ff50
feat(OutputView): 딜러, 플레이어의 수익을 출력하는 메서드 작성
jminkkk Mar 15, 2024
6a70a6a
refactor(ResultRule): 승패의 규칙을 담고 있는 Rule 클래스 이름을 ResultRule로 변경
jminkkk Mar 15, 2024
745424b
refactor(ProfitRate): 수익률을 나타내는 enum 생성
jminkkk Mar 15, 2024
d9dbe1f
fix(BettingRule): 딜러가 버스트고 플레이어가 이긴 경우의 수익률도 100%로 수정
jminkkk Mar 15, 2024
4f4adf3
refactor(MoneyStaff): 절대값을 나타내는 상수 추출
jminkkk Mar 15, 2024
7906cae
refactor(formatter/): 출력 형식을 포맷하는 객체들 생성
jminkkk Mar 15, 2024
03672a4
refactor(NameProfit): 플레이어의 이름과 수익을 감싼 dto 생성
jminkkk Mar 15, 2024
a3e6abe
refactor(Player): Hand에 상태를 물어서 hit 가능한지 확인
jminkkk Mar 15, 2024
a4828c2
refactor(formatter/): 포맷팅 클래스에 대한 테스트 작성
jminkkk Mar 15, 2024
8ba766e
fix(OutputView): 포맷팅 형식과 다른 부분들 수정
jminkkk Mar 15, 2024
156b714
test(Dealer): 딜러는 이름을 가지고 카드를 받을 수 있다는 누락된 테스트 추가
jminkkk Mar 15, 2024
d49d52c
refactor(Players, Name): 이름을 통일성 있게 수정 및 상수 추출
jminkkk Mar 15, 2024
f59d0b0
refactor(test/fixture/): Fixture 클래스를 모아둔 패키지 생성
jminkkk Mar 15, 2024
1fe2c06
refactor(Gamer): Playable 인터페이스를 추상 클래스로 변경 및 공통 부분 통일
jminkkk Mar 15, 2024
312de11
refactor(Hand, ProfitRate): 숫자값을 메서드에서 제거 및 추상적인 네이밍으로 변경
jminkkk Mar 15, 2024
aa2e804
refactor(BettingRule): enum 비교 시 == 연산자로 비교
jminkkk Mar 15, 2024
2ed0d82
refactor(MoneyStaff): Map에서 foreach 순회 시 Entry로 순회하도록 수정
jminkkk Mar 16, 2024
b780a67
refactor(Players): Players 생성 시 카드 목록이 아닌 Deck을 받도록 수정
jminkkk Mar 16, 2024
0cddc80
refactor(reader/): ConsoleReader를 util/에서 view/reader/로 이동
jminkkk Mar 16, 2024
97eb24c
refactor(BlackJackGame, OutputView): 딜러 수익 출력 시 NameProfit를 사용하여 출력하도록
jminkkk Mar 16, 2024
d6d92b9
refactor(OutputView): 불필요한 메서드 제거
jminkkk Mar 16, 2024
46d7001
refactor(NamesFormatter): 이름 목록 출력에 대한 Formatter 분리
jminkkk Mar 17, 2024
4b632f6
refactor(BettingRule): BettingRule을 싱글톤으로
jminkkk Mar 17, 2024
08405a9
refactor(ResultCommandDisplay): 요구사항 변경으로 불필요해진 클래스 삭제
jminkkk Mar 17, 2024
26cdc61
refactor(Players): Instream.range말고 일반 Stream으로 변경
jminkkk Mar 17, 2024
dd1e387
fix(BettingRuleTest): BettingRule 싱글톤으로 변경에 따른 생성자 사용 부분 변경
jminkkk Mar 17, 2024
686cbdb
refactor(Card): Card 목록을 static 블록을 통해 캐싱
jminkkk Mar 17, 2024
bfd5083
refactor(Deck): Card 목록을 생성하는 책임을 버리고 받아서 셔플만 하도록 수정
jminkkk Mar 17, 2024
18a426d
test(Card): 생성된 카드 목록의 크기 확인 테스트 위치 변경
jminkkk Mar 17, 2024
0081a9f
test(Player): 카드를 추가로 받을 수 있는지에 대해 Hand별 테스트 추가
jminkkk Mar 17, 2024
af2808d
refactor(Card, test/): Card 생성 시 생성자가 아닌 from으로 찾기
jminkkk Mar 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 85 additions & 14 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
## 기능 요구 사항

# 기능 요구 사항
## 전체 흐름
### 게임 준비
- [x] 참여할 사람의 이름을 입력받는다.
- [x] 참여할 인원의 수는 최소 1명 최대 10명이다.(딜러 제외)
- [x] 플레이어별 배팅 금액을 입력받는다.

- [x] 게임을 시작하면 플레이어는 딜러에게 두 장의 카드를 지급 받는다.
- [x] 딜러는 2장의 카드를 받고 한 장의 카드만 공개한다.

- [x] 카드를 더 받을지 선택한다.
- [x] 21이 넘지 않은 플레이어는 추가로 카드를 더 받을지 선택할 수 있다.
### 게임 진행
#### 플레이어들의 턴을 진행한다.
- [x] 플레이어가 진행가능한 상태인지 확인한다.
- [x] 21이거나 21에 초과된 경우 다음 플레이어의 턴으로 넘어간다.
- [x] 진행가능 상태(즉, 21이 넘지 않은) 플레이어는 추가로 카드를 더 받을지 선택할 수 있다.
- [x] 카드 추가 여부 확인 시마다 해당 플레이어의 카드 현황을 보여준다.
- [x] 카드를 더 받지 않으면 다음 플레이어에게 턴을 넘긴다.
- [x] 모든 플레이어가 선택을 마칠 때까지 위의 과정을 반복한다.

- [x] 딜러는 처음에 받은 2장의 합계가 16이하이면, 17이상이 넘을 때까지 카드를 추가로 받는다.
#### 딜러의 턴을 진행한다.
- [x] 스코어가 16이 초과할 때까지 카드를 계속해서 배분받는다.

### 결과 확인
- [x] 딜러와 플레이어의 카드, 결과를 공개한다.
- [x] 딜러와 각 플레이어 별로 승패를 공개한다.

### 플레이어

- [x] 플레이어는 카드를 받을 수 있다.

### 플레이어의 승리 조건
- [x] 심판으로부터 딜러와 각 플레이어 별로 승패를 얻는다.
- [ ] 총무로부터 딜러와 각 플레이어의 수익을 얻는다.
---
## 게임 정책
### 플레이어의 승리 정책

#### 딜러가 21미만인 경우

Expand All @@ -38,12 +41,47 @@

- [x] 플레이어 결과가 21이하인 경우

### 무승부 조건
#### 무승부 조건

- [x] 플레이어와 딜러 모두 블랙잭인 경우
- [x] 플레이어와 딜러의 결과, 카드 수가 모두 동일한 경우
- [x] 플레이어와 딜러 모두 21 초과인 경우

### 플레이어의 수익 정책
#### 플레이어가 이긴 경우
- [x] 플레이어가 BlackJack으로 승리한 경우, 배팅 금액의 1.5배를 준다.
- [x] 플레이어가 승리한 경우, 배팅 금액의 1배를 준다.

#### 플레이어가 무승부인 경우
- [x] 플레이어가 무승부인 경우, 배팅 금액의 0배를 준다.

#### 플레이어가 지는 경우
- [x] 플레이어가 지는 경우, 베팅 금액만큼을 잃는다.

---
## 객체 도출
### 플레이어
- [x] 플레이어는 이름, 카드 목록을 가진다.
- [x] 플레이어는 카드를 받는다.
- [x] 플레이어는 카드를 오픈할 수 있다.
- [x] 플레이어는 총 스코어가 21 이상인 경우 Hit이 불가능하다.
- [x] 플레이어의 총 스코어가 21 미만인 경우 Hit 여부를 선택할 수 있다.
- [x] 플레이어는 Hit을 선택할 경우 카드를 받는다.
- [x] 플레이어가 Hit을 선택하지 않을 경우 카드를 받지 않고 턴이 종료된다.

### 플레이어 카드 목록(Hand)

- [x] Hand는 생성 시 덱에서 2장을 받는다.
- [x] Hand는 추가로 카드를 받을 수 있다.
- [x] Hand는 총 스코어를 계산할 수 있다.
- [x] Hand의 상태에 따라 Ace는 Soft(11) 또는 Hard(1, default) 둘 중 하나로 간주된다.
- [ ] Hand는 상태는 다음과 같다.
- [x] 상태는 Bust, BlackJack, NotBlackJackBut21, Under21 일 수 있다.
- [x] Bust는 총 스코어가 21 초과인 경우이다.
- [x] BlackJack은 총 스코어가 21이면서 카드의 수가 2장인 경우이다.
- [x] NotBlackJackBut21은 총 스코어가 21이지만 카드 수가 3장 이상인 경우이다.
- [x] Under21는 총 스코어가 21 미만인 모든 경우이다.

### 카드

- [x] 전체 카드의 수는 52장이다.
Expand All @@ -56,6 +94,37 @@
- [x] Ace를 제외한 나머지 카드의 합계가 10 이하인 경우 ACE는 11점으로 계산한다.
- [x] King, Queen, Jack은 각각 10으로 계산한다.

### 딜러

- [x] 플레이어는 이름, 카드 목록을 가진다.
- [x] 플레이어는 카드를 받는다.
- [x] 플레이어는 카드를 오픈할 수 있다.
- [x] 딜러의 총 스코어가 16이 초과하기 전까지는 계속 Hit이다.

### 게임 룰

- [x] 플레이어와 딜러를 비교하여 승패를 구한다.

### 심판

- [x] 플레이어별 승패 목록을 구한다.
- [x] 딜러의 승패 내역을 구한다.

### 돈
- [x] 곱셈한 금액을 구한다.

### 수익 룰

- [x] 플레이어의 결과에 따라 수익률을 구한다.

### 총무

- [x] 플레이어 별 배팅 금액을 가지고 있는다.
- [x] 수익룰을 받아 플레이어들의 수익금을 계산한다.
- [x] 플레이어 별 수익금 목록을 생성한다.
- [x] 딜러의 수익을 계산한다.
- [x] 딜러 수익은 모든 플레이어의 수익 합 * (-1)이다.

---

## 예외처리
Expand All @@ -65,5 +134,7 @@
- [x] 이름의 수가 10개 초과인 경우성
- [x] 이름이 중복되는 경우

- [x] 금액 입력 시 숫자가 아닌 입력값인 경우

- [x] 추가 선택 입력 시 blank가 들어온 경우
- [x] 추가 선택 입력 시 y 또는 n이 아닌 경우
87 changes: 56 additions & 31 deletions src/main/java/blackjack/BlackJackGame.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package blackjack;

import blackjack.dto.NameCardsScore;
import blackjack.model.participant.Dealer;
import blackjack.dto.NameProfit;
import blackjack.model.betting.BettingRule;
import blackjack.model.betting.Money;
import blackjack.model.betting.MoneyStaff;
import blackjack.model.deck.Deck;
import blackjack.model.participant.Name;
import blackjack.model.participant.Playable;
import blackjack.model.participant.Dealer;
import blackjack.model.participant.Players;
import blackjack.model.participant.Gamer;
import blackjack.model.participant.Player;
import blackjack.model.participant.Participants;
import blackjack.model.result.Referee;
import blackjack.model.result.ResultCommand;
import blackjack.model.result.Rule;
import blackjack.model.result.ResultRule;
import blackjack.util.ConsoleReader;
import blackjack.view.InputView;
import blackjack.view.OutputView;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

Expand All @@ -21,29 +25,42 @@ public class BlackJackGame {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ConsoleReader가 util에 있네요. util에는 어떤 클래스가 들어가나요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전역적으로 사용되는 파일이 들어가야 할 거 같아요 🥲
reader는 view 에서만 사용되기 때문에 view 패키지 안에 존재하는 것이 맞을 것 같네요!
감사합니다 파랑! 🌊

public void run() {
final Deck deck = Deck.createByRandomOrder();
final Participants participants = initPlayers(InputView.readPlayerNames(consoleReader), deck);
final Dealer dealer = new Dealer(deck.distributeInitialCard());
final Referee referee = new Referee(new Rule(dealer), participants);
final Players players = initPlayers(InputView.readPlayerNames(consoleReader), deck);
final Referee referee = new Referee(new ResultRule(dealer), players);
final MoneyStaff moneyStaff = initMoneyStaff(new BettingRule(), players);

announceInitialCards(dealer, participants);
play(dealer, participants.getPlayers(), deck);
announceResult(dealer, participants, referee);
announceInitialCards(dealer, players);
play(dealer, players, deck);
Map<Player, ResultCommand> nameResults = announceResult(dealer, players, referee);
announceProfitMoney(dealer, moneyStaff, nameResults);
}

private Participants initPlayers(final List<String> names, final Deck deck) {
return Participants.of(names, deck.distributeInitialCard(names.size()));
private Players initPlayers(final List<String> names, final Deck deck) {
return Players.of(names, deck.distributeInitialCard(names.size()));
}

private MoneyStaff initMoneyStaff(final BettingRule bettingRule, final Players players) {
Map<Player, Money> playerBettingMoneys = new LinkedHashMap<>();
for (Player player : players.getPlayers()) {
Money bettingAmount = new Money(InputView.readBettingAmount(player.getName(), consoleReader));
playerBettingMoneys.put(player, bettingAmount);
}

return new MoneyStaff(bettingRule, playerBettingMoneys);
}

private void announceInitialCards(final Dealer dealer, final Participants participants) {
OutputView.printDistributionSubject(participants.getNames());

private void announceInitialCards(final Dealer dealer, final Players players) {
OutputView.printDistributionSubject(players.getNames());
OutputView.printNameAndCards(dealer.getName(), dealer.openCard());
participants.collectCardsOfEachPlayer()
players.collectCardsOfEachPlayer()
.forEach(OutputView::printNameAndCards);
OutputView.println();
}

private void play(final Dealer dealer, final List<Player> players, final Deck deck) {
players.forEach(player -> playPlayerTurn(player, deck));
private void play(final Dealer dealer, final Players players, final Deck deck) {
players.getPlayers().forEach(player -> playPlayerTurn(player, deck));
playDealerTurn(dealer, deck);
}

Expand All @@ -69,33 +86,41 @@ private void playDealerTurn(final Dealer dealer, final Deck deck) {
}
}

private void distributeNewCard(final Playable playable, final Deck deck) {
playable.receiveCard(deck.distribute());
private void distributeNewCard(final Gamer gamer, final Deck deck) {
gamer.receiveCard(deck.distribute());
}

private void announceResult(final Dealer dealer, final Participants participants, final Referee referee) {
printFinalCardsAndScores(dealer, participants);
printFinalResultCommand(referee);
private Map<Player, ResultCommand> announceResult(final Dealer dealer, final Players players,
final Referee referee) {
printFinalCardsAndScores(dealer, players);
return referee.judgePlayerResult();
}

private void printFinalCardsAndScores(final Dealer dealer, final Participants participants) {
private void printFinalCardsAndScores(final Dealer dealer, final Players players) {
OutputView.println();
NameCardsScore dealerNameCardsScore = new NameCardsScore(dealer.getName(), dealer.openCards(),
dealer.getScore());
OutputView.printFinalCardsAndScore(dealerNameCardsScore);
OutputView.printFinalCardsAndScore(collectFinalResults(participants));
OutputView.printFinalCardsAndScore(collectFinalResults(players));
}

private List<NameCardsScore> collectFinalResults(final Participants participants) {
return participants.getPlayers().stream()
private List<NameCardsScore> collectFinalResults(final Players players) {
return players.getPlayers().stream()
.map(player -> new NameCardsScore(player.getName(), player.openCards(), player.getScore()))
.toList();
}

private void printFinalResultCommand(final Referee referee) {
Map<ResultCommand, Integer> dealerResults = referee.judgeDealerResult();
OutputView.printDealerFinalResult(dealerResults);
Map<Name, ResultCommand> playerResults = referee.judgePlayerResult();
OutputView.printFinalResult(playerResults);
private void announceProfitMoney(final Dealer dealer, final MoneyStaff moneyStaff, Map<Player, ResultCommand> playerResults) {
final Map<Player, Money> playerAndBettingMoney = moneyStaff.calculateProfitMoneys(playerResults);
final Money dealerProfit = moneyStaff.calculateDealerProfitAmount(
playerAndBettingMoney.values().stream().toList());
OutputView.printDealerProfit(dealer.getName(), dealerProfit);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dealer도 NameProfit을 사용할 수 있겠네요

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 그렇게 하면 따로 printDealerProfit를 선언하지 않아도 될 것 같네요 감사합니다!!

OutputView.printPlayerProfit(collectNameProfit(playerAndBettingMoney));
}

private List<NameProfit> collectNameProfit(final Map<Player, Money> playerAndBettingMoney) {
return playerAndBettingMoney.keySet().stream()
.map(player -> new NameProfit(player.getName(), playerAndBettingMoney.get(player)))
.toList();
}
}
11 changes: 11 additions & 0 deletions src/main/java/blackjack/dto/NameProfit.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package blackjack.dto;

import blackjack.model.betting.Money;
import blackjack.model.participant.Name;
import blackjack.model.participant.Player;

public record NameProfit(Name name, Money profit) {
public static NameProfit of(final Player player, final Money money) {
return new NameProfit(player.getName(), money);
}
}
37 changes: 37 additions & 0 deletions src/main/java/blackjack/model/betting/BettingRule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package blackjack.model.betting;

import static blackjack.model.betting.ProfitRate.MINUS_100_PERCENT;
import static blackjack.model.betting.ProfitRate.PLUS_100_PERCENT;
import static blackjack.model.betting.ProfitRate.PLUS_150_PERCENT;
import static blackjack.model.betting.ProfitRate.ZERO;
import static blackjack.model.result.ResultCommand.DRAW;
import static blackjack.model.result.ResultCommand.WIN;

import blackjack.model.participant.Player;
import blackjack.model.result.ResultCommand;

public class BettingRule {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BettingRule은 매번 생성되어야 하는 클래스인가요?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BettingRule이 상태를 가지지 않고 불변이기 때문에 매번 생성하는 것보단, 싱글톤으로 만드는 게 불필요한 객체 생성을 줄일 수 있을 것 같아요!
감사합니다 파랑 🐬


public ProfitRate calculateProfitRate(final Player player, final ResultCommand resultCommand) {
if (resultCommand.equals(WIN)) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enum은 ==로도 비교 가능합니다~

return calculateProfitRateWhenPlayerWin(player);
}

return calculateProfitRateWhenPlayerNotWin(resultCommand);
}

private ProfitRate calculateProfitRateWhenPlayerWin(final Player player) {
if (player.isBlackJack()) {
return PLUS_150_PERCENT;
}

return PLUS_100_PERCENT;
}

private ProfitRate calculateProfitRateWhenPlayerNotWin(final ResultCommand resultCommand) {
if (resultCommand.equals(DRAW)) {
return ZERO;
}
return MINUS_100_PERCENT;
}
}
36 changes: 36 additions & 0 deletions src/main/java/blackjack/model/betting/Money.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package blackjack.model.betting;

import java.util.Objects;

public class Money {
private final int value;

public Money(final int value) {
this.value = value;
}

public Money multiple(final ProfitRate rate) {
return new Money((int) (value * rate.getRate()));
}

public int getValue() {
return value;
}

@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Money money = (Money) o;
return value == money.value;
}

@Override
public int hashCode() {
return Objects.hash(value);
}
}
Loading