Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
036f626
feat(README): κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­ 및 둜직 μΆ”κ°€
poketopa Mar 17, 2026
dfb5e4b
feat(dto): 좜λ ₯용 DTO μΆ”κ°€
poketopa Mar 17, 2026
fdc2dc0
feat(dto): 수읡 좜λ ₯ DTO μΆ”κ°€
poketopa Mar 17, 2026
a89cc86
refactor(domain): 맀직 λ„˜λ²„ 제거
poketopa Mar 17, 2026
c706e85
refactor(domain): 쀑볡 λ©”μ„œλ“œ (getResult() / getScore()) 제거
poketopa Mar 17, 2026
7f389cb
refactor(domain): getState() λ©”μ„œλ“œ μœ„μΉ˜ λ³€κ²½ (HandState -> Hand)
poketopa Mar 17, 2026
6504b8d
refactor(test): λ©”μ„œλ“œ 변경에 λ”°λ₯Έ ν…ŒμŠ€νŠΈ μ½”λ“œ λ³€κ²½
poketopa Mar 17, 2026
ef048eb
feat(controller): DTO둜 이름과 λ°°νŒ… κΈˆμ•‘μ„ λ°›μ•„ startGame()에 λ„˜κΈ°λ„λ‘ μˆ˜μ •
poketopa Mar 17, 2026
0835980
feat(domain): Participantκ°€ 총 μˆ˜μ΅μ„ ν•„λ“œλ₯Ό 가지도둝 μΆ”κ°€ / ν”Œλ ˆμ΄μ–΄κ°€ λ°°νŒ…κΈˆ ν•„λ“œλ₯Ό 가지도둝 μΆ”κ°€
poketopa Mar 17, 2026
beca1a9
feat(domain): BlackJackGame이 DTOλ₯Ό λ°›μ•„ κ²Œμž„μ„ μƒμ„±ν•˜λ„λ‘ λ³€κ²½
poketopa Mar 17, 2026
cedce1b
feat(dto): ν”Œλ ˆμ΄μ–΄ 이름/λ°°νŒ…κΈˆ DTO 생성g
poketopa Mar 17, 2026
ae26446
feat(view): λ°°νŒ…κΈˆ μž…λ ₯ λ©”μ„œλ“œ μΆ”κ°€
poketopa Mar 17, 2026
2a3b016
feat(domain): Balance(μ΅œμ’… μž”μ•‘ 객체) 생성
poketopa Mar 17, 2026
588fcd7
feat(domain): λ°°νŒ…κΈˆ 객체 μΆ”κ°€
poketopa Mar 17, 2026
2ec1ca5
feat(domain): ν”Œλ ˆλ¦¬μ–΄κ°€ λ°°νŒ…κΈˆκ³Ό μž”μ•‘μ„ 가지도둝 μΆ”κ°€
poketopa Mar 17, 2026
a62436f
feat(domain): Outcome이 λΈ”λž™μž­μœΌλ‘œ μŠΉλ¦¬ν•˜λŠ” 경우λ₯Ό 가지도둝 μΆ”κ°€
poketopa Mar 17, 2026
45aefe0
feat(domain): ResultCalculatorκ°€ ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬μ˜ μž”μ•‘μ„ κ°±μ‹ ν•˜λ„λ‘ κΈ°λŠ₯ μΆ”κ°€
poketopa Mar 17, 2026
a732ce5
feat(message): λ°°νŒ…κΈˆ μž…λ ₯ λ©”μ‹œμ§€ μΆ”κ°€
poketopa Mar 17, 2026
333b44a
refactor(util): Nameparserκ°€ String 리슀트λ₯Ό λ¦¬ν„΄ν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 17, 2026
2cc9225
feat(view): λ°°νŒ…κΈˆ μž…λ ₯ κΈ°λŠ₯ μΆ”κ°€
poketopa Mar 17, 2026
505e37d
feat(view): μ΅œμ’… κ²°κ³Ό 좜λ ₯ λ©”μ„œλ“œ μΆ”κ°€g
poketopa Mar 18, 2026
8f24990
feat(message): κ²°κ³Ό 좜λ ₯ μƒμˆ˜ μΆ”κ°€
poketopa Mar 18, 2026
91f7b5f
feat(controller): κ²°κ³Ό 좜λ ₯ λ©”μ„œλ“œ 및 dto λ³€ν™˜ κΈ°λŠ₯ μΆ”κ°€
poketopa Mar 18, 2026
a5be31e
feat(domain): Participantκ°€ μžμ‹ μ˜ μž”μ•‘μ„ κ°€μ Έμ˜€λŠ” κΈ°λŠ₯ (getBalance()) μΆ”κ°€
poketopa Mar 18, 2026
a4f9d97
feat(controller): DTO λ§€ν•‘ 객체 뢄리
poketopa Mar 18, 2026
1ded033
refactor(controller): μ»¨νŠΈλ‘€λŸ¬μ—μ„œ DTO둜 μž…λ ₯값을 받도둝 μˆ˜μ •
poketopa Mar 18, 2026
6719381
feat(error): μž¬μ‹œλ„ λ‘œμ§μ„ μœ„ν•œ μ—λŸ¬ λ©”μ‹œμ§€ μΆ”κ°€
poketopa Mar 18, 2026
fb66e0a
feat(view): μž¬μ‹œλ„ 둜직 및 μ˜ˆμ™Έ 처리 μΆ”κ°€
poketopa Mar 18, 2026
1e1cd79
feat(test): μž¬μ‹œλ„ 둜직 ν…ŒμŠ€νŠΈ μΆ”κ°€
poketopa Mar 18, 2026
deb8642
refactor(domain): λ”œλŸ¬κ°€ λΈ”λž™μž­μΌ λ•Œ ν”Œλ ˆμ΄μ–΄ 패배 쑰건문 μˆ˜μ •
poketopa Mar 18, 2026
d5b9830
feat(test): λ”œλŸ¬κ°€ λΈ”λž™μž­μΈ 경우 ν”Œμ—μ΄μ–΄ 패배 ν…ŒμŠ€νŠΈ μΆ”κ°€
poketopa Mar 18, 2026
370dd86
feat(README): λ¦¬λ“œλ―Έ ν˜„ν™© κ°±μ‹ 
poketopa Mar 18, 2026
4d49d72
refactor: Depth 2이상인 λ©”μ„œλ“œ 뢄리
poketopa Mar 18, 2026
6a6b5e9
refactor(domain): ν”Œλ ˆμ΄μ–΄κ°€ 21점일 λ•Œ μžλ™μœΌλ‘œ DRAWκ°€ μ’…λ£Œλ˜λ„λ‘ λ³€κ²½
poketopa Mar 19, 2026
044c14a
feat(test): ν”Œλ ˆμ΄μ–΄κ°€ BLACKJACK이 μ•„λ‹Œ μƒνƒœμ—μ„œ μ μˆ˜κ°€ 21점일 λ•Œ λ“œλ‘œμš° μ’…λ£Œ ν…ŒμŠ€νŠΈ μΆ”κ°€
poketopa Mar 19, 2026
c845bab
refactor: λ©”μ„œλ“œ λͺ… λ³€κ²½ (BettingMoney -> Betting / getCardList -> getCards)
poketopa Mar 19, 2026
5efd147
refactor(controller): 컨트둀러 / 맀퍼 / λ·° μ±…μž„ 뢄리 및 μ°Έμ‘°ν•˜μ§€ μ•Šλ„λ‘ μˆ˜μ •
poketopa Mar 19, 2026
4e3fb38
refactor(view): λ·°κ°€ 객체λ₯Ό μ°Έμ‘°ν•˜λ©° 좜λ ₯ν•˜μ§€ μ•Šλ„λ‘ λ³€κ²½
poketopa Mar 19, 2026
ff3b0ac
refactor(domain): λ”œλŸ¬κ°€ 16μ΄ν•˜μΌ λ•Œ μΉ΄λ“œλ₯Ό λ½‘λŠ” λ‘œμ§μ„ Dealer 객체가 λ‹΄λ‹Ήν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 19, 2026
7888352
refactor(domain): HIT λŒ€μ‹  STAY μƒνƒœλ₯Ό 가지도둝 μˆ˜μ •
poketopa Mar 19, 2026
769eaf7
feat(test): STAY μƒνƒœμ— λŒ€ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
poketopa Mar 19, 2026
48098b4
refactor: μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œ 및 μƒμˆ˜ 제거
poketopa Mar 20, 2026
417bcf2
refactor: ResultViewκ°€ μΉ΄λ“œ 객체λ₯Ό 직접 λ°›μ§€ μ•Šκ³  DTO둜 결과값을 λ°˜ν™˜ν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 20, 2026
76d03ed
refactor: μ‚¬μš©μžμ˜ λ°°νŒ…κΈˆμ΄ μ΅œμ†Œ 10원, 10μ›λ‹¨μœ„λ‘œ μž…λ ₯λ˜λ„λ‘ μˆ˜μ •
poketopa Mar 20, 2026
b640dd9
refactor: ErrorMessage 객체 μ‚­μ œ 및 μ—λŸ¬λ₯Ό InputViewμ—μ„œ κ΄€λ¦¬ν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 20, 2026
bd30b64
refactor: μΉ΄λ“œ λ“œλ‘œμš° λ©”μ„œλ“œλ₯Ό μΈν„°νŽ˜μ΄μŠ€μ— 두고 λ‹€ν˜•μ„±μœΌλ‘œ ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬κ°€ κ΅¬ν˜„ν•˜λ„λ‘ λ³€κ²½
poketopa Mar 21, 2026
f3d4c66
refactor: TurnStateλ₯Ό 톡해 STANDμƒνƒœλ₯Ό κ΅¬λΆ„ν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 22, 2026
ded73b2
refactor: λ”œλŸ¬κ°€ Balanceλ₯Ό κ³„μ‚°ν•˜μ—¬ κ°±μ‹ ν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 22, 2026
0cf6a46
refactor: 승패 확인 / balance μ •μ‚° λ©”μ„œλ“œ 뢄리
poketopa Mar 22, 2026
b832495
refactor(domain): μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν•œκΈ€λ‘œ μˆ˜μ •
poketopa Mar 22, 2026
70a665f
refactor: IOMessageλ₯Ό μ‚­μ œν•˜κ³  λ©”μ‹œμ§€κ°€ μ‚¬μš©λ˜λŠ” κ°μ²΄μ—μ„œ μƒμˆ˜λ‘œ κ΄€λ¦¬ν•˜λ„λ‘ μˆ˜μ •
poketopa Mar 22, 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
41 changes: 40 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

### κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­ 체크리슀트

#### step 1
- [x] κ²Œμž„μ— μ°Έμ—¬ν•  μ‚¬λžŒμ˜ 이름을 μ‰Όν‘œ(,) κΈ°μ€€μœΌλ‘œ μž…λ ₯λ°›μ•„ λΆ„λ¦¬ν•œλ‹€.
- [x] 0λΆ€ν„° 51 μ‚¬μ΄μ˜ λ‚œμˆ˜λ₯Ό 생성해 λ¬΄λŠ¬μ™€ μˆ«μžκ°€ λ§€ν•‘λœ 쀑볡 μ—†λŠ” μΉ΄λ“œλ₯Ό λ°œκΈ‰ν•œλ‹€.
- [x] κ²Œμž„ μ‹œμž‘ μ‹œ λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ—κ²Œ 각각 2μž₯μ”© μΉ΄λ“œλ₯Ό λΆ„λ°°ν•œλ‹€.
Expand All @@ -14,8 +15,19 @@
- [x] λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ˜ 턴이 λͺ¨λ‘ λλ‚˜λ©΄ 각자의 μ΅œμ’… μΉ΄λ“œ λͺ©λ‘κ³Ό 점수λ₯Ό 좜λ ₯ν•œλ‹€.
- [x] μ΅œμ’… 점수λ₯Ό 비ꡐ해 λ”œλŸ¬μ™€ 각 ν”Œλ ˆμ΄μ–΄μ˜ 승/패/무 κ²°κ³Όλ₯Ό κ³„μ‚°ν•˜κ³  좜λ ₯ν•œλ‹€.

#### step 2
- [x] λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄λŠ” λ°°νŒ…κΈˆμ„ κ°€μ§„λ‹€.
- [x] λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄λŠ” ν˜„μž¬κΉŒμ§€μ˜ μ΅œμ’… μˆ˜μ΅μ„ κ°€μ§„λ‹€.
- [x] λ°°νŒ…κΈˆμ€ κ²Œμž„ μ‹œμž‘ μ‹œ, 이름과 ν•¨κ»˜ μž…λ ₯λœλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄κ°€ λΈ”λž™μž­μœΌλ‘œ μŠΉλ¦¬ν•˜λ©΄ λ°°νŒ…κΈˆμ΄ 1.5λ°°κ°€ λœλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄κ°€ μŠΉλ¦¬ν•˜λ©΄ λ°°νŒ…κΈˆμ„ μœ μ§€ν•œλ‹€.
- [x] ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬κ°€ λͺ¨λ‘ λΈ”λž™μž­μ΄κ±°λ‚˜, ν•©μ‚° μ μˆ˜κ°€ κ°™μœΌλ©΄ λ°°νŒ…κΈˆμ„ λŒλ €λ°›λŠ”λ‹€. (λ°°νŒ…κΈˆμ΄ 0이 λœλ‹€.)
- [x] ν”Œλ ˆμ΄μ–΄κ°€ νŒ¨λ°°ν•˜λ©΄ λ°°νŒ…κΈˆμ„ 음수둜 λ³€ν™˜ν•œλ‹€.
- [x] κ²Œμž„μ΄ λλ‚˜λ©΄, λͺ¨λ“  ν”Œλ ˆμ΄μ–΄μ˜ ν˜„μž¬ λ°°νŒ…κΈˆμ„ ν™•μΈν•˜μ—¬ ν”Œλ ˆμ΄μ–΄μ˜ μˆ˜μ΅μ— λ§μ…ˆ, λ”œλŸ¬μ˜ μˆ˜μ΅μ— λΊ„μ…ˆ 연산을 ν•œλ‹€.

### μ£Όμš” 둜직 μš”μ•½

#### step 1
- **μΉ΄λ“œ 생성**
- `Card`μ—μ„œ `0~51` λ²”μœ„μ˜ λ‚œμˆ˜λ₯Ό 뽑아 μΉ΄λ“œ 번호λ₯Ό λ§Œλ“ λ‹€.
- **μΉ΄λ“œ 이름/점수 λ§€ν•‘**
Expand All @@ -31,4 +43,31 @@
- λ”œλŸ¬λŠ” 합계가 16 μ΄ν•˜μΌ λ•Œ μžλ™μœΌλ‘œ μΆ”κ°€ μΉ΄λ“œ λ“œλ‘œμš°
- **승패 계산**
- λ²„μŠ€νŠΈλŠ” `-1` 처리 ν›„ λ”œλŸ¬μ™€ 각 ν”Œλ ˆμ΄μ–΄ 점수λ₯Ό 비ꡐ해 `승/패/무`λ₯Ό κΈ°λ‘ν•œλ‹€.


#### step 2
- λ°°νŒ…κΈˆ μž…λ ₯
- ν”Œλ ˆμ΄μ–΄λ₯Ό μˆœνšŒν•˜λ©° λ°°νŒ…κΈˆμ„ μž…λ ₯λ°›λŠ”λ‹€.
- λ°°νŒ…κΈˆμ€ ν”Œλ ˆμ΄μ–΄ 객체가 κΈ°μ–΅ν•΄μ•Ό ν•˜λŠ” κ°’μ΄λ―€λ‘œ ν•„λ“œλ‘œ μ‘΄μž¬ν•΄μ•Όν•œλ‹€.
- 수읡금 μ΄ˆκΈ°ν™”
- ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬λŠ” 수읡금 ν•„λ“œλ₯Ό κ°€μ§„λ‹€.
- μˆ˜μ΅κΈˆμ€ ν•œ κ²Œμž„μ΄ μ’…λ£Œλ  λ•Œ, λ°°νŒ…κΈˆμ„ λ”ν•˜κ±°λ‚˜ λΊ€λ‹€. (ν”Œλ ˆμ΄μ–΄λŠ” λ”ν•˜κ³ , λ”œλŸ¬λŠ” λΊ€λ‹€)
- λ°°νŒ…κΈˆ κ°±μ‹ 
- ν”Œλ ˆμ΄μ–΄ 승리 μ‹œ ν”Œλ ˆμ΄μ–΄μ˜ λ°°νŒ…κΈˆμ„ μœ μ§€ν•œλ‹€.
- λ¬΄μŠΉλΆ€ μ‹œ ν”Œλ ˆμ΄μ–΄μ˜ λ°°νŒ…κΈˆμ„ 0으둜 κ°±μ‹ ν•œλ‹€.
- ν”Œλ ˆμ΄μ–΄ 패배 μ‹œ ν”Œλ ˆμ΄μ–΄μ˜ λ°°νŒ…κΈˆμ„ 음수둜 λ§Œλ“ λ‹€.
- μ΅œμ’… 수읡 좜λ ₯
- ν•œ κ²Œμž„μ΄ λλ‚˜λ©΄ μ΅œμ’… μˆ˜μ΅μ„ 좜λ ₯ν•œλ‹€.

### 승패 계산
- ν”Œλ ˆμ΄μ–΄κ°€ BLACKJACK으둜 μŠΉλ¦¬ν•˜λŠ” μ‹œλ‚˜λ¦¬μ˜€
- κ²Œμž„ μ‹œμž‘ μ‹œμ— ν”Œλ ˆμ΄μ–΄μ˜ μΉ΄λ“œ 합이 21이고, λ”œλŸ¬λŠ” 21이 μ•„λ‹Œ 경우
- ν”Œλ ˆμ΄μ–΄κ°€ μŠΉλ¦¬ν•˜λŠ” 경우
- ν”Œλ ˆμ΄μ–΄λŠ” STAND μƒνƒœμ΄κ³ , λ”œλŸ¬λŠ” BUST인 경우
- ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬ λͺ¨λ‘ STAND인 μƒνƒœμ—μ„œ ν”Œλ ˆμ΄μ–΄μ˜ μΉ΄λ“œ 합이 더 높은 경우
- λ¬΄μŠΉλΆ€μΈ 경우
- κ²Œμž„ μ‹œμž‘ μ‹œ μΉ΄λ“œ 2μž₯으둜 ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬ λͺ¨λ‘ BUST인 경우
- ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬ λͺ¨λ‘ STAND인 μƒνƒœμ—μ„œ ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬μ˜ 합이 같은 경우
- ν”Œλ ˆμ΄μ–΄κ°€ νŒ¨λ°°ν•˜λŠ” 경우
- ν”Œλ ˆμ΄μ–΄κ°€ HITν•œ 후에 BUSTλ˜λŠ” 경우
- ν”Œλ ˆμ΄μ–΄μ™€ λ”œλŸ¬ λͺ¨λ‘ STAND인 μƒνƒœμ—μ„œ ν”Œλ ˆμ΄μ–΄μ˜ 합이 λ”œλŸ¬μ˜ 합보닀 적은 경우
- ν”Œλ ˆμ΄μ–΄λŠ” STAND인 μƒν™©μ—μ„œ λ”œλŸ¬κ°€ BLACKJACK인 경우
35 changes: 20 additions & 15 deletions src/main/java/controller/BlackJackController.java
Original file line number Diff line number Diff line change
@@ -1,31 +1,38 @@
package controller;

import controller.mapper.ResultViewMapper;
import domain.game.BlackJackGame;
import domain.card.Cards;
import domain.participant.Dealer;
import domain.game.GameResult;
import domain.participant.Player;
import domain.participant.Players;
import domain.state.HitStand;
import dto.domain.PlayerNameAndBettingDto;
import java.util.List;
import view.InputView;
import view.ResultView;

public class BlackJackController {
private final InputView inputView;
private final ResultView resultView;
private final ResultViewMapper resultViewMapper;

public BlackJackController(InputView inputView, ResultView resultView) {
this.inputView = inputView;
this.resultView = resultView;
this.resultViewMapper = new ResultViewMapper();
}

public void run() {
final String participant = inputView.getPlayerNames();
final BlackJackGame game = BlackJackGame.startGame(participant);
final List<String> participantNames = inputView.getPlayerNames();
final List<PlayerNameAndBettingDto> playersInfo = inputView.getPlayerBetting(participantNames);
final BlackJackGame game = BlackJackGame.startGame(playersInfo);
final Players players = game.players();
final Dealer dealer = game.dealer();
final Cards cards = game.cards();

resultView.printGameStartMessage(players, dealer);
resultView.printGameStartMessage(resultViewMapper.toStartBlackJackDto(players, dealer));
drawPlayersTurn(players, cards);
drawDealerTurn(dealer, cards);
printResult(game);
Expand All @@ -36,18 +43,19 @@ private void drawPlayersTurn(Players players, Cards cards) {
}

private void drawPlayerTurn(Player player, Cards cards) {
while (player.canHit()) {
final boolean hit = inputView.askHitOrStand(player);
if (!hit) {
break;
while (player.shouldDrawCard()) {
final HitStand decision = inputView.askHitOrStand(player.getName());
if (decision == HitStand.STAND) {
player.stand();
return;
}
hit(player, cards);
}
}

private void hit(Player player, Cards cards) {
player.hit(cards);
resultView.printPlayerCards(player.getName(), resultView.joinCardNames(player.getCardList()));
resultView.printPlayerCards(resultViewMapper.toPlayerCardsDto(player));
printPlayerBustIfNeeded(player);
}

Expand All @@ -69,19 +77,16 @@ private void drawDealerTurn(Dealer dealer, Cards cards) {
private void printResult(BlackJackGame game) {
final Players players = game.players();
final Dealer dealer = game.dealer();
final GameResult gameResult = game.calculateResult();
printGameResult(players, dealer);
printWinnerResult(game);
resultView.printWinner(resultViewMapper.toParticipantStatsDto(players, gameResult));
resultView.printFinalProfit(resultViewMapper.toParticipantProfitDto(players, game.getDealerProfit()));
}

private void printGameResult(Players players, Dealer dealer) {
resultView.printResult(players, dealer);
resultView.printResult(resultViewMapper.toResultDto(players, dealer));
if (dealer.checkBust()) {
resultView.printDealerBust();
}
}

private void printWinnerResult(BlackJackGame game) {
final GameResult gameResult = game.calculateResult();
resultView.printWinner(game.players(), gameResult);
}
}
111 changes: 111 additions & 0 deletions src/main/java/controller/mapper/ResultViewMapper.java
Comment thread
Gomding marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
package controller.mapper;

import domain.card.Card;
import domain.game.GameResult;
import domain.participant.Dealer;
import domain.participant.Player;
import domain.participant.Players;
import domain.state.Outcome;
import dto.view.DealerStatDto;
import dto.view.ParticipantProfitDto;
import dto.view.ParticipantResultDto;
import dto.view.ParticipantStatsDto;
import dto.view.PlayerCardsDto;
import dto.view.PlayerOutcomeDto;
import dto.view.PlayerProfitDto;
import dto.view.ResultDto;
import dto.view.StartBlackJackDto;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ResultViewMapper {
private static final String DEALER_NAME = "λ”œλŸ¬";

public StartBlackJackDto toStartBlackJackDto(Players players, Dealer dealer) {
return new StartBlackJackDto(
formatCardName(dealer.getCards().get(0)),
toPlayerCardsDtos(players)
);
}

public ResultDto toResultDto(Players players, Dealer dealer) {
final ParticipantResultDto dealerResult = new ParticipantResultDto(
DEALER_NAME,
joinCardNames(dealer.getCards()),
dealer.getScore()
);
final List<ParticipantResultDto> playerResults = new ArrayList<>();
players.forEachPlayer(player -> playerResults.add(new ParticipantResultDto(
player.getName(),
joinCardNames(player.getCards()),
player.getScore()
)));
return new ResultDto(dealerResult, playerResults);
}

public ParticipantStatsDto toParticipantStatsDto(Players players, GameResult gameResult) {
return new ParticipantStatsDto(
toDealerStatDto(gameResult),
toPlayerOutcomeDtos(players, gameResult)
);
}

public ParticipantProfitDto toParticipantProfitDto(Players players, int dealerProfit) {
final List<PlayerProfitDto> playerProfitDtos = new ArrayList<>();
players.forEachPlayer(player -> playerProfitDtos.add(new PlayerProfitDto(
player.getName(),
player.getBalance()
)));
return new ParticipantProfitDto(dealerProfit, playerProfitDtos);
}

public PlayerCardsDto toPlayerCardsDto(final Player player) {
return new PlayerCardsDto(
player.getName(),
toCardNames(player.getCards())
);
}

private List<PlayerCardsDto> toPlayerCardsDtos(Players players) {
final List<PlayerCardsDto> playerCardsDtos = new ArrayList<>();
players.forEachPlayer(player -> playerCardsDtos.add(new PlayerCardsDto(
player.getName(),
toCardNames(player.getCards())
)));
return playerCardsDtos;
}

private DealerStatDto toDealerStatDto(GameResult gameResult) {
final int dealerWinCount = gameResult.getDealerCount(Outcome.DEFAULT_WIN)
+ gameResult.getDealerCount(Outcome.BLACKJACK_WIN);
final int dealerLoseCount = gameResult.getDealerCount(Outcome.LOSE);
final int dealerDrawCount = gameResult.getDealerCount(Outcome.DRAW);
return new DealerStatDto(dealerWinCount, dealerLoseCount, dealerDrawCount);
}

private List<PlayerOutcomeDto> toPlayerOutcomeDtos(Players players, GameResult gameResult) {
final List<PlayerOutcomeDto> playerOutcomeDtos = new ArrayList<>();
players.forEachPlayer(player -> playerOutcomeDtos.add(new PlayerOutcomeDto(
player.getName(),
gameResult.getPlayerOutcome(player.getName()).result()
)));
return playerOutcomeDtos;
}

private List<String> toCardNames(List<Card> cards) {
return cards.stream()
.map(this::formatCardName)
.collect(Collectors.toList());
}

private String formatCardName(final Card card) {
return card.getRank().symbol() + card.getSuit().suit();
}

private String joinCardNames(final List<Card> cards) {
return cards.stream()
.map(this::formatCardName)
.collect(Collectors.joining(", "));
}
}
45 changes: 26 additions & 19 deletions src/main/java/domain/card/Hand.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,44 +9,35 @@ public class Hand {
private static final int ACE_ADJUST_SCORE = 10;
private static final int INITIAL_CARD_COUNT = 2;
private static final int BLACKJACK_SCORE = 21;
private static final int DEALER_DRAW_SCORE = 16;

private final List<Card> cards;
private int score;
Comment thread
poketopa marked this conversation as resolved.
Comment thread
Gomding marked this conversation as resolved.

public Hand() {
this.cards = new ArrayList<>();
this.score = 0;
}

public void addCard(Card card) {
this.cards.add(card);
score += card.getScore();
adjustAceScore();
}

public int getScore() {
return score;
}

public int getResult() {
return score;
return calculateScore();
}

public boolean checkBust() {
return score > BLACKJACK_SCORE;
}

public boolean isDealerDrawScore() {
return score <= DEALER_DRAW_SCORE;
return calculateScore() > BLACKJACK_SCORE;
}

private void adjustAceScore() {
private int calculateScore() {
int totalScore = cards.stream()
.mapToInt(Card::getScore)
.sum();
int aceCount = countAces();
while (checkBust() && aceCount > 0) {
score -= ACE_ADJUST_SCORE;
while (totalScore > BLACKJACK_SCORE && aceCount > 0) {
totalScore -= ACE_ADJUST_SCORE;
aceCount--;
}
return totalScore;
}

private int countAces() {
Expand All @@ -58,10 +49,26 @@ public List<Card> getCards() {
}

public HandState getHandState(){
Comment thread
poketopa marked this conversation as resolved.
return HandState.getState(score, isInitialCards());
final int score = calculateScore();
if (score > BLACKJACK_SCORE) {
return HandState.BUST;
}

if (score < BLACKJACK_SCORE) {
return HandState.STAND;
}

if (isInitialCards()) {
return HandState.BLACKJACK;
}
return HandState.STAND;
}

private boolean isInitialCards(){
return cards.size() == INITIAL_CARD_COUNT;
}

public boolean canDraw(){
return getScore() < BLACKJACK_SCORE;
}
Comment on lines +71 to +73
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

여기도 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œλ„€μš”!

}
14 changes: 10 additions & 4 deletions src/main/java/domain/game/BlackJackGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import domain.participant.Dealer;
import domain.participant.Player;
import domain.participant.Players;
import dto.domain.PlayerNameAndBettingDto;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import util.NameParser;

public class BlackJackGame {
private static final int INITIAL_DRAW_COUNT = 2;
Expand Down Expand Up @@ -39,12 +40,17 @@ public GameResult calculateResult() {
return resultCalculator.calculate(dealer, players);
}

public static BlackJackGame startGame(String participant){
public int getDealerProfit() {
return dealer.getBalance();
}

public static BlackJackGame startGame(List<PlayerNameAndBettingDto> playerInfos) {
final Random random = new Random();
final Players players = NameParser.makeNameList(participant);
final Players players = new Players(playerInfos.stream()
.map(info -> new Player(info.name(), info.betting()))
.toList());
final Dealer dealer = new Dealer();
final Cards cards = new Cards(random);

final BlackJackGame game = new BlackJackGame(players, dealer, cards);
game.drawInitialDealerCards();
game.drawInitialPlayerCards();
Expand Down
Loading