Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking β€œSign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

πŸš€ 3단계 - λΈ”λž™μž­(λ”œλŸ¬) #653

Open
wants to merge 81 commits into
base: moto6
Choose a base branch
from
Open
Changes from 64 commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
4530961
refactor : μ™ΈλΆ€μ—μ„œ λΈ”λž™μž­ μΉ΄λ“œλ₯Ό λ½‘λŠ” μ „λž΅μ„ μ£Όμž…λ°›λ„λ‘ λ¦¬νŒ©ν† λ§
Nov 19, 2023
768e5e8
learn : λ―Έμ™„μ„± ν•™μŠ΅μ½”λ“œλ₯Ό μ™„μ„±μ‹œν‚΄ : 방어적 볡사 κ΄€λ ¨ μ˜ˆμ œμ½”λ“œ
Nov 19, 2023
f595abb
learn : λ―Έμ™„μ„± ν•™μŠ΅μ½”λ“œλ₯Ό μ™„μ„±μ‹œν‚΄ : 방어적 볡사 κ΄€λ ¨ μ˜ˆμ œμ½”λ“œ μž‘μ„±
Nov 19, 2023
2c3439f
learn : λ―Έμ™„μ„± ν•™μŠ΅μ½”λ“œλ₯Ό μ™„μ„±μ‹œν‚΄ : 방어적 볡사 κ΄€λ ¨ μ˜ˆμ œμ½”λ“œ μž‘μ„±
Nov 19, 2023
ec334d4
refactor : Pair<> 자료ꡬ쑰λ₯Ό ν•˜λ‚˜μ˜ 클래슀둜 묢음
Nov 19, 2023
2196d5b
refactor : κ³Όλ„ν•˜κ²Œ κΈΈκ³  λ‹€μ†Œ λΆ€μ‘±ν•œ ν‘œν˜„μ˜ λ³€μˆ˜λͺ…을 μ μ ˆν•˜κ²Œ μˆ˜μ •
Nov 19, 2023
193b74b
docs : μš”κ΅¬μ‚¬ν•­ 뢄석
Nov 19, 2023
2e6ed51
test : λ”œλŸ¬ 클래슀λ₯Ό μΆ”κ°€ν•˜κ³ , λ”œλŸ¬ν΄λž˜μŠ€μ—μ„œ μ±…μž„μ €μ•Όν•  역할에 λŒ€ν•΄ ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„±
Nov 19, 2023
dc3c6f6
feat : μ°Έκ°€μž λͺ…단에 λ”œλŸ¬ μΆ”κ°€
Nov 19, 2023
01dd4ca
refactor : ν”Œλ ˆμ΄μ–΄λ‘œ λ³€μˆ˜λͺ… μˆ˜μ •
Nov 19, 2023
c294555
refactor : λ”œλŸ¬ 클래슀 μΆ”κ°€
Nov 19, 2023
2f9e2f2
refactor : λ”œλŸ¬μ˜ 역할에 λŒ€ν•œ ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„±
Nov 19, 2023
cf0f5f2
refactor : λ”œλŸ¬μ˜ 역할에 λŒ€ν•œ ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„±
Nov 21, 2023
c651d71
feat : λ”œλŸ¬ 클래슀의 κΈ°λŠ₯ κ΅¬ν˜„
Nov 21, 2023
1f8d48f
feat : λ”œλŸ¬ κΈ°λŠ₯ κ΅¬ν˜„μ„ μœ„ν•œ 클래슀 μž‘μ„±
Nov 22, 2023
2008753
feat : λ”œλŸ¬ κΈ°λŠ₯ κ΅¬ν˜„
Nov 22, 2023
0cf2ee0
feat : λ”œλŸ¬ κΈ°λŠ₯ κ΅¬ν˜„
Nov 23, 2023
d5d036d
test : 클래슀 μ΄μ „μœΌλ‘œ μΈν•œ μ±…μž„μ†Œμž¬ λ³€κ²½μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ΄λ™μ‹œν‚¨λ‹€
Nov 23, 2023
e1a92a3
feat : λ”œλŸ¬ 좜λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
Nov 23, 2023
fd08d2e
feat : λ”œλŸ¬ 좜λ ₯ κΈ°λŠ₯ κ΅¬ν˜„
Nov 23, 2023
72c2a9f
feat : λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄κ°„ 곡톡 λ™μž‘μ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 묢음
Nov 23, 2023
405c44e
feat : λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄κ°„ 곡톡 λ™μž‘μ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ 묢음
Nov 23, 2023
3fc2d98
feat : λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄κ°„ 곡톡 λ™μž‘μΈ κ²Œμž„ ν”Œλ ˆμ΄λ₯Ό μΈν…ŒνŽ˜μ΄μŠ€λ‘œ 좔상화함
Nov 23, 2023
118b83b
feat : λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄μ˜ λΈ”λž™μ  ν”Œλž˜μ΄μ˜ μ „λž΅μ„ μΈν„°νŽ˜μ΄μŠ€ν™” ν•œλ‹€
Nov 23, 2023
bc99f47
feat : 깨진 ν…ŒμŠ€νŠΈμ½”λ“œ 제거
Nov 23, 2023
0e3a932
refactor : νŒ¨ν‚€μ§€ ꡬ쑰화
Nov 24, 2023
73c8890
refactor : λΆˆν•„μš”ν•œ 주석 제거
Nov 24, 2023
cea03de
refactor : νŒ¨ν‚€μ§€ 이동
Nov 24, 2023
030b03f
refactor : μœ„μΉ˜ λ³€κ²½
Nov 25, 2023
f3ce24d
refactor : ν”½μŠ€μ³λ₯Όμ΄μš©ν•΄μ„œ λ°˜λ³΅λ˜λŠ” 데이터 생성 쀑볡 μ½”λ“œλ₯Ό 제거
Nov 25, 2023
b90b454
refactor : 검증 단언문을 좔가함
Nov 25, 2023
8426423
refactor : λΈ”λž™μž­ κ²Œμž„μœΌλ‘œ 클래슀λ₯Ό 뢄리함
Nov 25, 2023
a83a725
refactor : λ©”μ„œλ“œλͺ… μˆ˜μ •
Nov 25, 2023
a33565d
refactor : λ”œλŸ¬μ˜ 결과정보λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ„œ μ‹¬νŒμ΄ μ •ν•˜λŠ”κ²ƒμ΄ μ•„λ‹Œ, λ”œλŸ¬ 객체 λ‚΄λΆ€μ—μ„œ λ”œλŸ¬μ˜ κ²°κ³Όλ₯Ό λ§Œλ“€λ„λ‘ μˆ˜μ •
Nov 25, 2023
5267bff
refactor : 결과정보λ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ λ‹€λ₯Έ ν”Œλ ˆμ΄μ–΄λΈ”μ„ μž…λ ₯받도둝 μˆ˜μ •
Nov 25, 2023
fb97643
refactor : κ³Όλ„ν•˜κ²Œ λ³΅μž‘ν•œ result 객체듀을 μ œκ±°ν•œλ‹€
Nov 25, 2023
7abf5ad
refactor : λΈ”λž™μž­μ˜ 점수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 도맀인 포μž₯클래슀λ₯Ό μΆ”κ°€ν•œλ‹€
Nov 26, 2023
3ee585d
refactor : BlackJack() 도맀인 포μž₯클래슀λ₯Ό μ μš©ν•œλ‹€
Nov 26, 2023
7c15dae
refactor : BlackJack() 도맀인 포μž₯클래슀λ₯Ό μ μš©ν•΄μ„œ ν”Œλ ˆμ΄μ–΄λΈ” μΈν„°νŽ˜μ΄μŠ€μ—μ„œ λ©”μ‹œμ§€λ‘œ μ‚¬μš©ν•˜κ²Œ μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€
Nov 26, 2023
73e3a94
refactor : λΈ”λž™μž­μ˜ κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 방법을 κ°œμ„ ν•΄μ„œ μž…λ ₯ arg 둜 λ°›λŠ” 클래슀λ₯Ό λ³€κ²½ν•˜μ˜€μŠ΅λ‹ˆλ‹€
Nov 26, 2023
0f0ea7d
refactor : burst μ—¬λΆ€λ₯Ό μ™ΈλΆ€μ˜ 객체(Referee) κ°€ 값을 κΊΌλ‚΄μ„œ νŒλ‹¨ν•΄μ£Όλ˜ κΈ°μ‘΄ 방식을 μˆ˜μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
Nov 26, 2023
8481f0e
refactor : λ¦¬νŒ©ν† λ§μ„ ν•˜λ‹€ λ³΄λ‹ˆ μ‹¬νŒ 역할을 ν•˜λŠ” Referee λ₯Ό μ œκ±°ν• μˆ˜ 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€
Nov 26, 2023
9df4b97
refactor : λŠ˜μ–΄λ‚œ player, Dealer 클래슀의 μ±…μž„κ³Ό 역할을 κ²€μ¦ν•˜κΈ° μœ„ν•΄ λ‹¨μœ„ν…ŒμŠ€νŠΈλ„ μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€
Nov 26, 2023
bc61788
refactor : λ”œλŸ¬μ˜ κ²°κ³Όλ₯Ό λ”œλŸ¬ 클래슀 λ‚΄λΆ€μ—μ„œ κ²°μ •ν•˜λ„λ‘ μˆ˜μ •
Nov 26, 2023
a0f1238
refactor : λͺ¨λ“  ν”Œλ ˆμ΄μ–΄λŠ” νƒˆλ½ν• λ•ŒκΉŒμ§€ μΉ΄λ“œλ₯Ό 받을 수 μžˆλ‹€ κΈ°λŠ₯을 κ΅¬ν˜„
Nov 26, 2023
57bc00c
refactor : μΈν…”λ¦¬μ œμ΄ μ›Œλ‹μ΄ λœ¨μ§€μ•Šλ„λ‘ κ²½κ³ λ₯Ό μˆ˜μ •
Nov 26, 2023
f96536d
refactor : λΈ”λž™μž­ κ²Œμž„μ˜ 룰인, ν”Œλ ˆμ΄μ–΄μ€‘ μ΅œν›„ν¬ ν•œλͺ…이 λ‚¨μ„λ•ŒκΉŒμ§€ μΉ΄λ“œλ₯Ό 받을 수 μžˆλ‹€
Nov 26, 2023
caf5ab4
refactor : λΈ”λž™μž­ κ²Œμž„μ—μ„œ μΉ΄λ“œλ₯Όλ½‘λŠ” 정책을 μ™ΈλΆ€μ—μ„œ μ£Όμž… 받도둝 μˆ˜μ •
Nov 26, 2023
d15d30e
refactor : λΆˆν•„μš”ν•œ λ©”μ„œλ“œ 제거
Nov 26, 2023
149d549
refactor : λΈ”λž™μž­μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜ μΆ”κ°€
Nov 26, 2023
fd79141
refactor : λΈ”λž™μž­ κ²Œμž„μ—μ„œ ν”Œλ ˆμ΄μ–΄μ˜ μƒνƒœλ₯Ό 확인할 수 μžˆλŠ” λ³€μˆ˜ μΆ”κ°€
Nov 26, 2023
92ec4b5
refactor : λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄κ°€ 생쑴여뢀에 λŒ€ν•΄μ„œ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•Šκ³  맀번 κ³„μ‚°ν•˜λ„λ‘ μˆ˜μ •
Nov 26, 2023
0bde0c3
style : style formatting
Nov 26, 2023
b58ab33
test : λ³€ν™”λœ μ±…μž„κ³Ό 역할에 따라 ν…ŒμŠ€νŠΈμ½”λ“œ 이동 및 μΆ”κ°€
Nov 26, 2023
57d5ed8
test : ν”Œλ ˆμ΄μ–΄κ°€ μ΄κΈ°λŠ” κ²½μš°μ— λŒ€ν•œ ν…ŒμŠ€νŠΈμ½”λ“œ μΆ”κ°€
Nov 26, 2023
ec56d38
test : λ”œλŸ¬ ν΄λž˜μŠ€μ— λŒ€ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€
Nov 26, 2023
de4eb89
style : μŠ€νƒ€μΌ ν¬λ©”νŒ…
Nov 26, 2023
f7d07c5
refactor : μ •μ±…μ—μ„œ μž…λ ₯을 받도둝 μˆ˜μ •
Nov 26, 2023
a2a5e6e
refactor : νŒ¨ν‚€μ§€ 이동
Nov 26, 2023
1292c65
refactor : ν”Œλ ˆμ΄μ–΄ 이름을 좜λ ₯ν•˜λ„λ‘ μˆ˜μ •
Nov 26, 2023
3e17672
refactor : 좜λ ₯ 둜직 점검
Nov 26, 2023
9a47953
refactor : 좜λ ₯ 둜직 점검
Nov 26, 2023
515e2a9
refactor : λΆˆν•„μš”ν•œ μ½”λ“œ 제거
Nov 26, 2023
cbf46fc
feat : κ²€μ¦μš© ν•œμ€„, λ””λ²„κΉ…ν¬μΈνŠΈ
Nov 26, 2023
953086a
refactor : νŒ¨ν‚€μ§€ 이동
Nov 27, 2023
9bd27f7
refactor : νŒ¨ν‚€μ§€ 이동
Nov 27, 2023
f3773b7
test : μ—λŸ¬κ°€ λ‚˜λŠ” λΆ€λΆ„μ˜ ν…ŒμŠ€νŠΈμ½”λ“œ μΆ”κ°€
Nov 27, 2023
a81cff6
refactor : 가독성을 늘리기 μœ„ν•΄ νŒŒλ¦¬λ―Έν„° 넀이밍
Nov 27, 2023
f0a699c
refactor : νŒ¨ν‚€μ§€ ꡬ쑰 정리
Nov 27, 2023
d7d3af1
refactor : νŒ¨ν‚€μ§€ ꡬ쑰 정리
Nov 27, 2023
1d1e228
refactor : λΈ”λž™μž­μ˜ κ²½κΈ° κ²°κ³Όλ₯Ό μ •ν•΄μ£ΌλŠ” 클래슀 뢄리
Nov 27, 2023
043ffcc
test : λΈ”λž™μž­μ˜ 룰을 λͺ°λΌ μž‘μœ„μ μœΌλ‘œ μ •ν–ˆλ˜ ν…ŒμŠ€νŠΈμ½”λ“œλ“€μ„ μˆ˜μ •
Nov 27, 2023
930745b
test : λΈ”λž™μž­μ˜ κ²½κΈ° κ²°κ³Όλ₯Ό κ²°μ •ν•˜λŠ” ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€
Nov 27, 2023
366b2b2
test : stand λ₯Ό μ™ΈμΉ˜λ©΄ μžλ™μœΌλ‘œ 더이상 μΉ΄λ“œλ₯Ό 받을 수 μ—†λŠ” μƒνƒœκ°€ λ˜μ–΄μ•Όν•œλ‹€
Nov 27, 2023
be3bc4d
bugfix : 버그가 λ‚˜λŠ” 뢀뢄을 μˆ˜μ •
Nov 27, 2023
b20b5c5
refactor : 잘λͺ» μž‘μ„±λœ ν…ŒμŠ€νŠΈμ½”λ“œ μˆ˜μ •
Nov 27, 2023
4f07cb3
refactor : 좜λ ₯ν˜•μ‹ μˆ˜μ •
Nov 27, 2023
e4a59a0
bugfix : λ”œλŸ¬μ˜ 승패 좜λ ₯ 버그λ₯Ό μˆ˜μ •
Nov 27, 2023
9632f36
test : ν…ŒμŠ€νŠΈμ½”λ“œ μΆ”κ°€
Nov 27, 2023
53faf16
refactor : μƒμ„±μž νŒŒλΌλ―Έν„° μΆ”κ°€
Nov 27, 2023
4769e26
bugfix: λ²„κ·Έμˆ˜μ •
Nov 27, 2023
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
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -65,3 +65,26 @@ Player.hit() : λΈ”λž™μž­μ—μ„œ μΉ΄λ“œλ₯Ό λ°›λŠ” 행동은 "히트" λ”œλŸ¬κ°€
- λ§€μ§λ„˜λ²„, λ§€μ§μŠ€νŠΈλ§μ„ μƒμˆ˜λ‘œ 뢄리해내기 (특히 view, model)
- μ–΄λ–€ ν…ŒμŠ€νŠΈμ½”λ“œκ°€ ν•„μš”ν•œμ§€ μƒκ°ν•˜κ³ (뭘 κ΅¬ν˜„ν•΄μ•Όν•˜μ§€, 뭐가 μš”κ΅¬μ‘°κ±΄μΈμ§€ λ¦¬λ§ˆμΈλ“œ) >> ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  >> ν…ŒμŠ€νŠΈν• μˆ˜ μžˆλ„λ‘ λ¦¬νŒ©ν† λ§ν•˜κΈ°
```

<br><br>

## πŸš€ 3단계 - λΈ”λž™μž­(λ”œλŸ¬)

- μš”κ΅¬μ‚¬ν•­ 뢄석
```text
- λ”œλŸ¬ κΈ°λŠ₯을 κ΅¬ν˜„
- λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ 쀑 μΉ΄λ“œμ˜ 합이 21 λ˜λŠ” 21에 κ°€μž₯ κ°€κΉŒμš΄ 숫자λ₯Ό κ°€μ§€λŠ” μͺ½μ΄ μ΄κΈ°λŠ” κΈ°λŠ₯을 κ΅¬ν˜„
- λ”œλŸ¬λŠ” μ²˜μŒμ— 받은 2μž₯의 합계가 16μ΄ν•˜μ΄λ©΄ λ°˜λ“œμ‹œ 1μž₯의 μΉ΄λ“œλ₯Ό μΆ”κ°€λ‘œ λ°›μ•„μ•Ό ν•˜κ³ , 17점 이상이면 μΆ”κ°€λ‘œ 받을 수 μ—†λ‹€
- λ”œλŸ¬μ˜ 히트/μŠ€ν…λ“œ μ „λž΅μ€ μžλ™μ΄λΌλŠ” μ˜λ―Έμž„. ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„± ν•„μš”

- μ‹¬νŒκΈ°λŠ₯(Referee) : μ μˆ˜κ³„μ‚° $& 승패λ₯Ό νŒλ‹¨
- λ”œλŸ¬κ°€ 21을 μ΄ˆκ³Όν•˜λ©΄ κ·Έ μ‹œμ κΉŒμ§€ 남아 있던 ν”Œλ ˆμ΄μ–΄λ“€μ€ 가지고 μžˆλŠ” νŒ¨μ— 상관 없이 μŠΉλ¦¬ν•œλ‹€.
- λΈ”λž™μž­ κ²Œμž„μ€ λ”œλŸ¬μ™€ ν”Œλ ˆμ΄μ–΄ 쀑 μΉ΄λ“œμ˜ 합이 21 λ˜λŠ” 21에 κ°€μž₯ κ°€κΉŒμš΄ 숫자λ₯Ό κ°€μ§€λŠ” μͺ½μ΄ 이긴닀

-μž…μΆœλ ₯ κΈ°λŠ₯
- κ²Œμž„μ„ μ™„λ£Œν•œ ν›„ 각 ν”Œλ ˆμ΄μ–΄λ³„λ‘œ 승패λ₯Ό 좜λ ₯

```


walkover - λΆ€μ „μŠΉ, λ‚™μŠΉ : μƒλŒ€λ°©(λ”œλŸ¬μ˜ λͺ°μˆ˜νŒ¨λ‘œ μ΄κΈ°λŠ”)
26 changes: 6 additions & 20 deletions src/main/kotlin/blackjack/Controller.kt
Original file line number Diff line number Diff line change
@@ -1,30 +1,16 @@
package blackjack

import blackjack.model.Participants
import blackjack.model.Player
import blackjack.model.BlackJackGame
import blackjack.model.pack.impl.ShuffledPack
import blackjack.view.InputView
import blackjack.view.OutputView

fun main() {
val participants = InputView.join()
participants.dealing()
participants.dealing(ShuffledPack)
OutputView.dealing(participants)
OutputView.presentCards(participants)
while (participants.isContinue()) {
playingBlackJack(participants)
}
OutputView.result(participants)
}

fun playingBlackJack(participants: Participants) {
participants.participants.forEach {
it.hitOrStand()
}
}

private fun Player.hitOrStand() {
if (InputView.askHit(this)) {
this.hit()
}
OutputView.playerCardPresent(this)
BlackJackGame(participants, ShuffledPack).start()
OutputView.presentScores(participants)
OutputView.presentResult(participants)
}
32 changes: 32 additions & 0 deletions src/main/kotlin/blackjack/model/BlackJackGame.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package blackjack.model

import blackjack.model.pack.Pack
import blackjack.model.playblestrategy.PlayingStrategy
import blackjack.model.playblestrategy.impl.DealerStrategy
import blackjack.view.OutputView

class BlackJackGame(
private val participants: Participants,
private val pack: Pack,
) {
fun start() {
while (participants.isContinue()) {
playingBlackJackTurn(pack)
}
}

private fun playingBlackJackTurn(pack: Pack) {
playersTurn(pack)
val dealerScore = participants.dealer.score()
dealerTurn(DealerStrategy(dealerScore), pack)
}

private fun dealerTurn(playingStrategy: PlayingStrategy, pack: Pack) {
val playing = participants.dealer.playing(playingStrategy, pack)
OutputView.presentDealerAction(playing)
}

private fun playersTurn(pack: Pack) {
participants.players.playingTurn(pack)
}
}
6 changes: 6 additions & 0 deletions src/main/kotlin/blackjack/model/BlackJackStatus.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package blackjack.model

enum class BlackJackStatus {
ALIVE,
DIE,
}
22 changes: 12 additions & 10 deletions src/main/kotlin/blackjack/model/Participants.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
package blackjack.model

import blackjack.model.pack.Pack
import blackjack.model.playable.impl.Dealer

class Participants(
val participants: Set<Player>,
val players: Players,
val dealer: Dealer,
) {
fun count(): Int {
return participants.size
}

fun dealing() {
participants.forEach { it.deal() }
fun dealing(pack: Pack) {
players.dealing(pack)
dealer.dealing(pack)
}

private fun isGameOver(): Boolean {
return participants.none { Referee.isBlackJack(it) }
fun isContinue(): Boolean {
return players.hasAnyAlivePlayer() && dealer.isNotBurst()
}

fun isContinue(): Boolean {
return !isGameOver()
fun count(): Int {
return players.count() + 1
}
}
17 changes: 0 additions & 17 deletions src/main/kotlin/blackjack/model/Player.kt

This file was deleted.

45 changes: 45 additions & 0 deletions src/main/kotlin/blackjack/model/Players.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package blackjack.model

import blackjack.model.pack.Pack
import blackjack.model.playable.PlayableResult
import blackjack.model.playable.impl.Dealer
import blackjack.model.playable.impl.Player
import blackjack.model.playblestrategy.impl.ConsoleInputStrategy

class Players(
val values: Set<Player>,
) {
init {
require(values.map { it.name }.distinct().size == values.size) { "Player λ“€μ˜ 이름은 쀑볡이 ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€" }
}

constructor(vararg players: Player) : this(players.toSet())

fun dealing(pack: Pack) {
values.forEach { it.dealing(pack) }
}

fun hasAnyAlivePlayer(): Boolean {
val burstPlayers: List<Boolean> = values.map { it.status() == BlackJackStatus.ALIVE }.toList()
return burstPlayers.contains(true)
}

fun count(): Int {
return values.size
}

fun playingTurn(pack: Pack) {
values.forEach { player ->
if (player.status() == BlackJackStatus.ALIVE) {
player.playing(ConsoleInputStrategy(player), pack)
}
// else {
// println(" ### [κ²€μ¦μš©/μ‚­μ œμ˜ˆμ •] ν”Œλ ˆμ΄μ–΄ ${player.name} 은 DIE μƒνƒœλΌ μΉ΄λ“œλ₯Ό λ°›μ„μˆ˜ μžˆλŠ” κΈ°νšŒκ°€ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€, score=${player.cards.totalScore()}")
// }
}
}

fun results(dealer: Dealer): List<Pair<Player, PlayableResult>> {
return this.values.map { it to it.result(dealer) }
}
}
8 changes: 0 additions & 8 deletions src/main/kotlin/blackjack/model/Referee.kt

This file was deleted.

12 changes: 0 additions & 12 deletions src/main/kotlin/blackjack/model/Suit.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package blackjack.model
package blackjack.model.card

class Card private constructor(
val suit: Suit,
val cardRank: CardRank,
) {
companion object {
private val CARDS: Map<Pair< Suit, CardRank>, Card> by lazy {
private val CARDS: Map<Trump, Card> by lazy {
Suit.values().flatMap { suit ->
CardRank.values().map { rank ->
(suit to rank) to Card(suit, rank)
Trump(suit to rank) to Card(suit, rank)
}
}.toMap()
}

fun of(suit: Suit, cardRank: CardRank): Card {
return requireNotNull(this.CARDS[suit to cardRank]) { "μž…λ ₯된 suit=[$suit] , cardRank=[$cardRank] λŠ” μ°Ύμ„μˆ˜ μ—†μŠ΅λ‹ˆλ‹€" }
return requireNotNull(CARDS[Trump(suit to cardRank)]) { "μž…λ ₯된 suit=[$suit] , cardRank=[$cardRank] λŠ” μ°Ύμ„μˆ˜ μ—†μŠ΅λ‹ˆλ‹€" }
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package blackjack.model
package blackjack.model.card

enum class CardRank(
val score: Int,
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
package blackjack.model
package blackjack.model.card

import blackjack.model.playable.BlackjackScore

class Cards(
cards: List<Card> = emptyList(),
@@ -10,11 +12,11 @@ class Cards(
_cards.add(card)
}

fun totalScore(): Int {
fun totalScore(): BlackjackScore {
if (this.isContainsAce()) {
return scoreWithAce()
return BlackjackScore(scoreWithAce())
}
return simpleSumOfScore()
return BlackjackScore(simpleSumOfScore())
}

private fun simpleSumOfScore(): Int {
@@ -28,10 +30,10 @@ class Cards(

private fun scoreWithAce(): Int {
val simpleSum = simpleSumOfScore()
if (simpleSum + ALTERNATIVE_ACE_SCORE_DIFF > HIGHEST_SCORE) {
if (simpleSum + ACE_BONUS_SCORE > HIGHEST_SCORE) {
return simpleSum
}
return simpleSum + ALTERNATIVE_ACE_SCORE_DIFF
return simpleSum + ACE_BONUS_SCORE
}

fun count(): Int {
@@ -40,7 +42,7 @@ class Cards(

companion object {
private const val HIGHEST_SCORE: Int = 21
private const val ALTERNATIVE_ACE_SCORE_DIFF: Int = 11 - 1
private const val ACE_BONUS_SCORE: Int = 10

fun emptyCards(): Cards {
return Cards(mutableListOf())
11 changes: 11 additions & 0 deletions src/main/kotlin/blackjack/model/card/Suit.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package blackjack.model.card

enum class Suit(
val alias: String,
) {
SPADE("μŠ€νŽ˜μ΄λ“œ"),
HEART("ν•˜νŠΈ"),
DIAMOND("닀이아"),
CLOVER("ν΄λ‘œλ²„"),
;
}
6 changes: 6 additions & 0 deletions src/main/kotlin/blackjack/model/card/Trump.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package blackjack.model.card

@JvmInline
value class Trump(
val trump: Pair<Suit, CardRank>,
)
2 changes: 1 addition & 1 deletion src/main/kotlin/blackjack/model/pack/Pack.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package blackjack.model.pack

import blackjack.model.Card
import blackjack.model.card.Card

interface Pack {
fun pickCard(): Card
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package blackjack.model.pack
package blackjack.model.pack.impl

import blackjack.model.Card
import blackjack.model.CardRank
import blackjack.model.Suit
import blackjack.model.card.Card
import blackjack.model.card.CardRank
import blackjack.model.card.Suit
import blackjack.model.pack.Pack
import kotlin.random.Random

object ShuffledPack : Pack {
@@ -21,6 +22,6 @@ object ShuffledPack : Pack {
}

private fun randomInRange(range: Int): Int {
return this.random.nextInt(0, Int.MAX_VALUE) % range
return random.nextInt(0, Int.MAX_VALUE) % range
}
}
28 changes: 28 additions & 0 deletions src/main/kotlin/blackjack/model/playable/BlackjackScore.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package blackjack.model.playable

@JvmInline
value class BlackjackScore(
val value: Int
) {
infix fun vs(other: BlackjackScore): PlayableResult {
if (this.value == other.value) {
return PlayableResult.DRAW
}
if (this.value > other.value) {
return PlayableResult.WIN
}
return PlayableResult.LOSE
}

fun isBurst(): Boolean {
return this.value > BLACK_JACK_SCORE
}

operator fun compareTo(other: BlackjackScore): Int {
return this.value.compareTo(other.value)
}

companion object {
private const val BLACK_JACK_SCORE: Int = 21
}
}
14 changes: 14 additions & 0 deletions src/main/kotlin/blackjack/model/playable/Playable.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package blackjack.model.playable

import blackjack.model.BlackJackStatus
import blackjack.model.pack.Pack
import blackjack.model.playblestrategy.PlayingStrategy

interface Playable {
fun score(): BlackjackScore
fun dealing(pack: Pack)
fun playing(playingStrategy: PlayingStrategy, pack: Pack): PlayableReaction
fun result(playable: Playable): PlayableResult
fun isBurst(): Boolean
fun status(): BlackJackStatus
}
6 changes: 6 additions & 0 deletions src/main/kotlin/blackjack/model/playable/PlayableReaction.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package blackjack.model.playable

enum class PlayableReaction {
HIT,
STAND
}
Loading