Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
4d992f1
docs(README): add feature list
Yeji-Kim-Erica Mar 4, 2026
37074a5
feat: add name input feature
Yeji-Kim-Erica Mar 5, 2026
070e5ba
feat: add hit or stand input feature
Yeji-Kim-Erica Mar 5, 2026
0e85d53
feat: add game instruction output feature
Yeji-Kim-Erica Mar 5, 2026
f121afe
docs : add domains features
Yeji-Kim-Erica Mar 5, 2026
e2d44c2
test : add card contents test
Yeji-Kim-Erica Mar 5, 2026
8582f6d
feat : add card and enum class for card
Yeji-Kim-Erica Mar 5, 2026
11fb3ea
test : add deck creation test
Yeji-Kim-Erica Mar 5, 2026
644c62b
feat : add deck creation feature
Yeji-Kim-Erica Mar 5, 2026
b80246c
docs : check what I implemented
Yeji-Kim-Erica Mar 5, 2026
3a01775
test : add deck test
Yeji-Kim-Erica Mar 5, 2026
ab9bdbc
feat : add DRAW_CARD_OUT_OF_RANGE
Yeji-Kim-Erica Mar 5, 2026
8571797
feat : add new deck features
Yeji-Kim-Erica Mar 5, 2026
b8d0a79
test: add participant deck creation and cards draw
Yeji-Kim-Erica Mar 5, 2026
6c65b8c
feat: add participant deck creation feature
Yeji-Kim-Erica Mar 5, 2026
fac0ae3
docs: check what I implemented
Yeji-Kim-Erica Mar 5, 2026
4772f2a
refactor: seperate card creation responsibility
Yeji-Kim-Erica Mar 5, 2026
debd9c0
refactor: change ace default card score
Yeji-Kim-Erica Mar 5, 2026
5598c39
feat: add card sum calculation excluding aces
Yeji-Kim-Erica Mar 5, 2026
12c235e
feat: add ace score discrimination feature
Yeji-Kim-Erica Mar 5, 2026
430f617
feat: add card score related feature
Yeji-Kim-Erica Mar 5, 2026
80d3469
feat: add card addition feature
Yeji-Kim-Erica Mar 5, 2026
200ce6c
feat: add conditional card drawing feature for dealer
Yeji-Kim-Erica Mar 5, 2026
b79ef33
refactor: change dealer constructor parameter name
Yeji-Kim-Erica Mar 6, 2026
160cc41
test: add dealer constructor test
Yeji-Kim-Erica Mar 6, 2026
7721bca
refactor : separate common logic between Dealer and Player
Yeji-Kim-Erica Mar 6, 2026
ddf4f94
fix : block call addCard method in Dealer Instance
Yeji-Kim-Erica Mar 6, 2026
f6ed131
fix : fix typo
Yeji-Kim-Erica Mar 6, 2026
638445c
refactor: delete '\n'
Yeji-Kim-Erica Mar 6, 2026
30ef159
feat: add Player class
Yeji-Kim-Erica Mar 6, 2026
61377fc
docs: check what is implemented
Yeji-Kim-Erica Mar 6, 2026
3790ad7
refactor : change variable name to `totalDeck`
Yeji-Kim-Erica Mar 7, 2026
ee65136
fix : integrate adding card feature
Yeji-Kim-Erica Mar 7, 2026
08f1a5e
feat : add createParticipants feature
Yeji-Kim-Erica Mar 7, 2026
a78de9b
fix: refactor participant list to a first-class collection
Yeji-Kim-Erica Mar 7, 2026
627bee8
feat: add game creation feature
Yeji-Kim-Erica Mar 7, 2026
b0a7be8
refactor : change user input method to Scanner
Yeji-Kim-Erica Mar 7, 2026
9e65f06
feat : add constraint to Participants number
Yeji-Kim-Erica Mar 7, 2026
00e8662
build : add mockito for test logic
Yeji-Kim-Erica Mar 7, 2026
ec4784b
feat: add initial card share detail printing feature
Yeji-Kim-Erica Mar 7, 2026
b6ea495
refactor: replace Participants with Players and restructure Game
Yeji-Kim-Erica Mar 7, 2026
44e10cf
feat: add name validation feature
Yeji-Kim-Erica Mar 8, 2026
223b55e
feat: add create result feature
Yeji-Kim-Erica Mar 8, 2026
ce29cb5
refactor: divide card creation method
Yeji-Kim-Erica Mar 8, 2026
9196820
refactor: introduce DTO
Yeji-Kim-Erica Mar 8, 2026
aa38ca7
feat: bring in Delegate method
Yeji-Kim-Erica Mar 8, 2026
60d6dfb
feat: add card info and game result printing feature
Yeji-Kim-Erica Mar 8, 2026
2fb6f4b
feat: add card info and game result printing feature
Yeji-Kim-Erica Mar 8, 2026
9b63e36
Revert "feat: add card info and game result printing feature"
Yeji-Kim-Erica Mar 8, 2026
4283373
Revert "feat: add card info and game result printing feature"
Yeji-Kim-Erica Mar 8, 2026
d4c97f6
feat: add flow control logic and game progression feature
Yeji-Kim-Erica Mar 8, 2026
c8818cd
feat: assemble components for running
Yeji-Kim-Erica Mar 8, 2026
8bf85fb
fix : change position of NAME_PATTERN
kdongsu5509 Mar 10, 2026
b7335e9
fix : change method type to static
kdongsu5509 Mar 10, 2026
2e065d3
refactor : delete .gitkeep
kdongsu5509 Mar 10, 2026
49b26f4
fix : change the method call method
kdongsu5509 Mar 10, 2026
68b5af8
fix : change variable type list to deque
kdongsu5509 Mar 10, 2026
77c2d39
fix : separate Deck
kdongsu5509 Mar 10, 2026
368930b
fix : change List to Deque
kdongsu5509 Mar 10, 2026
468c59c
fix : change Deck to Hand
kdongsu5509 Mar 10, 2026
e44a187
fix : change dealer consturctor of test
kdongsu5509 Mar 10, 2026
97196d5
fix : change play constructor logic and add user uniqueness logic
kdongsu5509 Mar 10, 2026
dab5db9
fix : change construction test
kdongsu5509 Mar 10, 2026
1caf045
test : add duplication logic test code and change constructor of playโ€ฆ
kdongsu5509 Mar 10, 2026
0fc9a8f
fix : add isBust method that extracted from Deck
kdongsu5509 Mar 11, 2026
1dc6cc3
fix : add addCard method that extract from Deck
kdongsu5509 Mar 11, 2026
1ff3368
test : add addCard test and fix isBust test logic to use boundary value
kdongsu5509 Mar 11, 2026
26e608a
fix : change position of hit logic
kdongsu5509 Mar 11, 2026
5de2106
fix : add change turn logic
kdongsu5509 Mar 11, 2026
0dce66a
fix : separate responsibility
kdongsu5509 Mar 11, 2026
042e6ec
fix : add test logic of isFinished
kdongsu5509 Mar 11, 2026
b147e7f
fix : change find Next Player logic
kdongsu5509 Mar 11, 2026
70793a9
fix : delete duplicated logic
kdongsu5509 Mar 11, 2026
528b5d7
feat : override eqauls of Player
kdongsu5509 Mar 11, 2026
247e5fe
fix : add stand logic in players
kdongsu5509 Mar 11, 2026
bfa4055
fix : delete unnecessary feature
kdongsu5509 Mar 11, 2026
72c323a
fix : change hand to immutable object
kdongsu5509 Mar 11, 2026
8ae3293
fix : change logic via method name changing
kdongsu5509 Mar 11, 2026
41c7175
fix : change assertion logic
kdongsu5509 Mar 11, 2026
8066d08
fix : change method name
kdongsu5509 Mar 11, 2026
e7e2bec
fix : change return type of method hit and rename some method
kdongsu5509 Mar 11, 2026
bcee504
fix : commennt out getname method
kdongsu5509 Mar 11, 2026
48ac237
feat : add ErrorMessage of PLAYER_NOT_FOUND
kdongsu5509 Mar 11, 2026
bff9364
fix : update showCards logic
kdongsu5509 Mar 11, 2026
3bc7161
fix : move showCards method in Participant and implement that at chilโ€ฆ
kdongsu5509 Mar 11, 2026
4c0c499
fix : comment out print initial state logic and rename of those
kdongsu5509 Mar 11, 2026
ff92b24
fix : comment out setting linkers of this program
kdongsu5509 Mar 11, 2026
ea1ad51
fix : rename card to cardsInfo
kdongsu5509 Mar 11, 2026
5397023
fix : change return Type of hit or stand method
kdongsu5509 Mar 11, 2026
0be109f
feat : add new Error Message No more playable player
kdongsu5509 Mar 11, 2026
b7f7b6a
fix : rename file to GameResult
kdongsu5509 Mar 11, 2026
24d433c
fix : delete unnecessary method
kdongsu5509 Mar 11, 2026
5fc23ff
fix : change method acceess modifier
kdongsu5509 Mar 11, 2026
753f32e
fix : comment out dealer hit or stand logic
kdongsu5509 Mar 11, 2026
a9acadf
fix : add common interface and comment out getOwnCardsSum method
kdongsu5509 Mar 11, 2026
05b0758
fix : comment out printing logic that need to run main playing logic
kdongsu5509 Mar 11, 2026
960e9c0
fix : upgrade logic aspect of visibiliity
kdongsu5509 Mar 11, 2026
1c20425
fix : add ommited feature and test logic
kdongsu5509 Mar 12, 2026
984032e
feat : add compare transfer feature
kdongsu5509 Mar 12, 2026
0721dee
fix : rename file and add collecting feature of PlayerResultDto
kdongsu5509 Mar 12, 2026
7cffcf5
fix : uncomment test logic of Deck
kdongsu5509 Mar 12, 2026
cfe89d7
fix : uncomment addCard test
kdongsu5509 Mar 12, 2026
0a47bad
fix : change decide logic and add test
kdongsu5509 Mar 12, 2026
7ad4553
test : add equal override test
kdongsu5509 Mar 12, 2026
fc32152
fix : update readabillity of outputView
kdongsu5509 Mar 12, 2026
f3c5cdd
fix : update dto classes to upgrade readabillity
kdongsu5509 Mar 12, 2026
bfd9c37
fix : rename to BlackJackGame
kdongsu5509 Mar 12, 2026
86dbfe0
fix : delete delegate pattern of this proj
kdongsu5509 Mar 12, 2026
6d412f5
fix : change error message to clarify
kdongsu5509 Mar 12, 2026
116ba65
fix : refactor game logic
kdongsu5509 Mar 12, 2026
16181df
fix : change controller logic
kdongsu5509 Mar 12, 2026
1831d8e
fix : fix controller test
kdongsu5509 Mar 12, 2026
714eb80
fix : delete unused logic
kdongsu5509 Mar 12, 2026
fb55d62
fix : delete comment
kdongsu5509 Mar 12, 2026
02458ce
docs : update docs to reflect newest proj contents
kdongsu5509 Mar 12, 2026
ef06868
fix : wrapping name to meet programming req
kdongsu5509 Mar 12, 2026
ddb8b64
fix : adopt state pattern to meet programming requirement
kdongsu5509 Mar 12, 2026
c3d2d74
fix : delete dependency of view at controller
kdongsu5509 Mar 13, 2026
6e79c80
fix : import new GameStateDto for low cohension between BlackJackContโ€ฆ
kdongsu5509 Mar 13, 2026
135e1eb
Merge with logic of cycle2
kdongsu5509 Mar 13, 2026
22cd46f
fix : clarify state per exact case
kdongsu5509 Mar 13, 2026
363e170
fix : change list to map
kdongsu5509 Mar 13, 2026
7f62ae0
fix : refactor game states
kdongsu5509 Mar 13, 2026
ee58305
feat : add BetAmount Domain
kdongsu5509 Mar 13, 2026
e7c6a6b
feat : add in-out logic for betting
kdongsu5509 Mar 13, 2026
9c1a233
feat : add bet Process
kdongsu5509 Mar 13, 2026
1f42451
fix : change result printing logic
kdongsu5509 Mar 13, 2026
d8c0824
test : add test of betting logic
kdongsu5509 Mar 13, 2026
5df0e69
fix : change io flow to meet requirements
kdongsu5509 Mar 13, 2026
4fd489c
docs : update readme
kdongsu5509 Mar 13, 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
94 changes: 43 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,87 +13,79 @@
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ๊ณต๋ฐฑ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** `y` ํ˜น์€ `n`์ด ์•„๋‹Œ ๊ฒฝ์šฐ

- ๋ฒ ํŒ… ๊ธˆ์•ก์„ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค
- ๊ณต๋ฐฑ ๋ฌธ์ž์—ด์ธ ๊ฒฝ์šฐ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

### ์ถœ๋ ฅ

- ๊ฒŒ์ž„ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
- ์ด๋ฆ„ ์ž…๋ ฅ ์•ˆ๋‚ด
- HIT ํ˜น์€ STAND ์—ฌ๋ถ€ ์งˆ๋ฌธ
- ๋”œ๋Ÿฌ์˜ ์นด๋“œ ์ถ”๊ฐ€ ์—ฌ๋ถ€
- ๋ฒ ํŒ… ๊ธˆ์•ก ์ž…๋ ฅ ์•ˆ๋‚ด
- ์ดˆ๊ธฐ ์นด๋“œ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
- ์ตœ์ข… ์นด๋“œ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
- ์ตœ์ข… ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

## ๋„๋ฉ”์ธ

### MultiPlayers

- ํ”Œ๋ ˆ์ด์–ด๋“ค ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ
- ์ด๋ฆ„ ์ค‘๋ณต ๊ฒ€์ฆ
- ํ”Œ๋ ˆ์ด ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ์ฐพ๊ธฐ
- ํŠน์ • ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ hit, stand ์ง€์‹œ
- ํ”Œ๋ ˆ์ด์–ด๋“ค์˜ ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ์กฐ์‚ฌ
- ํ”Œ๋ ˆ์ด์–ด๋“ค์˜ ์ดˆ๊ธฐ ์นด๋“œ ์ •๋ณด ์กฐ์‚ฌ
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ํ”Œ๋ ˆ์ด์–ด ์ˆ˜๊ฐ€ 5๋ช…์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalArgumentException`)
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ์ค‘๋ณต๋œ ์ด๋ฆ„์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalArgumentException`)
- ํ”Œ๋ ˆ์ด์–ด ๋ฒ ํŒ… ๊ด€๋ฆฌ
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ์•ก์…˜์„ ์ง€์‹œํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ
- ๊ฒŒ์ž„ ์ง„ํ–‰ ๋Œ€๊ธฐ ์ค‘์ธ(Hit/Stand ๊ฐ€๋Šฅํ•œ) ํ”Œ๋ ˆ์ด์–ด ํƒ์ƒ‰
- ํŠน์ • ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ Hit/Stand ์ง€์‹œ
- ๋ชจ๋“  ํ”Œ๋ ˆ์ด์–ด์˜ ์ดˆ๊ธฐ (์นด๋“œ) ์ƒํƒœ ๋ฐ ๊ฒŒ์ž„ ์ŠนํŒจ ๊ฒฐ๊ณผ ์กฐํšŒ

### Participant

- ์ด๋ฆ„ ๊ฒ€์ฆ
- ๊ณต๋ฐฑ ๋ถˆ๊ฐ€
- ํ•œ๊ตญ์–ด, ์•ŒํŒŒ๋ฒณ๋งŒ ํ—ˆ์šฉ
- Hand๋ฅผ ์ด์šฉํ•œ ๋ณด์œ  ์นด๋“œ ์ •๋ณด ์ œ๊ณต
- ์ดˆ๊ธฐ ์นด๋“œ
- ๊ตฌ์„ฑ
- ํ•ฉ
- Hand๋ฅผ ์ด์šฉํ•œ Bust ์ •๋ณด ์ œ๊ณต
- Hand๋ฅผ ์ด์šฉํ•œ BlackJack ์—ฌ๋ถ€ ์ œ๊ณต
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ์ด๋ฆ„์ด ๊ณต๋ฐฑ์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ์˜์–ด๋‚˜ ํ•œ๊ธ€ ์™ธ์˜ ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ
- ์ฐธ๊ฐ€์ž์˜ ์ดˆ๊ธฐ ๋ถ€์—ฌ ์นด๋“œ ๋ฐ ์ „์ฒด ๋ณด์œ  ์นด๋“œ ๋ฐ˜ํ™˜
- ์ฐธ๊ฐ€์ž๊ฐ€ ๋ฒ ํŒ…์„ ๋งˆ์ณค๋Š”์ง€ ์—ฌ๋ถ€ ๋ฐ˜ํ™˜
- ์ฐธ๊ฐ€์ž๊ฐ€ ๋ณด์œ ํ•œ ์นด๋“œ ์ˆซ์ž์˜ ์ดํ•ฉ ๋ฐ˜ํ™˜

### Dealer

- ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์นด๋“œ ์ถ”๊ฐ€
- ์ ์ˆ˜ ํ•ฉ์ด 16 ์ดํ•˜์ธ ๊ฒฝ์šฐ
- ์ ์ˆ˜ ํ•ฉ์ด 16 ์ดํ•˜์ธ ๊ฒฝ์šฐ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์นด๋“œ ์ถ”๊ฐ€(Hit)
- ์ ์ˆ˜๊ฐ€ 16์„ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์นด๋“œ ์ถ”๊ฐ€ ์ค‘์ง€(Stay) ์ƒํƒœ๋กœ ์ „ํ™˜
- ๋”œ๋Ÿฌ์˜ ์ดˆ๊ธฐ ์นด๋“œ(1์žฅ) ๋ฐ˜ํ™˜ ๊ธฐ๋Šฅ

### Player

- ๊ฒŒ์ž„ ์ง„ํ–‰ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํŒ๋ณ„
- Hand๋ฅผ ์ด์šฉํ•˜์—ฌ isBust ํŒ๋ณ„
- ๊ฒŒ์ž„ ์ง„ํ–‰ ์˜์‚ฌ ๊ด€๋ฆฌ
- ์ดˆ๊ธฐ ๋ณด์œ  ์นด๋“œ ๋ณด์—ฌ์ฃผ๊ธฐ
- Hand๋ฅผ ์ด์šฉํ•œ ์นด๋“œ ์ถ”๊ฐ€
- ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์นด๋“œ ์ถ”๊ฐ€
- ๋ฒ„์ŠคํŠธ ์ƒํƒœ๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ
- ๋ฐฐํŒ… ๊ธˆ์•ก ๊ด€๋ฆฌ ๋ฐ ๋ฒ ํŒ… ์ƒํƒœ ์ ๊ฒ€
- ํ”Œ๋ ˆ์ด์–ด ๋‹จ์œ„์˜ Hit/Stand ๊ฒŒ์ž„ ์ง„ํ–‰ ์•ก์…˜ ์ˆ˜ํ–‰
- ๊ฒŒ์ž„ ์ง„ํ–‰ ๊ฐ€๋Šฅ ์—ฌ๋ถ€(Bust ๋˜๋Š” Blackjack ์ƒํƒœ๊ฐ€ ์•„๋‹˜) ํŒ๋ณ„
- ํ”Œ๋ ˆ์ด์–ด ํ„ด์˜ ์ข…๋ฃŒ ์—ฌ๋ถ€ ํ™•์ธ ๋ฐ ๋”œ๋Ÿฌ์™€์˜ ์ŠนํŒจ ๊ฒฐ๊ณผ(GameResult) ๊ณ„์‚ฐ
- ์ดˆ๊ธฐ ๋ถ€์—ฌ๋ฐ›์€ 2์žฅ์˜ ๋ณด์œ  ์นด๋“œ ๋ฐ˜ํ™˜

### Card
- ์นด๋“œ์˜ ํ˜•์ƒ(Spade, Heart, Diamond, Club) ๋ฐ ์ˆซ์ž(Ace ~ King) ์ •๋ณด ๊ด€๋ฆฌ ๋ฐ ์ œ๊ณต

- ์นด๋“œ ์ •๋ณด ๊ด€๋ฆฌ ๋ฐ ์ œ๊ณต
### BetAmount
- ๋ฐฐํŒ… ๊ธˆ์•ก ์ถ”์  ๋ฐ ์˜ˆ์™ธ ์ƒํ™ฉ ๊ด€๋ฆฌ
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์ž…๋ ฅ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalArgumentException`)
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ๋ฒ ํŒ… ๊ธˆ์•ก์ด 0์› ์ดํ•˜์ผ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalArgumentException`)

### Deck

- ์ „์ฒด ์นด๋“œ ๊ด€๋ฆฌ
- ์นด๋“œ 1์žฅ ๋ฝ‘๊ธฐ
- ์นด๋“œ 2์žฅ ๋ฝ‘๊ธฐ
- ์ „๋žต(Random ๋“ฑ) ๊ธฐ๋ฐ˜ ๋ฑ ๊ตฌ์„ฑ ๋ฐ ์ „์ฒด ์นด๋“œ ๊ด€๋ฆฌ
- ์ดˆ๊ธฐ ๋ถ€์—ฌ์šฉ ์นด๋“œ 2์žฅ ๋ฝ‘๊ธฐ ๋ฐ ์นด๋“œ 1์žฅ ๋ฝ‘๊ธฐ
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ๋ฑ์— ๋” ์ด์ƒ ์นด๋“œ๊ฐ€ ๋‚จ์•„์žˆ์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์นด๋“œ๋ฅผ ๋ฝ‘์œผ๋ ค ํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalArgumentException`)

### Hand

- ์‚ฌ์šฉ์ž ๋ณด์œ  ์นด๋“œ ๊ด€๋ฆฌ
- Bust ํŒ์ •
- blackJack ํŒ์ •
- ๊ฒŒ์ž„ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ์นด๋“œ ์ถ”๊ฐ€
- ์ด์  ๊ณ„์‚ฐ
- ๋ณด์œ  ์นด๋“œ์˜ ์ƒํƒœ(Bust, Blackjack, ๋ณด์œ  ์นด๋“œ ์ด์ ) ํŒ๋‹จ
- ๊ฒŒ์ž„ ์กฐ๊ฑด์— ๋งž์ถฐ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ƒˆ๋กœ์šด ํ•ธ๋“œ ๊ตฌ์„ฑ ๋ฐ˜ํ™˜

### BlackJackGame

- ๊ฒŒ์ž„ ์ค€๋น„
- ๋”œ๋Ÿฌ, ํ”Œ๋ ˆ์ด์–ด๋“ค, ์ „์ฒด ๋ฑ ์ƒ์„ฑ
- ๊ฒŒ์ž„์˜ turn ๊ด€๋ฆฌ.
- ํŠน์ • ์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์•„ hit / stand ์‹คํ–‰
- ๋ชจ๋“  ๊ฒŒ์ž„ ์ฐธ๊ฐ€์ž๋“ค์˜ ์ดˆ๊ธฐ ์ •๋ณด ์กฐ์‚ฌ
- ๋ชจ๋“  ๊ฒŒ์ž„ ์ฐธ๊ฐ€์ž๋“ค์˜ ๊ฒฐ๊ณผ ์กฐ์‚ฌ
- ๊ฒŒ์ž„ ์ค€๋น„ (๋”œ๋Ÿฌ, ๋ฉ€ํ‹ฐ ํ”Œ๋ ˆ์ด์–ด๋“ค, ์ „์ฒด ๋ฑ ์ƒ์„ฑ)
- ํ˜„์žฌ ๋ˆ„๊ตฌ์˜ ํ„ด(๋ฒ ํŒ… ํ„ด ๋˜๋Š” ํ”Œ๋ ˆ์ด ํ„ด)์ธ์ง€ ํ™•์ธ ๋ฐ ์ƒํƒœ ์ถ”์ 
- ํ˜„์žฌ ํ„ด์ธ ์‚ฌ์šฉ์ž์— ๋งž๊ฒŒ Hit, Stand, ํ˜น์€ Dealer Play ๋‹จ๊ณ„ ์‹คํ–‰
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ๋ฒ ํŒ…์„ ์ง„ํ–‰ํ•  ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†๋Š”๋ฐ ๋ฒ ํŒ…์„ ์‹œ๋„ํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalStateException`)
- **(์˜ˆ์™ธ ์ฒ˜๋ฆฌ)** ์นด๋“œ๋ฅผ ๋” ์ด์ƒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†๋Š”๋ฐ Hit/Stand๋ฅผ ์‹œ๋„ํ•  ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ (`IllegalStateException`)
- ๋ชจ๋“  ๊ฒŒ์ž„ ์ฐธ๊ฐ€์ž๋“ค์˜ ์ดˆ๊ธฐ ์ƒํƒœ ๋ฐ ์ตœ์ข… ๊ฒฐ๊ณผ ์ •๋ณด ์กฐ์‚ฌ ๋ฐ˜ํ™˜

### BlackJackController

- ๊ฒŒ์ž„ ์ „๋ฐ˜์—์„œ ํ•„์š”ํ•œ I/O ๊ด€๋ฆฌ
- ๊ฒŒ์ž„ ์ง„ํ–‰ ์ƒํ™ฉ ์ถœ๋ ฅ ๊ด€๋ฆฌ
- ์ดˆ๊ธฐ ์ƒํƒœ
- ํŠน์ • ๋‹จ๊ณ„์—์„œ์˜ ์‚ฌ์šฉ์ž ์ •๋ณด
- ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์ž…๋ ฅ ๊ด€๋ฆฌ
- hit ํ˜น์€ stand ์—ฌ๋ถ€ ์ž…๋ ฅ ๊ด€๋ฆฌ
- ๊ฒŒ์ž„ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ด€๋ฆฌ
- ์ž…์ถœ๋ ฅ(View)๊ณผ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์—ฐ๋™ ๋ฐ ์ „์ฒด ๊ฒŒ์ž„ ํ๋ฆ„ ์ œ์–ด
- ์ดˆ๊ธฐ ์„ค์ •(์ฐธ๊ฐ€์ž ๋“ฑ๋ก), ๋ฒ ํŒ… ํ„ด ์ง„ํ–‰, ํ”Œ๋ ˆ์ด ํ„ด ์ง„ํ–‰ ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰
- ์˜ˆ์™ธ ์ƒํ™ฉ ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ์ •์ƒ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต ์ž…๋ ฅ(I/O Retry) ํ๋ฆ„ ๊ด€๋ฆฌ
5 changes: 4 additions & 1 deletion src/main/java/common/ErrorMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ public enum ErrorMessage {
ONLY_KO_AND_ENG("์ด๋ฆ„์€ ์˜์–ด ๋˜๋Š” ํ•œ๊ตญ์–ด๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค: "),
NAME_UNIQUENESS_ERR("์ด๋ฆ„์€ ์ค‘๋ณต๋˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค"),
PLAYER_NOT_FOUND("ํ•ด๋‹น ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"),
NO_MORE_PLAYABLE_PLAYER("๋” ์ด์ƒ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."),
NO_MORE_PLAYABLE_PLAYER("๋” ์ด์ƒ ๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค"),
NO_MORE_BETTABLE_PLAYER("๋ฒ ํŒ…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค"),
NOT_ALLOW_METHOD_CALL("ํ˜„์žฌ ์ƒํƒœ์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค"),
ZERO_MINUS_MONEY("0์› ์ดํ•˜ ๊ธˆ์•ก์„ ๋ฒ ํŒ…ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค"),
ONLY_NUMBER("์ˆซ์ž๋งŒ ์ž…๋ ฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค"),
MAX_PLAYER_ERROR("์ตœ๋Œ€ ์ธ์›์„ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค.");

private final String message;
Expand Down
36 changes: 18 additions & 18 deletions src/main/java/controller/BlackJackController.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,8 @@ public BlackJackController(InputView inputView,

public void doGameProcess() {
BlackJackGame game = retry(this::readyGame);
outputView.printInitialStates(
game.getDealerGameSettingState(),
game.getPlayersGameSettingStates()
);
betPlayers(game);
outputView.printInitialStates(game.getGameSettingState());

playPlayersTurn(game);
playDealerTurn(game);
Expand All @@ -37,6 +35,15 @@ public void doGameProcess() {
outputView.printGameResult(gameResults);
}

private void betPlayers(BlackJackGame game) {
while (game.whoseBettingTurn().isPresent()) {
Player currentPlayer = game.whoseBettingTurn().get();
outputView.printBetAmountPrompt(currentPlayer.getName());
String betAmountValue = retry(inputView::readBetAmountValue);
game.doBetProcess(betAmountValue);
}
}

private BlackJackGame readyGame() {
outputView.printNamePrompt();
List<String> playerNames = inputView.readNames();
Expand All @@ -50,22 +57,16 @@ private void playDealerTurn(BlackJackGame game) {
}

private void playPlayersTurn(BlackJackGame game) {
while (game.whoseTurn().isPresent()) {
Player currentPlayer = game.whoseTurn().get();

if (currentPlayer.isFinished()) {
handlePlayerStandProcess(game);
continue;
}

while (game.whosePlayTurn().isPresent()) {
Player currentPlayer = game.whosePlayTurn().get();
outputView.printHitOrStandPrompt(currentPlayer.getName());
String hitOrStandInfo = retry(inputView::readHitOrStand);
doHitOrStand(hitOrStandInfo, game);
boolean wantToHit = retry(inputView::wantToHit);
doHitOrStand(wantToHit, game);
}
}

private void doHitOrStand(String hitOrStand, BlackJackGame game) {
if (hitOrStand.equals("y")) {
private void doHitOrStand(boolean wantToHit, BlackJackGame game) {
if (wantToHit) {
handlePlayerHitProcess(game);
} else {
handlePlayerStandProcess(game);
Expand Down Expand Up @@ -93,5 +94,4 @@ private <T> T retry(Supplier<T> supplier) {
}
}
}
}

}
36 changes: 36 additions & 0 deletions src/main/java/domain/BetAmount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package domain;

import common.ErrorMessage;

public record BetAmount(
int betAmount
) {
public static BetAmount of(String betAmountValue) {
int betAmount = parseBetAmount(betAmountValue);
validatePositiveNumber(betAmount);
return new BetAmount(betAmount);
}

private static void validatePositiveNumber(int betAmount) {
if (betAmount <= 0) {
throw new IllegalArgumentException(ErrorMessage.ZERO_MINUS_MONEY.getMessage());
}
}

private static int parseBetAmount(String betAmountValue) {
try {
return Integer.parseInt(betAmountValue);
} catch (NumberFormatException e) {
throw new IllegalArgumentException(ErrorMessage.ONLY_NUMBER.getMessage());
}
}

public static BetAmount empty() {
return new BetAmount(0);
}

public boolean isBetPlaced() {
return betAmount != 0;
}
}

26 changes: 18 additions & 8 deletions src/main/java/domain/BlackJackGame.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import domain.state.GameState;
import dto.DealerResultDto;
import dto.GameResultDto;
import dto.GameStateDto;
import dto.ParticipantDto;
import dto.PlayerResultDto;
import java.util.List;
Expand Down Expand Up @@ -36,14 +37,24 @@ private static Dealer createNewDealer(Deck totalDeck) {
dealersInitialCards.get(1)
);
return Dealer.from(
GameState.createDealerInitialGameState(initialDealerHand)
GameState.createInitialGameState(initialDealerHand)
);
}

public Optional<Player> whoseTurn() {
public Optional<Player> whoseBettingTurn() {
return multiPlayers.findNotBetPlayer();
}

public Optional<Player> whosePlayTurn() {
return multiPlayers.findNotStayPlayer();
}

public void doBetProcess(String betAmountValue) {
Player target = multiPlayers.findNotBetPlayer()
.orElseThrow(() -> new IllegalStateException(ErrorMessage.NO_MORE_BETTABLE_PLAYER.getMessage()));
multiPlayers.executeBet(target, betAmountValue);
}

public ParticipantDto doHitProcess() {
Player newPlayer = multiPlayers.findNotStayPlayer()
.map(player -> multiPlayers.executeHit(player, totalDeck::drawCard))
Expand All @@ -64,12 +75,11 @@ public boolean doDealerHitOrStandProcess() {
return !newDealer.gameState.isFinished();
}

public List<ParticipantDto> getPlayersGameSettingStates() {
return multiPlayers.getInitialStates();
}

public ParticipantDto getDealerGameSettingState() {
return ParticipantDto.consistWithInitialInfo(dealer);
public GameStateDto getGameSettingState() {
return GameStateDto.from(
ParticipantDto.consistWithInitialInfo(dealer),
multiPlayers.getInitialStates()
);
}

public GameResultDto getGameResults() {
Expand Down
9 changes: 7 additions & 2 deletions src/main/java/domain/Dealer.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

public class Dealer extends Participant {
private static final String DEALER_NAME = "๋”œ๋Ÿฌ";
private static final int DEALER_CARD_SUM_MIN = 16;

private Dealer(GameState gameState) {
super(DEALER_NAME, gameState);
Expand All @@ -22,7 +23,11 @@ public List<Card> showInitialCard() {
}

public Dealer addCard(Supplier<Card> cardSupplier) {
GameState newGameState = gameState.hit(cardSupplier);
return Dealer.from(newGameState);
if (gameState.getCardsSum() <= DEALER_CARD_SUM_MIN) {
GameState newGameState = gameState.hit(cardSupplier);
return Dealer.from(newGameState);
}
GameState stayGameState = gameState.stay();
return Dealer.from(stayGameState);
}
}
24 changes: 20 additions & 4 deletions src/main/java/domain/GameResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,25 @@
import domain.state.GameState;

public enum GameResult {
์Šน, ๋ฌด, ํŒจ;
๋ธ”๋ž™์žญ(1.5),
์Šน(1),
๋ฌด(0),
ํŒจ(-1);

private final double allocation;

GameResult(double allocation) {
this.allocation = allocation;
}

public double getAllocation() {
return allocation;
}

public static GameResult decidePlayerResult(Player player, Dealer dealer) {
GameState playerGameState = player.gameState;
GameState dealerGameState = dealer.gameState;

public static GameResult decidePlayerResult(GameState playerGameState, GameState dealerGameState) {
if (playerGameState.isBust()) {
return GameResult.ํŒจ;
}
Expand All @@ -16,7 +32,7 @@ public static GameResult decidePlayerResult(GameState playerGameState, GameState
return GameResult.๋ฌด;
}
if (playerGameState.isBlackJack()) {
return GameResult.์Šน;
return GameResult.๋ธ”๋ž™์žญ;
}
if (dealerGameState.isBlackJack()) {
return GameResult.ํŒจ;
Expand Down Expand Up @@ -45,4 +61,4 @@ public GameResult reverse() {

return GameResult.๋ฌด;
}
}
}
Loading