Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 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
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 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

Copy link

Choose a reason for hiding this comment

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

닡변을 어디에 λ‚¨κΈΈκΉŒ ν•˜λ‹€κ°€ readme μž‘μ„±ν•˜μ‹  곳이 μ μ ˆν• κ²ƒ κ°™μ•„μ„œ λ‹΅λ³€λ“œλ €μš”~

TDD
TDDλ₯Ό μ‹œλ„ν•΄ 보렀고 ν•˜λ‹ˆ, 처음 ν…ŒμŠ€νŠΈ 파일의 이름을 μ •ν•˜λŠ” 것뢀터 λ§‰νžˆλŠ” κ²½ν—˜μ„ ν–ˆμŠ΅λ‹ˆλ‹€. TDDλ₯Ό μœ„ν•΄ κ°€μž₯ λ‹¨μˆœν•œ λ‘œμ§μ„ λ¨Όμ € ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄μ„œλŠ” κ·Έ 둜직이 μ–΄λ–€ 객체에 μ‘΄μž¬ν•΄μ•Ό ν•˜λŠ”μ§€ λ¨Όμ € μ •ν•΄μ•Ό ν•˜λŠ” κ±΄κ°€μš”? λ§Œμ•½ κ·Έλ ‡λ‹€λ©΄ TDD둜 κ°œλ°œμ„ μ‹œμž‘ν•˜κΈ° 전에 전체 μ„œλΉ„μŠ€μ˜ 섀계λ₯Ό μ™„λ²½ν•˜κ²Œ 해놓아야 ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

초기 섀계
μ΄ˆκΈ°μ— μ„€κ³„ν•˜μ‹€ λ•Œ μ–΄λ–€ νλ¦„μœΌλ‘œ μ–΄λ–€ 객체듀이 ν•„μš”ν• μ§€ μ •ν•˜μ‹œλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

TDDλ₯Ό μ‹œμž‘ν•˜κΈ°μ— μ•žμ„œ μš”κ΅¬μ‚¬ν•­μ„ λ¨Όμ € μ •λ¦¬ν•˜λŠ”κ²ƒ κ°™μŠ΅λ‹ˆλ‹€.
μš”κ΅¬μ‚¬ν•­μ„ μ •λ¦¬ν• λ•Œ ν•„μš”ν•œ κΈ°λŠ₯듀이 무엇이 μžˆλŠ”μ§€ λ‚˜μ—΄ν•΄λ³΄κ³  성격이 λΉ„μŠ·ν•œ 것 끼리 λ¬Άμ–΄λ΄…λ‹ˆλ‹€.
그리고 μš”κ΅¬μ‚¬ν•­μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•œ 객체듀이 어떀것듀이 ν•„μš”ν• μ§€ μ–΄λ–€ 객체끼리 μƒν˜Έμž‘μš©μ„ν• μ§€ κ·Έλ €λ³΄λŠ”κ²ƒ κ°™λ„€μš”. μ΄λ•Œ 성격이 λΉ„μŠ·ν•œ 것끼리 묢은 ν•˜λ‚˜μ˜ 집합이 ν•˜λ‚˜μ˜ 객체가 λ˜κ±°λ‚˜ μ—¬λŸ¬κ°œμ˜ 객체둜 ν• λ‹Ήλ˜λŠ”κ²ƒ κ°™λ„€μš”.

μ•„λž˜μ™€ 같은 μ˜ˆμ‹œλ₯Ό λ³΄μ—¬λ“œλ¦΄μˆ˜ μžˆμ„κ²ƒ κ°™λ„€μš”


## μ‹œλ‚˜λ¦¬μ˜€

- ν”Œλ ˆμ΄μ–΄ 이름을 μ‰Όν‘œλ‹¨μœ„λ‘œ μž…λ ₯λ°›λŠ”λ‹€.
- μΉ΄λ“œ λΆ„λ°°
  - λ”œλŸ¬λŠ” 1μž₯을 λ°›λŠ”λ‹€
  - μœ μ €λŠ” 2μž₯을 λ°›λŠ”λ‹€.
- μΉ΄λ“œ 리슀트λ₯Ό 좜λ ₯ν•œλ‹€
- μœ μ € μΉ΄λ“œμ˜ 합이 21미만이면 μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ 받을 수 μžˆλ‹€.
- λ”œλŸ¬λŠ” 16μ΄ν•˜λ©΄ 1μž₯을 μΆ”κ°€λ‘œ λ°›λŠ”λ‹€.
  - λ”œλŸ¬λŠ” 17이상이면 μΉ΄λ“œλ₯Ό λ°›μ§€μ•ŠλŠ”λ‹€.
- 결과좜λ ₯
  - λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ˜ μΉ΄λ“œλ¦¬μŠ€νŠΈμ™€ 합계λ₯Ό 좜λ ₯ν•œλ‹€.
  - μ΅œμ’… 승패λ₯Ό 좜λ ₯ν•œλ‹€.

## κΈ°λŠ₯

- μž…λ ₯
  - μ‰Όν‘œλ‘œ λΆ„λ¦¬ν•΄μ„œ Player 객체둜 생성
  - ν”Œλ ˆμ΄μ–΄μ—κ²Œ μΉ΄λ“œλ₯Ό 더 받을지 λ¬Όμ–΄λ³Έλ‹€

- ν”Œλ ˆμ΄μ–΄
  - **λ”œλŸ¬**
    - λ”œλŸ¬κ°€ 패λ₯Ό λ‚˜λˆ  μ€€λ‹€
      - 1μž₯, 2μž₯
  - **μœ μ €**
    - κ²°κ³Ό 객체λ₯Ό λ§Œλ“ λ‹€.
- μΉ΄λ“œνŒ¨ 
  - μžμ‹ μ˜ 점수의 합을 계산
  - λ‹€λ₯ΈνŒ¨μ™€ 점수λ₯Ό 비ꡐ
  - Burst μ—¬λΆ€
  - λΈ”λž™μž­ μ—¬λΆ€
- μΉ΄λ“œλ­‰μΉ˜
  - μΉ΄λ“œλ₯Ό 1κ°œμ”© κ°€μ Έμ˜¨λ‹€.

- κ²Œμž„
  - μœ μ € μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ 받을지 μ§ˆλ¬Έν•˜κ³  μΆ”κ°€ν•œλ‹€.
  - λ”œλŸ¬μ˜ μΉ΄λ“œ μΆ”κ°€κ°€ ν•„μš”ν•˜λ©΄ μΆ”κ°€ν•œλ‹€.

μœ„ μ˜ˆμ‹œλŠ” 정말 κ°„λ‹¨ν•˜κ²Œ μž‘μ„±ν•œ 것 이고 μ§€κΈˆ μ €ν•œν…Œ μž‘μ„±ν•˜λΌκ³  ν•œλ‹€λ©΄ 더 μ„Έμ„Έν•˜κ²Œ μž‘μ„±ν•  것 κ°™κΈ΄ν•˜λ„€μš”

방법이야 μ—¬λŸ¬κ°€μ§€κ² μ§€λ§Œ μ΄λŸ¬ν•œ 과정은 싀무λ₯Ό ν•˜λ©΄μ„œλ„ μ‹œμž‘λ‹¨κ³„μ— ν•΄λ‹Ήν•˜λŠ” ꡉμž₯히 μ€‘μš”ν•œ μž‘μ—…μ΄λ‹ˆ μ—°μŠ΅ν•΄λ³΄μ‹œλ©΄ 쒋을것 κ°™μŠ΅λ‹ˆλ‹€ :)

μΆ”κ°€λ‘œ κΆκΈˆν•œ 점이 μžˆλ‹€λ©΄ νŽΈν•˜κ²Œ μ§ˆλ¬Έμ£Όμ„Έμš”

**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();
}
}
95 changes: 95 additions & 0 deletions src/main/java/blackjack/BlackjackGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
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.card.HitCommand;
import blackjack.model.gameresult.ProfitResult;
import blackjack.model.user.Dealer;
import blackjack.model.user.Player;
import blackjack.model.user.Users;
import java.util.HashMap;
import java.util.List;
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<Player, String> readBetAmount, Users users) {
List<Player> players = users.getPlayers();
Map<Player, BetAmount> betAmounts = new HashMap<>();
for (Player player : players) {
String input = readBetAmount.apply(player);
BetAmount betAmount = new BetAmount(input);
betAmounts.put(player, betAmount);
}
return new BetAmounts(betAmounts);
}

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

public void hitPlayers(List<Player> players, Function<Player, String> readHitCommand,
Consumer<Player> printPlayerCards, Runnable printCantHit) {
for (Player player : players) {
hitPlayer(player, readHitCommand, printPlayerCards, printCantHit);
}
}

public void hitDealer(Dealer dealer, Runnable printDealerHit) {
while (dealer.isHitAvailable()) {
cardProvider.provideOneCard(dealer);
printDealerHit.run();
}
}

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

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

private void hitPlayer(Player player, Function<Player, String> readHitCommand, Consumer<Player> printPlayerCards,
Runnable printCantHit) {
if (!isHitAvailable(player, printCantHit)) {
return;
}

while (retryUntilSuccess(() -> checkY(player, readHitCommand))) {
cardProvider.provideOneCard(player);
printPlayerCards.accept(player);
}
}

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

private boolean isHitAvailable(Player player, Runnable printCantHit) {
if (player.isHitAvailable()) {
return true;
}
printCantHit.run();
return false;
}
}
68 changes: 19 additions & 49 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 {

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));

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

provideInitCardsAndPrint(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);
blackjackGame.provideInitCards(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.getPlayers(), InputView::readHitCommand, OutputView::printPlayerCards,
OutputView::printCantHit);
blackjackGame.hitDealer(users.getDealer(), 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.determineWinner(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 {

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

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 void validatePositive(int amount) {
if (amount <= 0) {
throw new IllegalArgumentException(ERROR_BET_AMOUNT_NOT_POSITIVE);
}
}

private int convertToInt(String input) {
try {
return Integer.parseInt(input);
} catch (NumberFormatException e) {
throw new IllegalArgumentException(ERROR_BET_AMOUNT_NOT_INTEGER);
}
}
}
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.Player;
import java.util.Map;

public class BetAmounts {

private final Map<Player, BetAmount> betAmounts;

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

public BetAmount findByPlayer(Player player) {
return betAmounts.get(player);
}
}
28 changes: 16 additions & 12 deletions src/main/java/blackjack/model/card/CardProvider.java
Original file line number Diff line number Diff line change
@@ -1,33 +1,33 @@
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 {

private static final int INIT_CARDS_START_IDX = 0;
private static final int INIT_CARDS_END_IDX = 2;

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())
.map(suit -> new Card(rank, suit)))
.collect(Collectors.toCollection(ArrayList::new));
Collections.shuffle(cards);
this.deck.addAll(cards);
}
Expand All @@ -36,13 +36,17 @@ 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);
}
provideOneCardToPlayers(players);
provideOneCard(dealer);
}
}

private void provideOneCardToPlayers(List<Player> players) {
for (Player player : players) {
provideOneCard(player);
}
}

public void provideOneCard(User user) {
if (deck.peek() == null) {
initDeck();
Expand Down
Loading