Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
eec36bb
docs: update GitHub PR template
woowahan-neo Mar 5, 2026
ac4041f
docs: update GitHub PR template
woowahan-neo Mar 5, 2026
549740e
docs: update GitHub PR template
woowahan-neo Mar 5, 2026
66335df
Merge branch 'woowacourse:main' into step2
Huiyeongkim Mar 12, 2026
f265b88
refactor: generateRank ๋ฉ”์„œ๋“œ๋ช…์„ generateCardBySuit๋กœ ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ
Huiyeongkim Mar 12, 2026
e11989d
refactor: y ์ƒ์ˆ˜๋กœ ๋ณ€๊ฒฝ
Huiyeongkim Mar 12, 2026
97d660e
test: Deck 52์žฅ ์ด์ƒ ์†Œ์‹  ์‹œ ์—๋Ÿฌ ํ™•์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
Huiyeongkim Mar 12, 2026
4a44d63
docs: README.md์— ๋ฒ ํŒ… ๊ธฐ๋Šฅ ์ถ”๊ฐ€
Huiyeongkim Mar 12, 2026
dce0004
feat: Money ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ ๋ฐ Player์— Money ํ•„๋“œ ์ถ”๊ฐ€
Huiyeongkim Mar 12, 2026
e1c75d8
feat: Money ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ฐ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ฑ
Huiyeongkim Mar 13, 2026
203ca3b
refactor: ๋ˆ ์ƒ์„ฑ์ž ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
Huiyeongkim Mar 13, 2026
21809b5
test: player ๋ฒ ํŒ… ์„ฑ๊ณต ์ผ€์ด์Šค ์ถ”๊ฐ€
Huiyeongkim Mar 13, 2026
b682e3e
feat: ๋ฒ ํŒ…๊ธˆ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๋ฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
Huiyeongkim Mar 14, 2026
df28a15
feat: ์ตœ์ข… ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
Huiyeongkim Mar 14, 2026
d524bbb
feat: ๋ฒ ํŒ…๊ธˆ ์ž…๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„
Huiyeongkim Mar 14, 2026
215e243
test: ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด ๋ชจ๋‘ ๋ธ”๋ž™์žญ์ธ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ๊ธฐ๋Šฅ ์ˆ˜์ •
Huiyeongkim Mar 14, 2026
680f000
docs: README.md ์™„๋ฃŒ๋œ ์‚ฌํ•ญ ์ฒดํฌ ํ‘œ์‹œ
Huiyeongkim Mar 14, 2026
efba602
refactor: money Optional๋กœ ๋ณ€๊ฒฝ
Huiyeongkim Mar 14, 2026
cb863b2
refactor: ์•ˆ ์“ฐ๋Š” import ์ œ๊ฑฐ
Huiyeongkim Mar 14, 2026
b8c8928
refactor: blackJackMultiplier ์ƒ์ˆ˜ํ™”
Huiyeongkim Mar 14, 2026
8258839
docs: README.md ์™„๋ฃŒ๋œ ์‚ฌํ•ญ ์ฒดํฌ ํ‘œ์‹œ
Huiyeongkim Mar 14, 2026
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
18 changes: 0 additions & 18 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,6 @@
- [ ] ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
- [ ] Gradle `test`๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
- [ ] ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?
- [ ] [ํ”„๋กค๋กœ๊ทธ](https://prolog.techcourse.co.kr)์— ์…€ํ”„ ์ฒดํฌ๋ฅผ ์ž‘์„ฑํ–ˆ๋‚˜์š”?
- <!-- ์ž‘์„ฑํ•œ ์…€ํ”„ ์ฒดํฌ์˜ ๋งํฌ๋ฅผ ๋‚จ๊ฒจ์ฃผ์„ธ์š”. -->


## ๊ฐ์ฒด์ง€ํ–ฅ ์ƒํ™œ์ฒด์กฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ์–ผ๋งˆ๋‚˜ ์ž˜ ์ถฉ์กฑํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

### 1~5์  ์ค‘์—์„œ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

- [ ] 1 (์ „ํ˜€ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•จ)
- [ ] 2
- [ ] 3 (๋ณดํ†ต)
- [ ] 4
- [ ] 5 (์™„๋ฒฝํ•˜๊ฒŒ ์ถฉ์กฑ)

### ์„ ํƒํ•œ ์ ์ˆ˜์˜ ์ด์œ ๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.

<!-- ์ด์œ  ์ž‘์„ฑ -->


## ์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

Expand Down
28 changes: 25 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,17 @@

# ๐Ÿƒ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก

### 1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„
### 1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ

- [x] ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์„ ์‰ผํ‘œ๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
- [x] **๊ฒ€์ฆ**: ๊ฒŒ์ž„์— ์ฐธ์—ฌํ•˜๋Š” ํ”Œ๋ ˆ์ด์–ด ์ˆ˜๊ฐ€ 5๋ช… ์ดํ•˜์ธ์ง€ ๊ฒ€์ฆํ•œ๋‹ค.
- [x] **๊ฒ€์ฆ**: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์€ 1๊ธ€์ž ์ด์ƒ 8๊ธ€์ž ์ดํ•˜์ธ์ง€ ๊ฒ€์ฆํ•œ๋‹ค.
- [x] **๊ฒ€์ฆ**: ์˜๋ฌธ์ž๋งŒ ํฌํ•จ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.
- [x] **๊ฒ€์ฆ**: ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์ด ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

- [x] ํ”Œ๋ ˆ์ด์–ด์˜ ๋ฒ ํŒ… ๊ธˆ์•ก์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค.
- [x] **๊ฒ€์ฆ**: ์ˆซ์ž์ธ์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

### 2. ์นด๋“œ ๋ฑ ์ƒ์„ฑ

- [x] 52์žฅ์˜ ์นด๋“œ ๋ฑ์„ ์ƒ์„ฑํ•œ๋‹ค.
Expand Down Expand Up @@ -58,13 +61,26 @@
- [x] ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด ๋ชจ๋‘ 21์  ์ผ ์‹œ, Blackjack ์—ฌ๋ถ€์— ๋”ฐ๋ผ ์ŠนํŒจ๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค.
- [x] ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด ๋ชจ๋‘ Blackjack์ด๋ผ๋ฉด, ๋ฌด์Šน๋ถ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

### 8. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
### 8. ๋ฒ ํŒ…๊ธˆ ๊ณ„์‚ฐ

- [x] ์นด๋“œ์˜ ํ•ฉ์ด 21 ์ดˆ๊ณผ์ธ ๊ฒฝ์šฐ ๋ฒ ํŒ… ๊ธˆ์•ก์„ ๋ชจ๋‘ ์žƒ๋Š”๋‹ค.
- [x] ๋ธ”๋ž™์žญ์ธ ๊ฒฝ์šฐ ๋ฒ ํŒ… ๊ธˆ์•ก์˜ 1.5๋ฐฐ๋ฅผ ๋”œ๋Ÿฌ์—๊ฒŒ ๋ฐ›๋Š”๋‹ค.
- [x] ์ฒ˜์Œ ๋‘ ์žฅ์˜ ์นด๋“œ ํ•ฉ์ด 21์ธ ๊ฒฝ์šฐ๋งŒ ๋ธ”๋ž™์žญ์— ํ•ด๋‹นํ•œ๋‹ค.
- [x] ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ชจ๋‘ ๋ธ”๋ž™์žญ์ธ ๊ฒฝ์šฐ ํ”Œ๋ ˆ์ด์–ด๋Š” ๋ฒ ํŒ…ํ•œ ๊ธˆ์•ก์„ ๋Œ๋ ค๋ฐ›๋Š”๋‹ค.
- [x] ํ”Œ๋ ˆ์ด์–ด๋Š” ์•„๋ž˜์˜ ๊ฒฝ์šฐ, ๋ฒ ํŒ… ๊ธˆ์•ก์„ ๋ฐ›๋Š”๋‹ค.
- [x] ๋”œ๋Ÿฌ๊ฐ€ 21์„ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ
- [x] ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์Šน๋ฆฌํ•œ ๊ฒฝ์šฐ

### 9. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
**step1**
- [x] ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ๋ชจ๋“  ์นด๋“œ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- [x] ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ตœ์ข… ์ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- [x] ๋”œ๋Ÿฌ ๊ธฐ์ค€ ์Šน / ๋ฌด / ํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.
- [x] ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด ๊ฐ๊ฐ์˜ ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

**step2**
- [x] ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ตœ์ข… ์ˆ˜์ต์„ ์ถœ๋ ฅํ•œ๋‹ค.

# ๐Ÿ“‘ Domain ๊ตฌ์กฐ ๋ฐ ์—ญํ•  ์„ค๊ณ„
**Card**
- ํ•„๋“œ
Expand All @@ -77,6 +93,11 @@
- `List<Card> hand`
- ์—ญํ• : ์ ์ˆ˜ ํ•ฉ๊ณ„ ๊ณ„์‚ฐ, ๋ฒ„์ŠคํŠธ ํŒ๋‹จ, Ace 1/11 ์ฒ˜๋ฆฌ

**Money**
- ํ•„๋“œ
- `Integer money`
- ์—ญํ•  : ๋ฒ ํŒ…๊ธˆ ๊ณ„์‚ฐ

**Deck**
- ํ•„๋“œ
- `List<Card> cards`
Expand All @@ -86,6 +107,7 @@
- `Dealer` ์™€ `Player`์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค
- ํ•„๋“œ
- `Hand hand`
- 'Money money'
- ๋ชจ๋“  ์ฐธ๊ฐ€์ž๋Š” ์นด๋“œ๋ฅผ ๋ฐ›์Œ

**Dealer**
Expand Down Expand Up @@ -121,4 +143,4 @@
- ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์“ด๋‹ค.
- ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
- 3๊ฐœ ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
- ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.
- ๋”œ๋Ÿฌ์™€ ํ”Œ๋ ˆ์ด์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.
16 changes: 12 additions & 4 deletions src/main/java/controller/BlackJackController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

import domain.card.Deck;
import domain.card.DefaultShuffleStrategy;
import domain.card.MatchResult;
import domain.participant.Dealer;
import domain.participant.Player;
import domain.participant.Players;
import domain.money.BettingResult;
import service.BlackJackService;
import view.InputView;
import view.OutputView;
Expand All @@ -27,6 +27,7 @@ public void play() {
Deck deck = new Deck(new DefaultShuffleStrategy());
Dealer dealer = new Dealer();
Players players = readUntilValidPlayers();
readUntilValidMoney(players);

BlackJackService blackJackService = new BlackJackService(deck, dealer, players);
blackJackService.initHand();
Expand All @@ -35,9 +36,9 @@ public void play() {
playRound(deck, dealer, players);
outputView.showHandsResult(dealer, players);

Map<String, MatchResult> playerResults = blackJackService.calculateResults();
outputView.showDealerResult(blackJackService.calculateDealerResult(playerResults));
outputView.showPlayerGameResult(playerResults);
Map<String, BettingResult> bettingResults = blackJackService.calculateBettingResults();
outputView.showDealerResult(blackJackService.calculateDealerResult(bettingResults));
outputView.showPlayerGameResult(bettingResults);
}

private void playRound(Deck deck, Dealer dealer, Players players) {
Expand Down Expand Up @@ -76,4 +77,11 @@ private Players readUntilValidPlayers() {
}
return new Players(players);
}

private void readUntilValidMoney(Players players) {
for (Player player : players.getPlayers()) {
int betAmount = inputView.readBettingAmount(player.getName());
player.bet(betAmount);
}
}
}
4 changes: 2 additions & 2 deletions src/main/java/domain/card/Deck.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public class Deck {

public Deck(ShuffleStrategy shuffleStrategy) {
for (Suit suit : Suit.values()) {
generateRank(suit);
generateCardBySuit(suit);
}

shuffleStrategy.shuffle(cards);
Expand All @@ -22,7 +22,7 @@ public Card drawCard() {
throw new IllegalArgumentException("๋” ์ด์ƒ ์นด๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
}

private void generateRank(Suit suit) {
private void generateCardBySuit(Suit suit) {
for (Rank rank : Rank.values()) {
cards.add(new Card(rank, suit));
}
Expand Down
35 changes: 35 additions & 0 deletions src/main/java/domain/money/BettingResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package domain.money;

import domain.card.MatchResult;

import static util.BlackJackConstant.BLACKJACK_MULTIPLIER;

public class BettingResult {

private final int earnings;

private BettingResult(int earnings) {
this.earnings = earnings;
}

public static BettingResult from(int betAmount, MatchResult matchResult, boolean isBlackJack) {
if (matchResult == MatchResult.WIN && isBlackJack) {
return new BettingResult((int) (betAmount * BLACKJACK_MULTIPLIER));

Choose a reason for hiding this comment

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

(int) (betAmount * BLACKJACK_MULTIPLIER) ๋ถ€๋ถ„์—์„œ ์—ฐ์‚ฐ ๋ฐ casting์ด ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”๋ฐ์š”,
์ด๋ถ€๋ถ„์„ ๋ณ„๋„ ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌํ•ด๋„ ์ข‹์„๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

}
if (matchResult == MatchResult.WIN) {
return new BettingResult(betAmount);
}
if (matchResult == MatchResult.LOSE) {
return new BettingResult(-betAmount);
}
return new BettingResult(0);
}

public int getEarnings() {
return earnings;
}

public int reverse() {
return -earnings;
}
}
21 changes: 21 additions & 0 deletions src/main/java/domain/money/Money.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package domain.money;

public class Money {

private final Integer money;

public Money(Integer money) {
validate(money);
this.money = money;
}

public Integer getValue() {
return money;
}

private void validate(Integer money) {
if (money < 0) {
throw new IllegalArgumentException("๋ˆ์€ ์Œ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/domain/participant/Player.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,41 @@
package domain.participant;

import domain.money.Money;

import java.util.Optional;
import java.util.regex.Pattern;

import static util.BlackJackConstant.MAX_NAME_LENGTH;

public class Player extends Participant {

private static final String STRING_REGEX = "^[a-zA-Z]*$";

private final String name;
private Optional<Money> money = Optional.empty();

Choose a reason for hiding this comment

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

์ด๋ถ€๋ถ„์„ PR ๋ณธ๋ฌธ 2๋ฒˆ์—์„œ๋„ ์ ์–ด์ฃผ์…จ๋Š”๋ฐ, ์ œ ์ƒ๊ฐ์—” ์ˆ˜์ •์ด ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์šฐ์„  ์ ์–ด์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ, money๋Š” ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์ •์˜๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฌผ๋ก  ํ•ด๋‹น ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์„œ Optional์„ ์‚ฌ์šฉํ•ด์ฃผ์‹  ๊ฒƒ์€ ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์—, Optional์€ ํŠน์ •ํ•œ ๋ฉ”์†Œ๋“œ ๋“ฑ์—์„œ ๊ฐ’ ๋ฐ˜ํ™˜์‹œ ํ•ด๋‹น๊ฐ’์ด null์ผ์ˆ˜ ์žˆ์Œ์„ ๋ช…์‹œํ•˜๋Š”๋ฐ์— ํšจ๊ณผ์ ์ด์ง€, ํด๋ž˜์Šค ๋‚ด๋ถ€ ํ•„๋“œ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ์ ˆํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. getMoney ์‹œ์ ์— money๊ฐ€ ๋น„์–ด์žˆ๋Š” ๊ฒƒ์„ ๊ฒ€์ฆํ•˜๊ณ  ์žˆ๊ธด ํ•˜์ง€๋งŒ, money๊ฐ€ nullableํ•œ ํ•„๋“œ์ธ ๊ฒƒ๊ณผ ๋น„๊ตํ•ด์„œ (๊ด€๋ฆฌ๋œ ์˜ˆ์™ธ๋ฅผ ๋ฐœํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ์™ธ์—๋Š”) ํฐ ์žฅ์ ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ๋ฏผํ•ด๋ณด์ž๋ฉด...

  • Player ์ด๋ฆ„์„ ๋ฐ›์€ ๋’ค, Player ์ƒ์„ฑ ์ „์— money ๊ฐ’์„ ๋ฐ›๊ธฐ -> ์ด ๊ฒฝ์šฐ player ์ƒ์„ฑ์‹œ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์ด ๋Šฆ๊ฒŒ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ, ๊ฒ€์ฆ ๊ด€๋ จ ์ฝ”๋“œ์˜ ์ˆ˜์ •์ด ํ•„์š”ํ•ด์ง‘๋‹ˆ๋‹ค.
  • Players ์ƒ์„ฑ ํ›„, money๋ฅผ ๋ฐ›์•„์„œ player์™€ money์˜ Map์„ ํ•„๋“œ๋กœ ๊ฐ€์ง€๋Š” ์ผ๊ธ‰์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๊ธฐ -> ์ด ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ• ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋˜์ง€๋งŒ, ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜ ๋” ๋Š˜์–ด๋‚˜์„œ ์ฝ”๋“œ์˜ ๋ณต์žก๋„๊ฐ€ ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด์™ธ์—๋„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋“ค๋„ ์žˆ์„ ๋“ฏํ•œ๋ฐ, ๊ด€๋ จํ•ด์„œ ์€์˜ค๋„ ์˜๊ฒฌ ์ ์–ด์ฃผ์‹œ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ง„ํ–‰ํ•ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. (์œ„์— ์ ํžŒ ๋ฐฉ๋ฒ• ์™ธ๋กœ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜, ํ˜น์€ ํ˜„์žฌ ๋ฐฉ์‹ ์œ ์ง€ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉํ–ฅ ๊ฒฐ์ •ํ•œ ์ด์œ ๋ฅผ ์ ์–ด์ฃผ์‹œ๋ฉด ์ฐธ๊ณ ๊ฐ€ ๋  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.)


public Player(String name) {
validateNameLength(name);
validateOnlyEnglish(name);
this.name = name;
}

public void bet(Integer money) {
if (this.money.isPresent()) {
throw new IllegalArgumentException("๋ฒ ํŒ… ๊ธˆ์•ก์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
this.money = Optional.of(new Money(money));
}

public String getName() {
return name;
}

public Money getMoney() {
return money.orElseThrow(() ->
new IllegalStateException("๋ฒ ํŒ… ๊ธˆ์•ก์ด ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค."));
}

private void validateNameLength(String name) {
if (name.isEmpty() || name.length() > MAX_NAME_LENGTH) {
throw new IllegalArgumentException("ํ”Œ๋ ˆ์ด์–ด ์ด๋ฆ„์€ 1๊ธ€์ž ์ด์ƒ 8๊ธ€์ž ์ดํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.");
Expand Down
34 changes: 29 additions & 5 deletions src/main/java/service/BlackJackService.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import domain.participant.Dealer;
import domain.participant.Player;
import domain.participant.Players;
import domain.money.BettingResult;

import java.util.EnumMap;
import java.util.LinkedHashMap;
import java.util.Map;

Expand Down Expand Up @@ -45,11 +45,30 @@ public Map<String, MatchResult> calculateResults() {
return playerResults;
}

public Map<MatchResult, Integer> calculateDealerResult(Map<String, MatchResult> playerResults) {
Map<MatchResult, Integer> dealerResult = new EnumMap<>(MatchResult.class);
public Map<String, BettingResult> calculateBettingResults() {
Map<String, MatchResult> matchResults = calculateResults();
Map<String, BettingResult> bettingResults = new LinkedHashMap<>();
Comment on lines +48 to +50

Choose a reason for hiding this comment

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

์ด๋ถ€๋ถ„์„ ์ž˜ ์ˆ˜์ •ํ•ด ์ฃผ์…จ๋„ค์š”! PR ๋ณธ๋ฌธ์—๋„ ๊ด€๋ จ๋œ ๋‚ด์šฉ ์ ์–ด์ฃผ์…”์„œ, ์ œ ์˜๊ฒฌ๋„ ๋‚จ๊ธฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์–ด๋–ค ๋ฉ”์†Œ๋“œ์˜ ๋™์ž‘ ์ˆ˜์ •์‹œ, ์˜๋„๋œ ๊ธฐ์กด ๋™์ž‘์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ด๋ถ€๋ถ„์˜ ์˜ํ–ฅ๋„๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด, ์šฐ์„  ์•„๋ž˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ ์ž‘์—…์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์„ฑ๊ณต ํ…Œ์ŠคํŠธ ์กด์žฌ (๋กœ์ง ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•ด์„œ, ์ •์ƒ๋™์ž‘ ์—ฌ๋ถ€ ํ™•์ธ)
  • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์˜ˆ์™ธ ํ…Œ์ŠคํŠธ ์กด์žฌ (๊ธฐ์กด๊ณผ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์ด ๊ฐ™์€์ง€ ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์ผ€์ด์Šค ํ™•์ธ)

๋‹ค๋งŒ ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ ๋ฐ ํŒ€ ๋‚ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์„ ํ–‰๋œ๋‹ค๋ฉด, ๊ธฐ์กด ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ ์ž์ฒด์—๋Š” ๋ฌธ์ œ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๋ง์”€์ฃผ์‹ ๋Œ€๋กœ ๊ธฐ๋Šฅ์ด ์ˆ˜์ •๋ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ธฐ์กด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ๊นŒ์š”.

๋‹ค๋งŒ ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜๋Š” ๋ช…ํ™•ํ•œ ์ž‘์€ ๋‹จ์œ„์˜ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—,
์˜ˆ๋ฅผ ๋“ค์–ด ๊ธฐ์กด ๊ธฐ๋Šฅ์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์„ ๋ณ„๋„ ๋ฉ”์†Œ๋“œ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ๊ธฐ์กด ๋ฉ”์†Œ๋“œ์—์„œ ์ƒˆ๋กœ ์šด ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•˜๋Š” ๋“ฑ์˜ ๋ฐฉ๋ฒ•์ด ๋” ๋ชจ๋ฒ”์ ์ด๊ฒ ์ง€์š”.

์ด๋ฒˆ ์ž‘์—…์—์„œ๋Š” ๋ฒ ํŒ… ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ , ์ด๋ฅผ ๊ธฐ์กด ๊ธฐ๋Šฅ + ๋ฒ ํŒ… ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ•ด๊ฒฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ข‹์€ ๋ฐฉํ–ฅ์ด๋ผ๊ณ  ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.


for (MatchResult matchResult : playerResults.values()) {
dealerResult.put(matchResult.reverse(), dealerResult.getOrDefault(matchResult.reverse(), 0) + 1);
for (Player player : players.getPlayers()) {
MatchResult matchResult = matchResults.get(player.getName());

BettingResult result = BettingResult.from(
player.getMoney().getValue(),
matchResult,
player.getHand().isBlackJack()
);
bettingResults.put(player.getName(), result);
}

return bettingResults;
}

public Integer calculateDealerResult(Map<String, BettingResult> playerResults) {
int dealerResult = 0;

for (BettingResult bettingResult : playerResults.values()) {
int reversedResult = bettingResult.reverse();
dealerResult += reversedResult;
}

return dealerResult;
Expand Down Expand Up @@ -109,6 +128,11 @@ private boolean handleBlackJack(Player player, Map<String, MatchResult> playerRe
playerResults.put(player.getName(), MatchResult.DRAW);
return true;
}
if (player.getHand().isBlackJack() && dealer.getHand().isBlackJack()) {
playerResults.put(player.getName(), MatchResult.DRAW);
return true;
}

return false;
}
}
1 change: 1 addition & 0 deletions src/main/java/util/BlackJackConstant.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class BlackJackConstant {
public static final int DEALER_HIT_LIMIT = 16;
public static final int MAX_NAME_LENGTH = 8;
public static final int MAX_PLAYER_SIZE = 5;
public static final double BLACKJACK_MULTIPLIER = 1.5;

private BlackJackConstant() {
}
Expand Down
15 changes: 14 additions & 1 deletion src/main/java/view/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class InputView {

private static final String COMMA_DELIMITER = ",";
private static final String BINARY_REGEX = "[yn]";
private static final String BINARY_Y = "y";

private final Scanner sc = new Scanner(System.in);

Expand All @@ -16,6 +17,18 @@ public List<String> readPlayers() {
return splitPlayerNames(userInput());
}

public int readBettingAmount(String name) {
while (true) {
try {
System.out.printf("%s์˜ ๋ฐฐํŒ… ๊ธˆ์•ก์€?%n", name);
String money = userInput();
return Integer.parseInt(money);
} catch (IllegalArgumentException e) {
OutputView.printErrorMessage("์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
}
}
}
Comment on lines +20 to +30

Choose a reason for hiding this comment

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

์‹ ๊ทœ ์ž…๋ ฅ ๋ถ€๋ถ„ ์ž˜ ์ž‘์„ฑํ•ด์ฃผ์‹ ๊ฒƒ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋งŒ ์ œ๊ฐ€ ํ™•์ธํ•ด๋ณด๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค.

  • Player ์ด๋ฆ„์„ ์ˆซ์ž๋‚˜ ํ•œ๊ธ€๋กœ ์ž…๋ ฅ์‹œ(์˜๋ฌธ X์ผ ๊ฒฝ์šฐ) ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
    • ๊ณต๋ฐฑ ์ž…๋ ฅ์‹œ์—๋Š” try-catch ๋ฅผ ํ†ตํ•œ ๋ฐ˜๋ณต๋ฌธ ์ •์ƒ์ž‘๋™
  • bettingMoney ์Œ์ˆ˜๋กœ ์ž…๋ ฅ์‹œ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ
    • ์˜๋ฌธ ์ž…๋ ฅ์‹œ์—๋Š” try-catch ๋ฅผ ํ†ตํ•œ ๋ฐ˜๋ณต๋ฌธ ์ •์ƒ์ž‘๋™

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, Player ๋ฐ Money ๊ฐ์ฒด์˜ ์ƒ์„ฑ์‹œ์ ์ด try-catch ๋‚ด๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Choose a reason for hiding this comment

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

์ถ”๊ฐ€๋กœ, ์ง€๊ธˆ InputView ๋‚ด์— ๊ฒ€์ฆ ๋กœ์ง์ด validate ๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ ์™ธ์—์„œ๋„ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, splitPlayerNames ๋‚ด์—์„œ name์ด ๊ณต๋ฐฑ์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ์„ , validation ๋ฉ”์†Œ๋“œ๋“ค์„ ๋ชจ๋‘ ๋ณ„๊ฐœ ๋ฉ”์†Œ๋“œ๋กœ ๋ถ„๋ฆฌํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค


๊ทธ๋ฆฌ๊ณ  ๋ฏธ์…˜ ์ง„ํ–‰์ค‘์— ์—ฌ์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ถ”๊ฐ€๋กœ ์•„๋ž˜ ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

  • InputView ๋‚ด์˜ validation ๋ฉ”์†Œ๋“œ๋“ค์„ ๋ชจ์•„ Validator ํด๋ž˜์Šค ๊ตฌํ˜„
    • name / money validation์„ ๋‹ค๋ฅธ validator์—์„œ ํ• ์ง€ ๊ฐ™์€ validator์—์„œ ํ• ์ง€๋Š” ์ž์œ 
    • Validator๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•  ๊ฒƒ. ์„ฑ๊ณตํ•˜๋Š” ์ผ€์ด์Šค์™€ ์‹คํŒจํ•˜๋Š” ์ผ€์ด์Šค(์˜ˆ์™ธ ๋ฐ ๋ฉ”์‹œ์ง€๋„ ๊ฒ€์ฆ) ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•จ
  • ํ˜„์žฌ Player ๋ฐ Money ํด๋ž˜์Šค์—์„œ validation ํ•˜๋Š” ๋กœ์ง์„ Validator๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์„์ง€, ์˜ฎ๊ฒจ๋„ ๊ดœ์ฐฎ์„์ง€ ๊ณ ๋ฏผ
    • ์ด๋ถ€๋ถ„์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ , ์€์˜ค๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ์˜ฎ๊ธฐ๋Š”๊ฒŒ ์˜ณ์€์ง€ ์•„๋‹Œ์ง€์— ๋”ฐ๋ผ ๊ฒฐ์ •ํ•ด์ฃผ์„ธ์š”. (์€์˜ค์˜ ์˜๊ฒฌ์ด ๊ถ๊ธˆํ•ด์„œ ์ถ”๊ฐ€๋กœ ์ ์–ด๋‘” ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.)


public boolean readPlayerToHitUntilValid(String name) {
while (true) {
try {
Expand All @@ -42,7 +55,7 @@ private boolean validateBinaryOption(String userInput) {
throw new IllegalArgumentException("์ž˜๋ชป๋œ ์ž…๋ ฅ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.");
}

return userInput.equals("y");
return userInput.equals(BINARY_Y);
}

private String userInput() {
Expand Down
Loading