Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
c15d501
docs: κΈ°λŠ₯ λ¬Έμ„œ μž‘μ„±
khyej Mar 5, 2026
5b1fa0f
feat: μ‚¬μš©μž 이름 μž…λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
khyej Mar 5, 2026
6914d5e
feat: μΉ΄λ“œ 졜초 λ°°λΆ„ κΈ°λŠ₯ κ΅¬ν˜„
khyej Mar 5, 2026
54d9be6
feat: 졜초 μΉ΄λ“œ ν˜„ν™© 좜λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
khyej Mar 5, 2026
219ee29
feat: μΉ΄λ“œ μΆ”κ°€ μ§€κΈ‰ κΈ°λŠ₯ κ΅¬ν˜„
khyej Mar 5, 2026
8e6ad0a
refactor: CardProvider μ—­ν•  뢄리
khyej Mar 5, 2026
89911aa
refactor: λ²„μŠ€νŠΈ μ—¬λΆ€ λ³€μˆ˜ μΆ”κ°€
khyej Mar 5, 2026
3a0577d
refactor: λ³€μˆ˜λͺ… μˆ˜μ •
khyej Mar 5, 2026
fd6108d
refactor: λΈ”λž™μž­ 기둝 및 쑰회 λ©”μ„œλ“œ μΆ”κ°€
khyej Mar 5, 2026
7dd3ffe
test: BlackjackController λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„±
khyej Mar 5, 2026
0ce22d2
docs: κΈ°λŠ₯ λͺ©λ‘ μˆ˜μ •
khyej Mar 5, 2026
ccc2f7d
feat: μ‚¬μš©μžλ³„ μΉ΄λ“œ ν˜„ν™© 및 합계 좜λ ₯
khyej Mar 5, 2026
9e9bff0
feat: μ΅œμ’… 승패 계산 및 좜λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
khyej Mar 5, 2026
414c5b3
feat: κ²Œμž„ 승패 계산 둜직 μΆ”κ°€
khyej Mar 6, 2026
18f2d9c
refactor: 좜λ ₯λ¬Έ ν˜•μ‹ μˆ˜μ •
khyej Mar 6, 2026
f58565d
feat: μ˜ˆμ™Έ 처리 μΆ”κ°€
khyej Mar 6, 2026
a2b6b06
refactor: getter 제거
khyej Mar 6, 2026
d855fc4
refactor: λ§€μ§λ³€μˆ˜ μƒμˆ˜ν™”
khyej Mar 6, 2026
46807d6
docs: κ΅¬ν˜„ κΈ°λŠ₯ λͺ©λ‘ μˆ˜μ •
Chocoding1 Mar 6, 2026
e97ce9b
test: DisplayName μˆ˜μ •
Chocoding1 Mar 8, 2026
00f55da
refactor: Card 객체 섀계 μˆ˜μ •
Chocoding1 Mar 8, 2026
0075c48
refactor: 이름 값객체 생성
Chocoding1 Mar 8, 2026
0fa789c
refactor: name 값객체 생성에 λ”°λ₯Έ μˆ˜μ •
Chocoding1 Mar 8, 2026
05dc9f3
refactor: μΉ΄λ“œ μΆ”κ°€ μ—¬λΆ€ μž…λ ₯κ°’ 객체 생성
Chocoding1 Mar 8, 2026
7abdbed
refactor: User 좔상 클래슀둜 λ³€κ²½ & 좔상 λ©”μ„œλ“œ μΆ”κ°€
Chocoding1 Mar 9, 2026
b9ac11c
refactor: Users 객체 생성
Chocoding1 Mar 9, 2026
64a8d08
refactor: 클래슀λͺ… λ³€κ²½ & CardCalculator μ±…μž„ μœ„μž„
Chocoding1 Mar 9, 2026
9719248
chore: μƒμˆ˜λͺ… μˆ˜μ •
Chocoding1 Mar 9, 2026
417f72f
refactor: 클래슀λͺ… μˆ˜μ • & λ©”μ„œλ“œ μΆ”κ°€
Chocoding1 Mar 9, 2026
19a74ec
chore: getter μΆ”κ°€
Chocoding1 Mar 9, 2026
a4cdc0e
chore: getter μΆ”κ°€
Chocoding1 Mar 9, 2026
32383b4
refactor: 덱 μ΄ˆκΈ°ν™” 둜직 μˆ˜μ •
Chocoding1 Mar 9, 2026
b0622b2
refactor: CardCalculator 제거 -> Hand둜 μ—­ν•  μœ„μž„
Chocoding1 Mar 9, 2026
ded3f8b
refactor: 덱이 μ†Œμ§„λœ 경우 덱 μž¬μƒμ„± 둜직 μΆ”κ°€
Chocoding1 Mar 9, 2026
b85d895
refactor: GameResultCalculator 클래슀 μ‚­μ„Έ & Users 클래슀둜 μ—­ν•  μœ„μž„
Chocoding1 Mar 9, 2026
fcba505
refactor: 좜λ ₯ 둜직 μˆ˜μ •
Chocoding1 Mar 9, 2026
556d1de
refactor: μ½”λ“œ μ»¨λ²€μ…˜ 적용
Chocoding1 Mar 9, 2026
da880c7
chore: λ―Έμ‚¬μš© 라이브러리 import 제거
Chocoding1 Mar 9, 2026
6ba5301
refactor: PlayersGameResult 객체 생성
Chocoding1 Mar 10, 2026
08ce109
refactor: GameResult ν•„λ“œ 제거
Chocoding1 Mar 10, 2026
efdaba9
refactor: addAceScore() μ ‘κ·Ό μ œμ–΄μž private으둜 λ³€κ²½
Chocoding1 Mar 10, 2026
c375bae
refactor: Controller μ±…μž„ 뢄리
Chocoding1 Mar 10, 2026
991503c
refactor: Map 라이브러리 λ©”μ„œλ“œ ꡐ체
Chocoding1 Mar 10, 2026
d0398d1
refactor: 폴더 ꡬ쑰 λ³€κ²½
Chocoding1 Mar 10, 2026
ef6e0d2
refactor: 곡백 검증 λ©”μ„œλ“œ μˆ˜μ •
Chocoding1 Mar 10, 2026
a63f529
refactor: λ―Έμ‚¬μš© λ©”μ„œλ“œ μ‚­μ œ
Chocoding1 Mar 10, 2026
df9803a
refactor: 곡백 검증 λ©”μ„œλ“œ μˆ˜μ •
Chocoding1 Mar 10, 2026
b2d2d36
refactor: UserName -> Username 클래슀λͺ… μˆ˜μ •
Chocoding1 Mar 10, 2026
9ec41b6
test: λ‹¨μœ„ ν…ŒμŠ€νŠΈ μˆ˜μ • 및 μΆ”κ°€
Chocoding1 Mar 10, 2026
e9ee2f0
refactor: 폴더 ꡬ쑰 λ³€κ²½
Chocoding1 Mar 10, 2026
05a9504
refactor: 검증 λ©”μ„œλ“œ μ ‘κ·Ό μ œμ–΄μž μˆ˜μ •
Chocoding1 Mar 10, 2026
f397b1c
refactor: λ©”μ„œλ“œ 뢄리
Chocoding1 Mar 10, 2026
4b56ae8
refactor: ErrorMessage 클래슀 제거
Chocoding1 Mar 12, 2026
0e7417d
test: 폴더 ꡬ쑰 μˆ˜μ •
Chocoding1 Mar 12, 2026
9c6c404
refactor: ErrorMessage 클래슀 제거
Chocoding1 Mar 12, 2026
ebf96c6
refactor: μƒμˆ˜ 클래슀 제거
Chocoding1 Mar 12, 2026
9c2cab0
docs: λ°°νŒ… κΈ°λŠ₯ μΆ”κ°€
Chocoding1 Mar 12, 2026
7a3a4cd
docs: κΈ°λŠ₯ μˆ˜μ •"
Chocoding1 Mar 12, 2026
f712193
refactor: Users ν•„λ“œ List<User>둜 μˆ˜μ •
Chocoding1 Mar 12, 2026
5f0d2e3
refactor: BlackjackGame 객체 생성 & Controller μ±…μž„ 뢄리
Chocoding1 Mar 12, 2026
d550531
feat: λ°°νŒ… κΈˆμ•‘ μž…λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
Chocoding1 Mar 12, 2026
9047d7a
chore: λ―Έμ‚¬μš© 라이브러리 제거
Chocoding1 Mar 12, 2026
1dffd25
refactor: Controller μ±…μž„ 뢄리
Chocoding1 Mar 12, 2026
a2712e2
refactor: Controller μ±…μž„ 뢄리
Chocoding1 Mar 12, 2026
ffa2e70
refactor: BetAmounts ν•„λ“œ 자료ꡬ쑰 μˆ˜μ •
Chocoding1 Mar 12, 2026
4b142e6
feat: 수읡 계산 및 좜λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
Chocoding1 Mar 12, 2026
ba922a4
refactor: 폴더 ꡬ쑰 λ³€κ²½
Chocoding1 Mar 12, 2026
ff2a3a1
refactor: μ΅œμ’… 수읡 둜직 μ±…μž„ 뢄리
Chocoding1 Mar 13, 2026
7174a93
refactor: κ²Œμž„ μ’…λ£Œ λ©”μ„œλ“œ BlackjackGame으둜 μœ„μž„
Chocoding1 Mar 13, 2026
104aea2
test: λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„±
Chocoding1 Mar 13, 2026
338152f
refactor: νŒŒλΌλ―Έν„° 개수λ₯Ό 쀄이기 μœ„ν•΄ λ©”μ„œλ“œ 뢄리
Chocoding1 Mar 13, 2026
c783fbb
chore: λ©”μ„œλ“œ μˆœμ„œ μˆ˜μ •
Chocoding1 Mar 13, 2026
5e46963
refactor: indent 2 -> indent 1둜 μˆ˜μ •
Chocoding1 Mar 13, 2026
da1e88f
fix: 브랜치 좩돌 ν•΄κ²°
Chocoding1 Mar 13, 2026
58be5be
refactor: null λ°˜ν™˜ν•˜μ§€ μ•Šλ„λ‘ λ©”μ„œλ“œ ꡬ쑰 μˆ˜μ •
Chocoding1 Mar 15, 2026
bb11f00
refactor: μ—λŸ¬ λ©”μ‹œμ§€ λ‚΄μš© μˆ˜μ •
Chocoding1 Mar 15, 2026
ee03f6c
refactor: 방어적 볡사 적용
Chocoding1 Mar 15, 2026
26b13e7
refactor: λ―Έμ‚¬μš© ν•„λ“œ, λ©”μ„œλ“œ 제거
Chocoding1 Mar 15, 2026
ad9f3b4
refactor: BlackjackGameμ—μ„œ View μ°Έμ‘° 제거
Chocoding1 Mar 15, 2026
fdf622c
test: λ―Έμ‚¬μš© λ³€μˆ˜ 및 쀑볡 ν…ŒμŠ€νŠΈ 클래슀 제거
Chocoding1 Mar 15, 2026
6fe7b0b
refactor: λ―Έμ‚¬μš© νŒŒλΌλ―Έν„° 제거
Chocoding1 Mar 15, 2026
e36f7b4
refactor: 승패 νŒμ • 둜직 Player둜 이동
Chocoding1 Mar 15, 2026
18aa52e
test: 반볡 ν…ŒμŠ€νŠΈ 둜직 μˆ˜μ •
Chocoding1 Mar 16, 2026
437c65a
refactor: λ―Έμ‚¬μš© 클래슀 제거
Chocoding1 Mar 16, 2026
98af4e9
refactor: User 좔상화λ₯Ό κΉ¨μ§€ μ•Šλ„λ‘ Player, Dealer μ°Έμ‘° 제거
Chocoding1 Mar 16, 2026
04cde52
refactor: 좔상화 κ΄€λ ¨ 주석 제거
Chocoding1 Mar 16, 2026
5ccc95f
refactor: 좔상 λ©”μ„œλ“œ μ„ μ–Έ μˆœμ„œ μˆ˜μ •
Chocoding1 Mar 16, 2026
7a2e591
test: test ν΄λž˜μŠ€μ— μ—λŸ¬ λ©”μ‹œμ§€ μ μš©ν•˜κΈ° μœ„ν•΄ μ—λŸ¬ λ©”μ‹œμ§€ package-private μ„€μ •
Chocoding1 Mar 16, 2026
b71faed
test: DisplayName μˆ˜μ •
Chocoding1 Mar 16, 2026
624da9e
refactor: μ—λŸ¬ λ©”μ‹œμ§€μ— 원인 μš”μ†Œ μΆ”κ°€
Chocoding1 Mar 17, 2026
56d49a8
test: μ—λŸ¬ λ©”μ‹œμ§€ ν…ŒμŠ€νŠΈ 둜직 μˆ˜μ •
Chocoding1 Mar 18, 2026
27e753f
fix: hitPlayer λ²„μŠ€νŠΈ μƒνƒœμ—¬λ„ μΉ΄λ“œ μΆ”κ°€λ‘œ λ°›λŠ” 였λ₯˜ ν•΄κ²°
Chocoding1 Mar 18, 2026
9293e35
refactor: μƒνƒœ νŒ¨ν„΄ λ„μž…ν•˜μ—¬ User의 승패 νŒλ‹¨ 둜직 μœ„μž„
Chocoding1 Mar 18, 2026
7dbe783
chore: λ©”μ„œλ“œλͺ… 도메인에 맞게 μˆ˜μ •
Chocoding1 Mar 18, 2026
b68752e
refactor: μƒνƒœ νŒ¨ν„΄ μˆ˜μ •
Chocoding1 Mar 18, 2026
ef99444
refactor: state 폴더 생성
Chocoding1 Mar 18, 2026
a3dbc43
refactor: State μ™ΈλΆ€ λ³€ν™˜ κΈˆμ§€λ₯Ό μœ„ν•΄ setState() λ©”μ„œλ“œ 제거
Chocoding1 Mar 18, 2026
34e18b9
refactor: Controllerμ—μ„œλŠ” Users만 λ„˜κΈ°λ„λ‘ μˆ˜μ •
Chocoding1 Mar 18, 2026
2bd6557
refactor: command 폴더 생성
Chocoding1 Mar 18, 2026
7e6dd4e
refactor: λ―Έμ‚¬μš© λ©”μ„œλ“œ μ‚­μ œ
Chocoding1 Mar 18, 2026
4f9db93
refactor: HitCommandTest 경둜 μˆ˜μ •
Chocoding1 Mar 18, 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
28 changes: 18 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,33 +10,41 @@
[μ˜ˆμ™Έμ²˜λ¦¬] μ‰Όν‘œ μ™Έμ˜ λ‹€λ₯Έ 문자λ₯Ό κ΅¬λΆ„μžλ‘œ ν•œ 경우 IllegalArgumentException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

[μ˜ˆμ™Έμ²˜λ¦¬] μž…λ ₯값이 곡백일 경우 IllegalArgumentException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

Comment thread
Chocoding1 marked this conversation as resolved.
**2. [μž…λ ₯] κ²Œμž„μ— μ°Έμ—¬ν•œ μ‚¬λžŒμ˜ λ°°νŒ… κΈˆμ•‘μ„ μž…λ ₯ λ°›λŠ”λ‹€.**

[μ˜ˆμ™Έμ²˜λ¦¬] μž…λ ₯값이 곡백일 경우 IllegalArgumentException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

**2. [쀑간 κ³Όμ •] λ”œλŸ¬μ™€ μ‚¬μš©μžμ—κ²Œ μΉ΄λ“œλ₯Ό 2μž₯μ”© λ‚˜λˆ„μ–΄μ€€λ‹€.**
[μ˜ˆμ™Έμ²˜λ¦¬] μž…λ ₯값이 μˆ«μžκ°€ 아닐 경우 IllegalArgumentException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

[μ˜ˆμ™Έμ²˜λ¦¬] μž…λ ₯값이 0 μ΄ν•˜μΌ 경우 IllegalArgumentException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

**3. [쀑간 κ³Όμ •] λ”œλŸ¬μ™€ μ‚¬μš©μžμ—κ²Œ μΉ΄λ“œλ₯Ό 2μž₯μ”© λ‚˜λˆ„μ–΄μ€€λ‹€.**

[μΉ΄λ“œ 쑰건] 덱은 1개만 μ‚¬μš©ν•œλ‹€.(A ~ K : 13 * 4 = 52μž₯)

**3. [쀑간 κ³Όμ •] λ”œλŸ¬μ™€ μ‚¬μš©μžμ˜ 졜초 μΉ΄λ“œ 합계λ₯Ό κ΅¬ν•˜λ©°, λΈ”λž™μž­ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•œλ‹€.**
**4. [쀑간 κ³Όμ •] λ”œλŸ¬μ™€ μ‚¬μš©μžμ˜ 졜초 μΉ΄λ“œ 합계λ₯Ό κ΅¬ν•˜λ©°, λΈ”λž™μž­ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•œλ‹€.**

[ACE 쑰건] ACEκ°€ 11이어도 21이 λ„˜μ§€ μ•ŠλŠ” κ²½μš°μ—λŠ” 11, λ„˜λŠ” κ²½μš°μ—λŠ” 1둜 κ³„μ‚°ν•œλ‹€.

**4. [좜λ ₯] μΉ΄λ“œ ν˜„ν™©μ„ 좜λ ₯ν•œλ‹€.**
**5. [좜λ ₯] μΉ΄λ“œ ν˜„ν™©μ„ 좜λ ₯ν•œλ‹€.**

[좜λ ₯ 쑰건] λ”œλŸ¬λŠ” 첫 번째 μΉ΄λ“œλ§Œ 좜λ ₯ν•œλ‹€.

**5. [μž…λ ₯] μ‚¬μš©μžλ³„λ‘œ μΉ΄λ“œ μΆ”κ°€ μ§€κΈ‰ μ—¬λΆ€λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€.**
**6. [μž…λ ₯] μ‚¬μš©μžλ³„λ‘œ μΉ΄λ“œ μΆ”κ°€ μ§€κΈ‰ μ—¬λΆ€λ₯Ό μž…λ ₯ λ°›λŠ”λ‹€.**

[μ˜ˆμ™Έμ²˜λ¦¬] y, n μ™Έμ˜ λ‹€λ₯Έ 문자일 경우 IllegalArgumentException μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

[μž…λ ₯ 쑰건] λͺ¨λ“  μ‚¬μš©μžκ°€ μΆ”κ°€ 지급을 μ™„λ£Œν•  λ•ŒκΉŒμ§€ λ°˜λ³΅ν•œλ‹€.

[μ§€κΈ‰ 쑰건] μ‚¬μš©μžκ°€ yλ₯Ό μž…λ ₯ν•˜κ³ , μ‚¬μš©μžμ˜ ν˜„μž¬ μΉ΄λ“œ 합계가 21미만일 κ²½μš°μ— μΉ΄λ“œλ₯Ό μ§€κΈ‰ν•œλ‹€.

**6. [좜λ ₯] μ‚¬μš©μžλ³„λ‘œ μ§€κΈ‰ ν˜„ν™©μ„ 좜λ ₯ν•œλ‹€.**
**7. [좜λ ₯] μ‚¬μš©μžλ³„λ‘œ μ§€κΈ‰ ν˜„ν™©μ„ 좜λ ₯ν•œλ‹€.**

**7. [좜λ ₯] λ”œλŸ¬μ˜ μΉ΄λ“œ 합계가 17 이상이 일 될 λ•ŒκΉŒμ§€ μΆ”κ°€ μ§€κΈ‰ ν˜„ν™©μ„ 좜λ ₯ν•œλ‹€.**
**8. [좜λ ₯] λ”œλŸ¬μ˜ μΉ΄λ“œ 합계가 17 이상이 일 될 λ•ŒκΉŒμ§€ μΆ”κ°€ μ§€κΈ‰ ν˜„ν™©μ„ 좜λ ₯ν•œλ‹€.**

**8. [좜λ ₯] μ‚¬μš©μžλ³„ μΉ΄λ“œ ν˜„ν™© 및 κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.**
**9. [좜λ ₯] μ‚¬μš©μžλ³„ μΉ΄λ“œ ν˜„ν™© 및 κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.**

**9. [쀑간 κ³Όμ •] μ΅œμ’… 승패 μ—¬λΆ€λ₯Ό κ³„μ‚°ν•œλ‹€.**
**10. [좜λ ₯] μ΅œμ’… 승패λ₯Ό 좜λ ₯ν•œλ‹€.**
**10. [쀑간 κ³Όμ •] μ΅œμ’… 승패 및 μˆ˜μ΅μ„ κ³„μ‚°ν•œλ‹€.**

**11. [좜λ ₯] μ°Έμ—¬μžλ³„ μ΅œμ’… μˆ˜μ΅μ„ 좜λ ₯ν•œλ‹€.**
2 changes: 1 addition & 1 deletion src/main/java/blackjack/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
public class Application {

public static void main(String[] args) {
BlackjackController blackjackController = new BlackjackController(new CardProvider());
BlackjackController blackjackController = new BlackjackController(new BlackjackGame(new CardProvider()));
blackjackController.run();
}
}
91 changes: 91 additions & 0 deletions src/main/java/blackjack/BlackjackGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package blackjack;

import static blackjack.util.ExceptionHandler.retryUntilSuccess;

import blackjack.model.bet.BetAmount;
import blackjack.model.bet.BetAmounts;
import blackjack.model.card.CardProvider;
import blackjack.model.command.HitCommand;
import blackjack.model.gameresult.ProfitResult;
import blackjack.model.user.User;
import blackjack.model.user.Users;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

public class BlackjackGame {

private final CardProvider cardProvider;

public BlackjackGame(CardProvider cardProvider) {
this.cardProvider = cardProvider;
}

public Users createUsers(Supplier<String> readUsername) {
String input = readUsername.get();
return new Users(input);
}

public BetAmounts createBetAmount(Function<User, String> readBetAmount, Users users) {
Map<User, BetAmount> betAmounts = new HashMap<>();
for (User user : users.getPlayers()) {
String input = readBetAmount.apply(user);
BetAmount betAmount = new BetAmount(input);
betAmounts.put(user, betAmount);
}
return new BetAmounts(betAmounts);
}

public void drawInitCards(Users users) {
cardProvider.drawInitCards(users);
}

public void hitPlayers(Users users, Function<User, String> readHitCommand,
Consumer<User> printPlayerCards, Runnable printCantHit) {
for (User player : users.getPlayers()) {
hitPlayer(player, readHitCommand, printPlayerCards, printCantHit);
}
}

public void hitDealer(Users users, Runnable printDealerHit) {
User dealer = users.getDealer();
while (dealer.isHitAvailable()) {
cardProvider.drawOneCard(dealer);
printDealerHit.run();
}
dealer.stay();
}

public ProfitResult judgeWinner(Users users, BetAmounts betAmounts) {
return users.judgeWinner(betAmounts);
}

public void end(Runnable closeScanner) {
closeScanner.run();
}

private void hitPlayer(User player, Function<User, String> readHitCommand, Consumer<User> printPlayerCards,
Runnable printCantHit) {
while (retryUntilSuccess(() -> checkY(player, readHitCommand)) && isHitAvailable(player, printCantHit)) {
cardProvider.drawOneCard(player);
printPlayerCards.accept(player);
}
player.stay();
}

private boolean checkY(User player, Function<User, String> readHitCommand) {
String input = readHitCommand.apply(player);
HitCommand hitCommand = new HitCommand(input);
return hitCommand.isY();
}

private boolean isHitAvailable(User player, Runnable printCantHit) {
if (player.isHitAvailable()) {
return true;
}
Comment thread
Chocoding1 marked this conversation as resolved.
printCantHit.run();
return false;
}
}
72 changes: 21 additions & 51 deletions src/main/java/blackjack/controller/BlackjackController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,86 +2,56 @@

import static blackjack.util.ExceptionHandler.retryUntilSuccess;

import blackjack.model.card.HitCommand;
import blackjack.model.card.CardProvider;
import blackjack.model.user.Dealer;
import blackjack.model.user.Player;
import blackjack.model.gameresult.PlayersGameResult;
import blackjack.BlackjackGame;
import blackjack.model.bet.BetAmounts;
import blackjack.model.gameresult.ProfitResult;
import blackjack.model.user.Users;
import blackjack.view.InputView;
import blackjack.view.OutputView;
import java.util.List;


public class BlackjackController {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

μ»¨νŠΈλ‘€λŸ¬κ°€ 뭐죠? μ™œ 이름이 컨트둀러죠?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

MVC νŒ¨ν„΄μ—μ„œ controllerλŠ” view와 model μ‚¬μ΄μ—μ„œ 데이터듀을 μ „λ‹¬ν•˜λŠ” 역할을 클래슀라고 μƒκ°ν•©λ‹ˆλ‹€.
λΈ”λž™μž­ λ―Έμ…˜μ— MVC νŒ¨ν„΄μ„ μ μš©ν–ˆκΈ° λ•Œλ¬Έμ— ControllerλΌλŠ” 이름을 λΆ™μ—¬ Controller의 역할을 ν•˜λ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.


private final CardProvider cardProvider;
private final BlackjackGame blackjackGame;

public BlackjackController(CardProvider cardProvider) {
this.cardProvider = cardProvider;
public BlackjackController(BlackjackGame blackjackGame) {
this.blackjackGame = blackjackGame;
}

public void run() {
Users users = retryUntilSuccess(this::createUsers);
Users users = retryUntilSuccess(() -> blackjackGame.createUsers(InputView::readPlayerName));

provideInitCardsAndPrint(users);
BetAmounts betAmounts = retryUntilSuccess(
() -> blackjackGame.createBetAmount(InputView::readBetAmount, users));

drawInitCardsAndPrint(users);

hit(users);

printHandStatus(users);

printGameResult(users);

InputView.closeScanner();
}
printProfitResult(users, betAmounts);

private Users createUsers() {
String input = InputView.readPlayerName();
return new Users(input);
blackjackGame.end(InputView::closeScanner);
}

private void provideInitCardsAndPrint(Users users) {
cardProvider.provideInitCards(users);
private void drawInitCardsAndPrint(Users users) {
blackjackGame.drawInitCards(users);
OutputView.printInitCards(users);
}

private void hit(Users users) {
List<Player> players = users.getPlayers();
Dealer dealer = users.getDealer();

for (Player player : players) {
while (retryUntilSuccess(() -> checkY(player)) && checkAddCard(player)) {
cardProvider.provideOneCard(player);
OutputView.printPlayerCards(player);
}
}

while (dealer.isHitAvailable()) {
cardProvider.provideOneCard(dealer);
OutputView.printDealerHit();
}
blackjackGame.hitPlayers(users, InputView::readHitCommand, OutputView::printPlayerCards,
OutputView::printCantHit);
blackjackGame.hitDealer(users, OutputView::printDealerHit);
}

private void printHandStatus(Users users) {
OutputView.printHandStatus(users);
}

private void printGameResult(Users users) {
PlayersGameResult playersGameResult = users.determineWinner();
OutputView.printGameResult(playersGameResult, users);
}

private boolean checkY(Player player) {
String input = InputView.readCardAdd(player).trim();
HitCommand hitCommand = new HitCommand(input);
return hitCommand.isY();
}

private boolean checkAddCard(Player player) {
if (player.isHitAvailable()) {
return true;
}
OutputView.printCantHit();
return false;
private void printProfitResult(Users users, BetAmounts betAmounts) {
ProfitResult profitResult = blackjackGame.judgeWinner(users, betAmounts);
OutputView.printGameResult(profitResult, users);
}
}
41 changes: 41 additions & 0 deletions src/main/java/blackjack/model/bet/BetAmount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package blackjack.model.bet;

public class BetAmount {

static final String ERROR_EMPTY_INPUT = "μž…λ ₯값은 곡백일 수 μ—†μŠ΅λ‹ˆλ‹€.";
static final String ERROR_BET_AMOUNT_NOT_INTEGER = "λ°°νŒ… κΈˆμ•‘μ€ 숫자 ν˜•νƒœλ‘œ μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€ : %s";
static final String ERROR_BET_AMOUNT_NOT_POSITIVE = "λ°°νŒ… κΈˆμ•‘μ€ 1원 이상이어야 ν•©λ‹ˆλ‹€ : %d";
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

κ²Œμž„ κ·œμΉ™μ΄ λ°”κ»΄μ„œ λ°°νŒ… κΈˆμ•‘μ„ 1원이 μ•„λ‹Œ 10원 μ΄μƒμœΌλ‘œ λ°”κΏ”μ•Όν•œλ‹€λ©΄?
ν…μŠ€νŠΈλ‘œλ§Œ μœ μ§€ν•˜λ©΄ μˆ˜μ • 사항이 생길 λ•Œλ§ˆλ‹€ λͺ¨λ“  λ¬Έμžμ—΄μ„ 직접 μ°Ύμ•„μ„œ λ°”κΏ”μ•Όκ² κ΅°μš”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

도메인 κ·œμΉ™μ— 따라 λ°”λ€” 수 μžˆλŠ” 값듀이 ν…μŠ€νŠΈμ— λ“€μ–΄κ°€μ•Ό ν•  λ•ŒλŠ” λ”°λ‘œ μƒμˆ˜λ‘œ λΉΌμ„œ κ΄€λ¦¬ν•˜λŠ” 것이 더 μš©μ΄ν•΄λ³΄μž…λ‹ˆλ‹€
κ°μ‚¬ν•©λ‹ˆλ‹€!


private final int amount;

public BetAmount(String input) {
validateEmpty(input);
int amount = convertToInt(input);
validatePositive(amount);
this.amount = amount;
}

public int getAmount() {
return amount;
}

private void validateEmpty(String input) {
if (input.isBlank()) {
throw new IllegalArgumentException(ERROR_EMPTY_INPUT);
}
}

private int convertToInt(String input) {
try {
return Integer.parseInt(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException(ERROR_BET_AMOUNT_NOT_INTEGER.formatted(input));
}
}

private void validatePositive(int amount) {
if (amount <= 0) {
throw new IllegalArgumentException(ERROR_BET_AMOUNT_NOT_POSITIVE.formatted(amount));
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/blackjack/model/bet/BetAmounts.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package blackjack.model.bet;

import blackjack.model.user.User;
import java.util.Map;

public class BetAmounts {

private final Map<User, BetAmount> betAmounts;

public BetAmounts(Map<User, BetAmount> betAmounts) {
this.betAmounts = Map.copyOf(betAmounts);
}

public BetAmount findByUser(User user) {
return betAmounts.get(user);
}
}
41 changes: 20 additions & 21 deletions src/main/java/blackjack/model/card/CardProvider.java
Original file line number Diff line number Diff line change
@@ -1,52 +1,51 @@
package blackjack.model.card;

import static blackjack.model.constant.Constant.INIT_CARDS_END_IDX;
import static blackjack.model.constant.Constant.INIT_CARDS_START_IDX;

import blackjack.model.user.Dealer;
import blackjack.model.user.Player;
import blackjack.model.user.User;
import blackjack.model.user.Users;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import java.util.stream.Collectors;

public class CardProvider {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

provider라고 이름 지은 μ΄μœ κ°€ λ­”κ°€μš”?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

μ²˜μŒμ—λŠ” λ‹¨μˆœνžˆ μΉ΄λ“œλ₯Ό μ œκ³΅ν•˜λŠ” κ°μ²΄λ‹ˆκΉŒ CardProvider라고 μ§€μ—ˆμŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ λΈ”λž™μž­μ˜ 도메인에 더 μ ν•©ν•œ 이름을 생각해보면 Deck이 더 μ ν•©ν•΄λ³΄μž…λ‹ˆλ‹€!


private static final int INIT_CARDS_START_IDX = 0;
private static final int INIT_CARDS_END_IDX = 2;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

idx μ•½μ–΄ κΈˆμ§€


private final Queue<Card> deck = new LinkedList<>();

public CardProvider() {
initDeck();
}

private void initDeck() {
List<Card> cards = new ArrayList<>();
for (Rank rank : Rank.values()) {
for (Suit suit : Suit.values()) {
cards.add(new Card(rank, suit));
}
}
List<Card> cards = Arrays.stream(Rank.values())
.flatMap(rank -> Arrays.stream(Suit.values())
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

stream μ•ˆμ—μ„œ 또 stream을 μ²˜λ¦¬ν•˜λ©΄ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§‘λ‹ˆλ‹€
λ©”μ„œλ“œλ‘œ μΆ”μΆœν•΄μ„œ μ½”λ“œ 읽기 μ’‹κ²Œ λ°”κΏ”λ³΄μ„Έμš”

.map(suit -> new Card(rank, suit)))
.collect(Collectors.toCollection(ArrayList::new));
Collections.shuffle(cards);
this.deck.addAll(cards);
}

public void provideInitCards(Users users) {
List<Player> players = users.getPlayers();
Dealer dealer = users.getDealer();
for (int i = INIT_CARDS_START_IDX; i < INIT_CARDS_END_IDX; i++) {
for (Player player : players) {
provideOneCard(player);
}
provideOneCard(dealer);
public void drawInitCards(Users users) {
for (User user : users.getUsers()) {
drawTwoCard(user);
}
}

public void provideOneCard(User user) {
public void drawOneCard(User user) {
if (deck.peek() == null) {
initDeck();
}
user.addCard(deck.poll());
user.draw(deck.poll());
}

private void drawTwoCard(User user) {
for (int i = INIT_CARDS_START_IDX; i < INIT_CARDS_END_IDX; i++) {
drawOneCard(user);
}
}
}
Loading