Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
14 commits
Select commit Hold shift + click to select a range
7057aa3
refactor: νŽ˜ν‚€μ§€ ꡬ쑰 κ°œμ„ 
korogoo Mar 14, 2026
9df0049
test: game 둜직 검증
korogoo Mar 14, 2026
01ffed4
refactor: ν”Œλ ˆμ΄μ–΄ 이름 ν˜•μ‹ 및 쀑볡 관리 μ±…μž„ 뢄리
korogoo Mar 15, 2026
6d630a6
feat: ν”Œλ ˆμ΄μ–΄ λ°°νŒ… κΈˆμ•‘ μ΄ˆκΈ°ν™”
korogoo Mar 15, 2026
229c032
feat: ν”Œλ ˆμ΄μ–΄ λ°°νŒ… κΈˆμ•‘ μ΄ˆκΈ°γ…
korogoo Mar 15, 2026
4bb6d59
feat: κ²Œμž„ 결과에 λ”°λ₯Έ 수읡λ₯  계산
korogoo Mar 15, 2026
fbce9f1
feat: μ°Έκ°€μž 수읡 κΈˆμ•‘ 좜λ ₯
korogoo Mar 15, 2026
7ddd7d8
feat: λΈ”λž™μž­ κ²Œμž„ μ΄ˆκΈ°ν™” μ±…μž„ 뢄리
korogoo Mar 15, 2026
6b91e04
refactor: ν•œμ€„μ— 점 λ‘κ°œ 이상인 경우 제거
korogoo Mar 15, 2026
1cbff94
refactor: μ˜€λ²„μ—”μ§€λ‹ˆμ–΄λ§ μ „λž΅νŒ¨ν„΄ 제거
korogoo Mar 15, 2026
3dd27b1
refactor: ν”Œλ ˆμ΄μ–΄ 객체 μƒνƒœ λ³€ν™˜μ€ game λ‚΄λΆ€λ‘œ 이동
korogoo Mar 15, 2026
5f49636
fix: μŠ€μ½”μ–΄ 좜λ ₯ μˆœμ„œ μˆ˜μ •
korogoo Mar 15, 2026
848bcad
docs: config νŒ¨ν‚€μ§€ μ‚­μ œ & νŒ¨ν‚€μ§€/객체 κ°œμš” μ—…λ°μ΄νŠΈ
korogoo Mar 15, 2026
a066640
fix: λΆˆν•„μš”ν•œ μ˜€λ²„λΌμ΄λ“œ 제거
korogoo Mar 15, 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
99 changes: 58 additions & 41 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,14 @@ Java 기반으둜 **객체지ν–₯ 섀계λ₯Ό μ μš©ν•œ λΈ”λž™μž­ κ²Œμž„**을 ꡬ

---

## Step2 μ˜ˆμ • κΈ°λŠ₯
## 사이클2 μΆ”κ°€ κΈ°λŠ₯

- ν”Œλ ˆμ΄μ–΄ **λ°°νŒ… κΈˆμ•‘ μ„€μ •**
- **Blackjack (21)** λ°œμƒ μ‹œ **1.5λ°° μ§€κΈ‰**
- **λ¬΄μŠΉλΆ€ μ‹œ λ°°νŒ… κΈˆμ•‘ λ°˜ν™˜**
- [x] ν”Œλ ˆμ΄μ–΄ **λ°°νŒ… κΈˆμ•‘ μ„€μ •**
- [x] ν”Œλ ˆμ΄μ–΄ λΈ”λž™μž­ μ—¬λΆ€ 확인
- [x] 결과에 λ”°λ₯Έ 수읡금 계산
- [x] λ”œλŸ¬, ν”Œλ ˆμ΄μ–΄ λͺ¨λ‘ λΈ”λž™μž­ μ‹œ λ¬΄μŠΉλΆ€
- [x] **λ¬΄μŠΉλΆ€ μ‹œ λ°°νŒ… κΈˆμ•‘ λ°˜ν™˜**
- [x] ν”Œλ ˆμ΄μ–΄ **Blackjack (21)** λ°œμƒ μ‹œ μˆ˜μ•‘ **1.5λ°° μ§€κΈ‰**

---

Expand All @@ -33,27 +36,30 @@ Java 기반으둜 **객체지ν–₯ 섀계λ₯Ό μ μš©ν•œ λΈ”λž™μž­ κ²Œμž„**을 ꡬ
```

blackjack
β”œβ”€β”€ config
β”œβ”€β”€ core
β”œβ”€β”€ domain
β”‚ β”œβ”€β”€ card
β”‚ β”œβ”€β”€ participant
β”‚ β”œβ”€β”€ score
β”‚ └── result
β”‚ β”œβ”€β”€ game
β”‚ └── participants
β”œβ”€β”€ dto
└── view
β”œβ”€β”€ view
β”œβ”€β”€ bootstrap
└── application


```

### μ—­ν• 

| νŒ¨ν‚€μ§€ | μ—­ν•  |
|---|---|
| config | 객체 생성 및 μ„€μ • |
| core | κ²Œμž„ 흐름 μ œμ–΄ |
| domain | 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 |
| dto | View μ „λ‹¬μš© 데이터 |
| view | μ‚¬μš©μž μž…μΆœλ ₯ |
| νŒ¨ν‚€μ§€ | μ—­ν•  |
|---------------------| ------------------------------ |
| application | ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 흐름을 μ œμ–΄ν•˜κ³  도메인과 Viewλ₯Ό μ—°κ²° |
| bootstrap | 도메인 객체 생성에 ν•„μš”ν•œ μ„€μ • 및 생성 μ±…μž„ |
| domain | λΈ”λž™μž­ κ²Œμž„μ˜ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 |
| domain.card | μΉ΄λ“œ, 덱 λ“± μΉ΄λ“œ κ΄€λ ¨ 도메인 λͺ¨λΈ |
| domain.game | κ²Œμž„ μ§„ν–‰, 승패 νŒμ • λ“± κ²Œμž„ κ·œμΉ™ |
| domain.participants | ν”Œλ ˆμ΄μ–΄, λ”œλŸ¬, λ°°νŒ… λ“± μ°Έμ—¬μž κ΄€λ ¨ 도메인 |
| dto | View에 μ „λ‹¬ν•˜κΈ° μœ„ν•œ 좜λ ₯ μ „μš© 데이터 |
| view | μ‚¬μš©μž μž…λ ₯ 및 좜λ ₯ 처리 |

---

Expand All @@ -75,17 +81,11 @@ blackjack
**Suit**
μΉ΄λ“œμ˜ λͺ¨μ–‘(β™ , β™₯, ♦, ♣) μ •μ˜

**Deck**
κ²Œμž„μ—μ„œ μ‚¬μš©ν•  μΉ΄λ“œ 묢음
- `CardsGenerator`λ₯Ό 톡해 μΉ΄λ“œ 생성
**ShuffledDeck**
κ²Œμž„μ—μ„œ μ‚¬μš©ν•  랜덀 μΉ΄λ“œ 묢음
- 객체 생성 μ‹œ 랜덀 μΉ΄λ“œ μ΄ˆκΈ°ν™”
- μΉ΄λ“œλ₯Ό ν•œ μž₯μ”© 제곡 (`draw`)

**CardsGenerator**
μΉ΄λ“œ 생성 μ „λž΅ μΈν„°νŽ˜μ΄μŠ€

**ShuffledCardsGenerator**
전체 μΉ΄λ“œλ₯Ό μƒμ„±ν•œ λ’€ λ¬΄μž‘μœ„λ‘œ μ„žμ–΄ λ°˜ν™˜

**Hand**
μ°Έκ°€μžκ°€ λ³΄μœ ν•œ μΉ΄λ“œ μ§‘ν•©
- μΉ΄λ“œ μΆ”κ°€
Expand Down Expand Up @@ -116,27 +116,47 @@ blackjack
- null / 곡백 검증
- λ¬Έμžμ—΄ μ •μ œ

**Bet**
ν”Œλ ˆμ΄μ–΄μ˜ λ°°νŒ… κΈˆμ•‘μ„ ν‘œν˜„ν•˜λŠ” κ°’ 객체
- λ°°νŒ… κΈˆμ•‘μ„ 관리
- κ²Œμž„ 결과에 따라 μˆ˜μ΅μ„ 계산

**Profit**
μˆ˜μ΅μ„ ν‘œν˜„ν•˜λŠ” κ°’ 객체
- 수읡 κΈˆμ•‘μ„ 관리
- μŒμˆ˜μ „ν™˜/0μ›λ³€ν™˜/배수적용 λ“±μ˜ 계산

**PlayerGroup**
ν”Œλ ˆμ΄μ–΄ λͺ©λ‘μ„ κ΄€λ¦¬ν•˜λŠ” 일급 μ»¬λ ‰μ…˜
- ν”Œλ ˆμ΄μ–΄ λͺ©λ‘ 관리
- ν”Œλ ˆμ΄μ–΄ λͺ©λ‘ 관리
- ν”Œλ ˆμ΄μ–΄ 전체 λ”œλ§

**PlayerNames**
ν”Œλ ˆμ΄μ–΄ 이름 λͺ©λ‘μ„ κ΄€λ¦¬ν•˜λŠ” 일급 μ»¬λ ‰μ…˜
- ν”Œλ ˆμ΄μ–΄ 이름 λͺ©λ‘ 관리
- 이름 쀑볡 검증

---

### Result 도메인
### Game 흐름

**BlackjackGame**
λΈ”λž™μž­ κ²Œμž„μ˜ 핡심 도메인 μƒνƒœμ™€ λ™μž‘μ„ 관리
- 덱, λ”œλŸ¬, ν”Œλ ˆμ΄μ–΄ κ·Έλ£Ή 관리
- 초기 μΉ΄λ“œ λΆ„λ°° μˆ˜ν–‰
- μ°Έκ°€μžμ—κ²Œ μΉ΄λ“œ hit
- λ”œλŸ¬ ν„΄ μ§„ν–‰
- GameReferee 을 ν†΅ν•œ 승패 νŒμ •

**Score**
λΈ”λž™μž­ 점수 비ꡐ
λΈ”λž™μž­ 점수 비ꡐ
- μΉ΄λ“œ 총 ν•© 관리

**GameResult**
κ²Œμž„ κ²°κ³Ό μ •μ˜
κ²Œμž„ κ²°κ³Ό μ •μ˜
- 승 / 패 / 무

**GameReferee**
κ²Œμž„ 승패 νŒμ • κ·œμΉ™μ„ μ •μ˜ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€

**BlackjackGameReferee**
**BlackjackGameReferee**
- λΈ”λž™μž­ κ·œμΉ™μ— 따라 점수λ₯Ό λΉ„κ΅ν•˜κ³  승패λ₯Ό νŒμ •

---
Expand All @@ -152,13 +172,10 @@ blackjack
- 점수 계산
- κ²Œμž„ κ²°κ³Ό 좜λ ₯

**BlackjackGame**
λΈ”λž™μž­ κ²Œμž„μ˜ 핡심 도메인 μƒνƒœμ™€ λ™μž‘μ„ 관리
- 덱, λ”œλŸ¬, ν”Œλ ˆμ΄μ–΄ κ·Έλ£Ή 관리
- 초기 μΉ΄λ“œ λΆ„λ°° μˆ˜ν–‰
- μ°Έκ°€μžμ—κ²Œ μΉ΄λ“œ hit
- λ”œλŸ¬ ν„΄ μ§„ν–‰
- GameReferee 을 ν†΅ν•œ 승패 νŒμ •
**BlackjackGameBootstrap**
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 생성에 ν•„μš”ν•œ μ„€μ • 및 생성 μ±…μž„
- ν”Œλ ˆμ΄μ–΄(이름, λ°°νŒ…κΈˆμ•‘) μ΄ˆκΈ°ν™”
- BlackjackGame 생성

---

Expand Down
43 changes: 17 additions & 26 deletions src/main/java/blackjack/BlackjackApplication.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
package blackjack;

import blackjack.core.BlackjackGame;
import blackjack.domain.card.ShuffledCardsGenerator;
import blackjack.domain.participant.Player;
import blackjack.domain.result.BlackjackGameReferee;
import blackjack.domain.result.GameResult;
import blackjack.domain.game.BlackjackGame;
import blackjack.domain.participants.Player;
import blackjack.domain.participants.Profit;
import blackjack.dto.DealerHitDto;
import blackjack.dto.GameResultDtos;
import blackjack.dto.InitialDealDtos;
import blackjack.dto.ParticipantCardsDto;
import blackjack.dto.ParticipantScoreDtos;
import blackjack.view.BlackjackView;
import blackjack.view.InputView;
import blackjack.view.OutputView;
import java.util.Map;
import java.util.stream.Collectors;

public class BlackjackApplication {
public static void main(String[] args) {
BlackjackApplication application = BlackjackConsoleBootstrap.createApplication();
application.run();
}

private final BlackjackView view;
private final BlackjackGame game;

Expand All @@ -32,7 +33,7 @@ public void run() {
playDealerTurn();

printScore();
printResult();
printProfit();
}

private void initialDeal() {
Expand All @@ -45,44 +46,34 @@ private void playPlayersTurn() {
}

private void playTurn(Player player) {
while (player.canHit() && view.isHitAnswer(player.getName())) {
while (game.canHit(player) && view.isHitAnswer(player.getName())) {
game.hit(player);
view.printPlayerCards(ParticipantCardsDto.from(player));
}
}

private void playDealerTurn() {
int dealerHitCount = game.playDealerTurn();
view.printDealerHit(
DealerHitDto.of(game.getDealer(), dealerHitCount));
if (dealerHitCount > 0) {
view.printDealerHit(DealerHitDto.of(game.getDealer(), dealerHitCount));
}
}

private void printScore() {
view.printScore(
ParticipantScoreDtos.of(game.getDealer(), game.getPlayers()));
}

private void printResult() {
Map<Player, GameResult> playerResults = parseResultMap();
private void printProfit() {
Map<Player, Profit> playerResults = calculatePlayerProfits();
view.printResult(GameResultDtos.of(playerResults));
}

private Map<Player, GameResult> parseResultMap() {
private Map<Player, Profit> calculatePlayerProfits() {
return game.getPlayers().stream()
.collect(Collectors.toMap(
player -> player,
game::judge
game::calculateProfit
));
}

public static void main(String[] args) {
BlackjackView view = new BlackjackView(new InputView(), new OutputView());
BlackjackGame game = BlackjackGame.create(
new ShuffledCardsGenerator(),
new BlackjackGameReferee(),
view.readPlayers()
);

new BlackjackApplication(view, game).run();
}
}
33 changes: 33 additions & 0 deletions src/main/java/blackjack/BlackjackConsoleBootstrap.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package blackjack;

import blackjack.domain.game.BlackjackGame;
import blackjack.domain.participants.Bet;
import blackjack.domain.participants.Name;
import blackjack.domain.participants.Player;
import blackjack.domain.participants.PlayerGroup;
import blackjack.domain.participants.PlayerNames;
import blackjack.view.BlackjackView;
import blackjack.view.InputView;
import blackjack.view.OutputView;
import java.util.List;

public class BlackjackConsoleBootstrap {
public static BlackjackApplication createApplication() {
BlackjackView view = new BlackjackView(new InputView(), new OutputView());
List<Player> players = readPlayers(view);

BlackjackGame game = BlackjackGame.createBasic(new PlayerGroup(players));
return new BlackjackApplication(view, game);
}

private static List<Player> readPlayers(BlackjackView view) {
PlayerNames playerNames = PlayerNames.from(view.readPlayers());
return playerNames.names().stream()
.map(name -> initPlayer(name, view.readBetAmount(name.getValue())))
.toList();
}

private static Player initPlayer(Name name, long betAmount) {
return Player.createEmptyHand(name, new Bet(betAmount));
}
}
69 changes: 0 additions & 69 deletions src/main/java/blackjack/core/BlackjackGame.java

This file was deleted.

7 changes: 0 additions & 7 deletions src/main/java/blackjack/domain/card/CardsGenerator.java

This file was deleted.

25 changes: 0 additions & 25 deletions src/main/java/blackjack/domain/card/Deck.java

This file was deleted.

Loading