Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4ac5d7e
test: ํ…Œ์ŠคํŠธ ํ—ฌํผ ๋„์ž… ๋ฐ ๋…๋ฆฝ์„ฑ ๊ฐœ์„ 
soohyun1904 Mar 14, 2026
0892bb1
refactor: ๋„๋ฉ”์ธ ์ฑ…์ž„ ๋ถ„๋ฆฌ ๋ฐ ์บก์Аํ™” ๊ฐœ์„ 
soohyun1904 Mar 14, 2026
dd583b7
test: ๋„๋ฉ”์ธ ๋ฉ”์†Œ๋“œ ๋ช… ์ˆ˜์ •์œผ๋กœ ์ธํ•œ ์ˆ˜์ •
soohyun1904 Mar 14, 2026
cc021f7
refactor: Dealer์™€ Player ๊ณต๋™๋กœ์ง ๋ถ„๋ฆฌ
soohyun1904 Mar 14, 2026
ee94a94
refactor: ์ปจํŠธ๋กค๋Ÿฌ๊ณผ ๋„๋ฉ”์ธ ๊ฒฐํ•ฉ๋„ ์ œ๊ฑฐ
soohyun1904 Mar 14, 2026
af30a63
feat: ์ˆ˜์ต ๊ธฐ๋Šฅ ์ถ”๊ฐ€
soohyun1904 Mar 14, 2026
00cb413
test: ์ˆ˜์ต ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
soohyun1904 Mar 14, 2026
0086a19
refactor: BlackjackGame ๋„๋ฉ”์ธ ์ˆ˜์ •
soohyun1904 Mar 15, 2026
551af63
test: BlackjackGame ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
soohyun1904 Mar 15, 2026
85b4915
refactor: View ๊ฐ์ฒด์˜ static ๋ฉ”์„œ๋“œ๋ฅผ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋กœ ๋ณ€๊ฒฝ
soohyun1904 Mar 15, 2026
c380883
feat: AppConfig ์ถ”๊ฐ€๋กœ ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์กฐ๋ฆฝ ๋ถ„๋ฆฌ
soohyun1904 Mar 15, 2026
0fda59f
feat: StringUtils ์œ ํ‹ธ ํด๋ž˜์Šค ์ถ”๊ฐ€
soohyun1904 Mar 15, 2026
a044615
feat: ์ถœ๋ ฅ ๋ˆ„๋ฝ ์ถ”๊ฐ€
soohyun1904 Mar 15, 2026
afb261e
refactor: AppConfig ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
soohyun1904 Mar 15, 2026
a7f4d17
refactor: BlackjackGame ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ
soohyun1904 Mar 15, 2026
a2cd51d
refactor: ๋ฏธ์‚ฌ์šฉ ๋ฉ”์„œ๋“œ ์‚ญ์ œ ๋ฐ ๋ฉ”์„œ๋“œ๋ช… ์ˆ˜์ •
soohyun1904 Mar 15, 2026
71e1006
refactor: TrumpCard CARDS ์ƒ์ˆ˜ ์ˆ˜์ •
soohyun1904 Mar 15, 2026
1a064a0
refactor: ๋”œ๋Ÿฌ ์ฒซ ์นด๋“œ ๊ณต๊ฐœ ๋กœ์ง์„ Dealer ๋„๋ฉ”์ธ์œผ๋กœ ์ด๋™
soohyun1904 Mar 15, 2026
de1afb6
fix: ๋ธ”๋ž™์žญ ํŒ๋‹จ ๋กœ์ง ์ˆ˜์ •
soohyun1904 Mar 15, 2026
2001f0e
test: TrumpCard ALL_CARD ์ˆ˜์ •์œผ๋กœ ์ธํ•œ ํ…Œ์ŠคํŠธ ์ˆ˜์ •
soohyun1904 Mar 15, 2026
1fda9e3
refactor: Bet ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ int -> BigDecimal๋กœ ์ˆ˜์ •
soohyun1904 Mar 15, 2026
92e61ec
test: Bet ์ธ์Šคํ„ด์ˆ˜ ๋ณ€์ˆ˜ ์ˆ˜์ •์œผ๋กœ ์ธํ•œ ํ…Œ์ŠคํŠธ ์ˆ˜์ •
soohyun1904 Mar 15, 2026
0049204
refactor: Deck์—์„œ ์นด๋“œ๊ฐ€ ์—†์„๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ˆ˜์ •
soohyun1904 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
4 changes: 3 additions & 1 deletion src/main/java/blackjack/Application.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package blackjack;

import blackjack.config.AppConfig;
import blackjack.controller.BlackjackController;

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

Choose a reason for hiding this comment

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

PR๋กœ ๋‚จ๊ธด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์€ ์—ฌ๊ธฐ์— ๋‚จ๊ฒจ๋ณผ๊ฒŒ์š”.

  1. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™œ์šฉํ•œ ์ปจํŠธ๋กค๋Ÿฌ-๋„๋ฉ”์ธ ๋ถ„๋ฆฌ
    ๊ธฐ์กด์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ธ๋ฑ์Šค๋กœ Players๋ฅผ ์ง์ ‘ ์ˆœํšŒํ•˜๋ฉฐ ์กฐ์ž‘ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ HitDecision, TurnDisplay, BetDecision ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ”๊ฟ”์„œ
ํ„ด ์ˆœํšŒ์™€ ๊ฒŒ์ž„ ๋กœ์ง์„ Game ๋‚ด๋ถ€๋กœ ์ด๋™์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

์ด ๋ฐฉํ–ฅ์ด ๋งž๋Š”์ง€, ์˜คํžˆ๋ ค ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด์„œ ๋ณต์žกํ•ด์ง„ ๊ฑด ์•„๋‹Œ์ง€ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ Players๋ฅผ ์ง์ ‘ ์ˆœํšŒํ•˜๋ฉฐ ๊ฒŒ์ž„ ์ง„ํ–‰์„ ์กฐ์ž‘ํ•˜๋˜ ๊ตฌ์กฐ๋ณด๋‹ค, ํ„ด ์ง„ํ–‰ ์ž์ฒด๋ฅผ Game์ด ์ฑ…์ž„์ง€๋„๋ก ์˜ฎ๊ธด ๋ฐฉํ–ฅ์€ ๋” ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ํŠนํžˆ โ€œ๋ˆ„๊ฐ€ ์นด๋“œ๋ฅผ ๋” ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€โ€, โ€œํ„ด์„ ์–ธ์ œ ์ข…๋ฃŒํ•˜๋Š”์ง€โ€ ๊ฐ™์€ ๊ทœ์น™์€ ๋„๋ฉ”์ธ์— ๊ฐ€๊นŒ์šด ์ฑ…์ž„์ด๋ผ ์ปจํŠธ๋กค๋Ÿฌ์— ๋‚จ์•„ ์žˆ์œผ๋ฉด ๊ด€๋ จ ํŒ๋‹จ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ํฉ์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. (์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ฒ ์ฃ  ๐Ÿฅฒ)

๋‹ค๋งŒ HitDecision, TurnDisplay, BetDecision์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋Š˜์–ด๋‚œ ๋งŒํผ ์ถ”์ƒํ™” ๋น„์šฉ๋„ ๋ถ„๋ช…ํžˆ ์ƒ๊ธฐ๋Š”๋ฐ, ๊ทธ๋ž˜์„œ ์ด ๊ตฌ์กฐ๊ฐ€ ์„ค๋“๋ ฅ์„ ๊ฐ€์ง€๋ ค๋ฉด, ๋‹จ์ˆœํžˆ ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋กœ ๋ฐ€์–ด ๋„ฃ์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ โ€œ์ž…๋ ฅ ๊ฒฐ์ •โ€๊ณผ โ€œ๊ฒŒ์ž„ ๊ทœ์น™โ€์„ ๋ถ„๋ฆฌํ–ˆ๋‹ค๋Š” ์ ์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.
์ง€๊ธˆ์ฒ˜๋Ÿผ ์™ธ๋ถ€์—์„œ๋Š” ๊ฒฐ์ •๋งŒ ๋„˜๊ธฐ๊ณ , ์‹ค์ œ ์ง„ํ–‰์€ Game์ด ๋‹ด๋‹นํ•œ๋‹ค๋ฉด ๋ฐฉํ–ฅ ์ž์ฒด๋Š” ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”!

Copy link

Choose a reason for hiding this comment

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

  1. ์ถœ๋ ฅ ์ฝœ๋ฐฑ์˜ ๋„๋ฉ”์ธ ๊ฒฐํ•ฉ ๋ฌธ์ œ
    hitํ•  ๋•Œ๋งˆ๋‹ค ์ค‘๊ฐ„ ์นด๋“œ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ ๋•Œ๋ฌธ์— TurnDisplay ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
    ์ž…๋ ฅ์€ ์ฝœ๋ฐฑ์œผ๋กœ, ์ถœ๋ ฅ์€ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹น๊ฒจ๊ฐ€๋Š” ๋ฐฉ์‹์ด ๊น”๋”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ํ„ด ์ค‘๊ฐ„ ์ถœ๋ ฅ์€ ๋‹น๊ฒจ๊ฐˆ ์ˆ˜ ์—†์–ด์„œ ์ฝœ๋ฐฑ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ถœ๋ ฅ ํ˜•์‹์ด ๋ฐ”๋€Œ๋ฉด ์ฝœ๋ฐฑ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋„ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
ํ˜„์žฌ๋Š” (String name, List cardNames)๋งŒ ๋„˜๊ธฐ๊ณ  ์žˆ๋Š”๋ฐ, ์ด ์ •๋„๋ฉด ๊ดœ์ฐฎ์€ ๊ฑด์ง€, ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์˜๊ฒฌ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


์ค‘๊ฐ„ ์ถœ๋ ฅ์ด ํ•„์š”ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ๋•Œ๋ฌธ์— TurnDisplay ๊ฐ™์€ ์ฝœ๋ฐฑ ์ž์ฒด๋Š” ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ด๋ผ ์ƒ๊ฐํ•ด์š”.
๋‹ค๋งŒ ๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ ํ˜„์žฌ์ฒ˜๋Ÿผ ์ถœ๋ ฅ ์นœํ™”์ ์ธ ๊ฐ’๋“ค์„ ์ง์ ‘ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ๋…ธ์ถœํ•˜๋ฉด, ์ถœ๋ ฅ ํ˜•์‹ ๋ณ€๊ฒฝ ์‹œ ๋„๋ฉ”์ธ ๋ฉ”์„œ๋“œ์™€ ์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ™์ด ํ”๋“ค๋ฆด ์ˆ˜ ์žˆ์–ด ๋ณด์—ฌ์š”.
์ง€๊ธˆ ์š”๊ตฌ์‚ฌํ•ญ ๋ฒ”์œ„์—์„œ๋Š” name, cardNames ์ •๋„๋งŒ ๋„˜๊ธฐ๋Š” ๊ฒƒ๋„ ์ถฉ๋ถ„ํžˆ ๋‹จ์ˆœํ•œ ์„ ํƒ์ด์ง€๋งŒ, ์ดํ›„ ํ‘œ์‹œํ•  ์ •๋ณด๊ฐ€ ๋Š˜์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ํ„ด ์ƒํƒœ๋ฅผ ๋‹ด๋Š” ๋ณ„๋„ ๊ฐ์ฒด๋กœ ํ•œ ๋ฒˆ ๊ฐ์‹ธ ๋‘๋Š” ๋ฐฉํ–ฅ์ด ๋” ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•  ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿ˜Š

Copy link

Choose a reason for hiding this comment

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

  1. ์˜์กด ๊ด€๊ณ„ โ€” "์•„๋Š” ๊ฒƒ"์˜ ๊ธฐ์ค€
    ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฐ˜ํ™˜๊ฐ’, ํ•„๋“œ, ๋‚ด๋ถ€ ์ƒ์„ฑ ๋“ฑ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ํƒ€์ž…์ด ๋“ฑ์žฅํ•˜๋ฉด ์˜์กด์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์œผ๋กœ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์ค€์œผ๋กœ Players์— ์žˆ๋˜ hitPlayer(int index, TrumpCard card) ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  forEach(Consumer)๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค.
Players๋Š” TrumpCard์™€ ์ง์ ‘ ํ˜‘๋ ฅํ•  ์ด์œ ๊ฐ€ ์—†๊ณ  ์ „๋‹ฌ๋งŒ ํ•˜๋Š” ์ค‘๊ฐ„์ž์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•œํŽธ BlackjackGame์˜ forEach ๋žŒ๋‹ค ์•ˆ์—์„œ player.hit(deck.deal())์„ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ด๋•Œ TrumpCard๋ฅผ ์•„๋Š” ๊ฑด ๋žŒ๋‹ค๋ฅผ ์ž‘์„ฑํ•œ Game์ด์ง€ ์‹คํ–‰ํ•˜๋Š” Players๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
"์ง์ ‘ ํ˜‘๋ ฅํ•˜๋ฉด ์•Œ์•„๋„ ๋˜๊ณ , ์ „๋‹ฌ๋งŒ ํ•˜๋ฉด ์•Œ ํ•„์š” ์—†๋‹ค"๋Š” ๊ธฐ์ค€์ด ๋งž๋Š”์ง€ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


Players๊ฐ€ TrumpCard๋ฅผ ์ง์ ‘ ํ•ด์„ํ•˜๊ฑฐ๋‚˜ ํŒ๋‹จํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœ ์ „๋‹ฌ๋งŒ ํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค๋ฉด, ํ•ด๋‹น ํƒ€์ž… ์˜์กด์„ ์ œ๊ฑฐํ•œ ๋ฐฉํ–ฅ์€ ํƒ€๋‹นํ•ด ๋ณด์—ฌ์š”.
player.hit(deck.deal())์—์„œ ์‹ค์ œ๋กœ TrumpCard์™€ ํ˜‘๋ ฅํ•˜๋Š” ์ฃผ์ฒด๋Š” BlackjackGame๊ณผ Player์ด๋ฏ€๋กœ, Players๊ฐ€ ๊ทธ ํƒ€์ž…์„ ๋ชฐ๋ผ๋„ ๋œ๋‹ค๋Š” ํŒ๋‹จ์—๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค๋งŒ forEach(Consumer)๋กœ ๋ฐ”๊พธ๋ฉด์„œ ํƒ€์ž… ์˜์กด์€ ์ค„์—ˆ์ง€๋งŒ ์ปฌ๋ ‰์…˜์˜ ํ–‰์œ„๋ฅผ ์™ธ๋ถ€์—์„œ ์กฐํ•ฉํ•˜๊ฒŒ ๋œ ๋ฉด๋„ ์žˆ์–ด, ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์˜ ์ฑ…์ž„๊นŒ์ง€ ๊ฐ™์ด ์•ฝํ•ด์ง€์ง€ ์•Š์•˜๋Š”์ง€๋Š” ํ•จ๊ป˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿ™‚

Copy link

Choose a reason for hiding this comment

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

  1. ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ ์‹œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€๋Š” ๋ฒ”์œ„
    Hand์˜ isBust()๋ฅผ Player๊ฐ€ ์œ„์ž„ํ•˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ–ˆ๋Š”๋ฐ, ๊ทธ๋ž˜๋„ Hand์˜ ํ–‰์œ„๊ฐ€ ๋ฐ”๋€Œ๋ฉด PlayerTest, DealerTest์˜ canHit() ํ…Œ์ŠคํŠธ๋„ ํ•จ๊ป˜ ๊นจ์ง‘๋‹ˆ๋‹ค. ์œ„์ž„์„ ํ•˜๋”๋ผ๋„ ํ•˜์œ„ ๊ฐ์ฒด์˜ ํ–‰์œ„ ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ƒ์œ„ ํ…Œ์ŠคํŠธ๋„ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•˜์œ„ ๋ณ€๊ฒฝ์ด ์ง์ ‘ ์˜์กดํ•˜๋Š” ์ƒ์œ„ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฑด์ง€, ์•„๋‹ˆ๋ฉด ์ƒ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์•ˆ ๊นจ์ง€๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
์–ด๋””๊นŒ์ง€ ๊นจ์ง€๋Š” ๊ฒŒ ์ •์ƒ์ด๊ณ  ์–ด๋””๋ถ€ํ„ฐ๊ฐ€ ์„ค๊ณ„ ๋ฌธ์ œ์˜ ์‹ ํ˜ธ์ธ์ง€ ๊ธฐ์ค€์ด ์žˆ์„๊นŒ์š”?


์ƒ๊ฐ ์ •๋ฆฌ์ค‘

Copy link

Choose a reason for hiding this comment

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

  1. ์ƒํƒœ ํŒจํ„ด(State Pattern) ์ ์šฉ
    ํ˜„์žฌ hit ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ canHit()์˜ if๋ฌธ์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ƒํƒœ ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด Player์˜ ์ƒํƒœ(ํžˆํŒ… ์ค‘, ์Šคํ…Œ์ด, ๋ฒ„์ŠคํŠธ, ๋ธ”๋ž™์žญ)์— ๋”ฐ๋ผ ํ–‰์œ„๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„์— ์ ํ˜€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    ์ด ๋ฏธ์…˜์— ์ƒํƒœ ํŒจํ„ด์„ ์ ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ค ๊ตฌ์กฐ๊ฐ€ ์ข‹์„์ง€ ๋ฐฉํ–ฅ์„ ์žก๊ณ  ์‹ถ์–ด์„œ ์กฐ์–ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ƒํƒœ ํŒจํ„ด ์ž์ฒด๊ฐ€ ๋ธ”๋ž™์žญ ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ ์žˆ๊ณ ,
๋‹ค์Œ ๋‹จ๊ณ„์— ์ ํ˜€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค << ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ๋ฌด์—‡์„ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด์ง€ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆฌ๋Š”๋ฐ์š”.
๋ธ”๋ž™์žญ ๋ฏธ์…˜์ด ์‚ฌ์ดํด2๊นŒ์ง€ ์žˆ์–ด๋ณด์—ฌ์„œ, ๋‹ค์Œ ๋‹จ๊ณ„์˜ ์˜๋ฏธ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์š”. ๐Ÿค”

์ถ”๊ฐ€์ ์œผ๋กœ ์ƒํƒœํŒจํ„ด์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ ๊นŒ์ง€๋Š” ๋‹ฌ์ˆ˜๊ฐ€ ํ•ด๋ณด๊ณ ์‹ถ๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ ์ง„ํ–‰ํ•ด๋ด๋„ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค...๋งŒ!
์งˆ๋ฌธ์ด ์กฐ๊ธˆ ์ž˜๋ชป๋๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.
๋ฐฉํ–ฅ์„ ์ œ๊ฐ€ ๋จผ์ € ์„ค๊ณ„๋ฅผ ํ•ด๋“œ๋ฆฌ๋Š”๊ฒŒ ์ข‹์€ ๋ฐฉํ–ฅ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ ์–ด๋„ ๋‹ฌ์ˆ˜๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ƒํƒœ ํŒจํ„ด ๋„์ž… ๋ฐฉํ–ฅ(or ์ฝ”๋“œ)์„ ๊ณ ๋ฏผ์— ๋ฐ˜์˜ํ•ด๋ณด์‹  ๋’ค, ํ”ผ๋“œ๋ฐฑ์„ ์š”์ฒญํ•˜์‹ ๋‹ค๋ฉด ๊ทธ์—๋Œ€ํ•ด์„œ ์ œ๊ฐ€ ๋ฐฉํ–ฅ์„ ๊ฐ™์ด ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ๊ฐ€ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•ด์ฃผ๋Š” ๋ฐฉ์‹์€ ์šฐํ…Œ์ฝ” ์ทจ์ง€์—๋„ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ๐Ÿ™„

Copy link

Choose a reason for hiding this comment

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

  1. ์ƒ์œ„ ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•œ ํ•˜์œ„ ์ˆ˜์ • ๋ฒ”์œ„
    ๋ฐฐํŒ… ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ๊ธฐ์กด MatchResult์˜ ์—ญํ• ์ด ์• ๋งคํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ŠนํŒจ ํŒ์ •์€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•˜์ง€๋งŒ ์ถœ๋ ฅ์—๋Š” ์ˆ˜์ต ๊ธˆ์•ก๋งŒ ๋‚˜์˜ค๊ณ ,
    ์ˆ˜์ต ๊ณ„์‚ฐ์„ ์œ„ํ•ด์„œ๋Š” MatchResult + ๋ฐฐํŒ… ๊ธˆ์•ก์ด ํ•จ๊ป˜ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด MatchResult๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ˆ˜์ต ๊ณ„์‚ฐ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๊ฒŒ ํ• ์ง€, ๋ณ„๋„์˜ ์ˆ˜์ต ๊ณ„์‚ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ• ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด matchResults()๋ฅผ ํ˜ธ์ถœํ•˜๋˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ View๋„ ํ•จ๊ป˜ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”๋ฐ ์ด๋Ÿฐ ์—ฐ์‡„ ์ˆ˜์ •์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ์ข‹์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ๋ณ„๋„์˜ ์ˆ˜์ต ๊ณ„์‚ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธด ํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ด€๋ จ ์ฝ”๋ฉ˜ํŠธ๋Š” ํ•ด๋‹น ์ฝ”๋ฉ˜ํŠธ์—์„œ ๋‚จ๊ฒจ๋‘์—ˆ๋Š”๋ฐ์š”.

์ €๋Š” ์ŠนํŒจ๊ฒฐ๊ณผ์™€ ๋ฐฐ๋‹น๋ฅ (?)์ด 1:1๋กœ ๋งค์นญ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ๋ฐฐ๋‹น๋ฅ ์ด๋ผ๋Š” ๊ฐœ๋…์„ ๋ณ„๋„ enum์ด ์•„๋‹ˆ๋ผ ์ŠนํŒจ๊ฒฐ๊ณผ์˜ ์ƒํƒœ๋กœ ๋‘์—ˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿ™‚

๋‹ฌ์ˆ˜๊ฐ€ ์ง„ํ–‰ํ•˜์‹  ๋ฐฉํ–ฅ๋„ ์ƒ๊ฐํ•ด๋ณด๋ฉด Payoff๊ฐ€ ์‹ค์งˆ์ ์œผ๋กœ WIN,DRAW, LOSE๋ฅผ ๊ฐ ์š”์†Œ๋กœ ๊ฐ–๊ณ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ฐํ•ด๋ณด๋ฉด ๊ธฐ์กด์˜ MatchResult์™€ ์œ ์‚ฌํ•ด๋ณด์ด์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Š

์ €๋Š” ๊ธฐ์กด MatchResult๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ๊ณ„์‚ฐ์„ ๋‹ด๋‹นํ•˜๊ฒŒํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™์•„์š”.

๊ธฐ์กด MatchResult๋ฅผ ์ˆ˜์ •ํ•ด์„œ ์ˆ˜์ต ๊ณ„์‚ฐ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๊ฒŒ ํ• ์ง€, ๋ณ„๋„์˜ ์ˆ˜์ต ๊ณ„์‚ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ• ์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์กด matchResults()๋ฅผ ํ˜ธ์ถœํ•˜๋˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ View๋„ ํ•จ๊ป˜ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”๋ฐ ์ด๋Ÿฐ ์—ฐ์‡„ ์ˆ˜์ •์„ ์ตœ์†Œํ™”ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ์ข‹์€์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ต ๊ณ„์‚ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ณ  ๊ณ„์‚ฐ์€ ๋ณ„๋„๋กœ ์ˆ˜์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ์—ญํ• ์„ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋‘˜ ๊ฒƒ ๊ฐ™๊ธฐ๋Š”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค”

์ €๋ผ๋ฉด GameResult๋ฅผ Map<Player, MatchResult>์˜ ์ผ๊ธ‰์ปฌ๋ ‰์…˜์œผ๋กœ ๋‘๊ณ 
์ด ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด์—๊ฒŒ ์ˆ˜์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ์—ญํ• ์„ ์œ„์ž„ํ–ˆ์„ ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿค”

Copy link

Choose a reason for hiding this comment

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

  1. ๋ฆฌํŒฉํ† ๋ง ๋ฒ”์œ„ ๊ด€๋ฆฌ
    ์ด๋ฒˆ์— ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ + ์ฑ…์ž„ ๋ถ„๋ฆฌ + ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…์„ ๋™์‹œ์— ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ ๋ณ€๊ฒฝ ๋ฒ”์œ„๊ฐ€ ๋„“์–ด์ ธ์„œ ํ•œ ์ปค๋ฐ‹์— ๋งŽ์€ ํŒŒ์ผ์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋ฅผ ๊ณ ์น˜๋ฉด ์—ฐ์‡„์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ณณ๋„ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋Œ์ด์ผœ๋ณด๋ฉด "๋„ค์ด๋ฐ ๋จผ์ € โ†’ ์ฑ…์ž„ ๋ถ„๋ฆฌ โ†’ ์ธํ„ฐํŽ˜์ด์Šค ๋„์ž…" ์ˆœ์„œ๋กœ ๋‚˜๋ˆด์œผ๋ฉด ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์ปค๋ฐ‹์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ์ข‹์€์ง€ ์กฐ์–ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


์ปค๋ฐ‹ ๋‹จ์œ„๋ฅผ ์˜์‹์ ์œผ๋กœ ๋ณด๋Š” ํŽธ์ด๋ผ, ์กฐ๊ธˆ ์œ ๋™์ ์ธ ๊ฒƒ ๊ฐ™์•„์š”.

๋ฉ”์ธ ์ž‘์—…์„ ์ค‘์ ์ ์œผ๋กœ ์ปค๋ฐ‹๋‹จ์œ„๋กœ ๋ณผ ๊ฒƒ ๊ฐ™๊ณ , ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ, ๋ฆฌํŒฉํ„ฐ๋ง ์ž‘์—…์€ ์ผ๋‹จ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์—…ํ•˜๋˜
๋ฉ”์ธ ์ž‘์—…์ž์ฒด์˜ ์ปค๋ฐ‹๋‹จ์œ„๊ฐ€ ์ž‘๋‹ค๋ฉด ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ, ๋ฆฌํŒฉํ„ฐ๋ง

์‚ฌ์‹ค ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋„ค์ด๋ฐ ๋ณ€๊ฒฝ, ๋ฆฌํŒฉํ„ฐ๋ง์˜ ๊ฒฝ์šฐ์—๋„ ํฌ๊ฒŒ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฉ”์ธ์ž‘์—…๊ณผ ํ•จ๊ป˜ ์ง„ํ–‰ํ•ด๋ฒ„๋ฆฌ๊ธฐ๋Š” ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค”
๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ปค๋ฐ‹๋‹จ์œ„๋ฅผ ์ชผ๊ฐฐ์„ ๋•Œ, ์ € ๋ฐฉ์‹์ด ์˜๋ฏธ๊ฐ€์žˆ์œผ๋ ค๋ฉด ๋ฆฌ๋ทฐ์–ด๋„ ์ปค๋ฐ‹ ๋‹จ์œ„๋กœ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒฝ์šฐ์—๋Š” ์˜๋ฏธ๊ฐ€์žˆ์„ ๊ฒƒ ๊ฐ™์œผ๋‚˜, PR ๋‹จ์œ„๋กœ ๋ณด๋Š” ๊ฒฝ์šฐ์—๋Š” ์ปค๋ฐ‹ ์ˆœ์„œ๊ฐ€ ํฐ ์˜๋ฏธ๊ฐ€์—†์„ ๊ฒƒ ๊ฐ™๋„ค์š”. ๐Ÿ˜…

์–ด์จ‹๊ฑฐ๋‚˜ ์ปค๋ฐ‹ ๋‹จ์œ„๋Š” ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์žฅ์ ์ด ํฌ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—
ํ•ต์‹ฌ์€ ์ปค๋ฐ‹๋‹จ์œ„๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ๐Ÿ˜Š

Copy link

@Rok93 Rok93 Mar 15, 2026

Choose a reason for hiding this comment

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

  1. ์ด์ „ ํ”ผ๋“œ๋ฐฑ ๊ด€๋ จ
    ์ „ ์‚ฌ์ดํด ํ”ผ๋“œ๋ฐฑ ์ค‘ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์„œ, ๋ฆฌ๋ทฐ ํ›„ ํ™•์ธํ•˜์—ฌ ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
    ์ถ”๊ฐ€๋กœ ์‚ฌ์ดํด 1์—์„œ Suit, Rank ๊ด€๋ จ ์ฝ”๋ฉ˜ํŠธ์™€ ์„œ๋น„์Šค ๋ ˆ์ด์–ด ๊ด€๋ จ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์•„์ง ๋‹ต๋ณ€์„ ๋ฐ›์ง€ ๋ชปํ•ด์„œ ํ™•์ธ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

DM์œผ๋กœ ์ด์ „ ํ”ผ๋“œ๋ฐฑ์ด ์–ด๋”œ๋ถ€๋ถ„์„ ๋ง์”€ํ•˜์‹ ๊ฑด์ง€ ๋ฌธ์˜๋“œ๋ ธ์—ˆ๋Š”๋ฐ์š”..!

์•„๋งˆ๋„ ์•„๋ž˜ 2๊ฐœ ์ฝ”๋ฉ˜ํŠธ์— ๋Œ€ํ•ด์„œ ๋‹ต๋ณ€์„ ์•ˆ๋“œ๋ฆฐ ๊ฒƒ ๊ฐ™์•„์š”.

  1. Suit, Rank ๊ด€๋ จ ์ฝ”๋ฉ˜ํŠธ
  2. ์„œ๋น„์Šค ๋ ˆ์ด์–ด ๊ด€๋ จ ์งˆ๋ฌธ

๊ฐ ์งˆ๋ฌธ์ด ์–ด๋””๋ฅผ ๋ง์”€ํ•˜์‹  ๊ฒƒ์ธ์ง€, ๋งํฌ ๊ณต์œ ํ•ด์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿฅฒ
์ฝ”๋ฉ˜ํŠธ์— ๋ฌปํ˜€์„œ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋„ค์š”.

(์—…๋ฐ์ดํŠธ)

  1. Suit, Rank ๊ด€๋ จ ์ฝ”๋ฉ˜ํŠธ

์ฐพ์œผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ €๋Š” ์ง€๊ธˆ์˜ ๊ฒฝ์šฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์„ ๋•Œ๋Š” NoSuchElementException ์„ ์˜ˆ์™ธ๋กœ ๋˜์ ธ์ฃผ๋Š”๊ฒŒ ์กฐ๊ธˆ ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”.

try-catch๋กœ ๊ฐ์‹ผ ๋ฐฉ์‹์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด์ฃผ์…จ๋Š”๋ฐ...!

์ „ ๋‹จ์ˆœํžˆ ์•„๋ž˜์™€ ๊ฐ™์ด IllegalArgumentExceptuon ๋Œ€์‹ ์— NoSuchElementException์„ ๋˜์ง€๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”. ๐Ÿ˜Š

           return Optional.ofNullable(SUIT_MAP.get(koreanName))
                .orElseThrow(() -> new NoSuchElementException("์กด์žฌํ•˜์ง€ ์•Š๋Š” ์นด๋“œ์ž…๋‹ˆ๋‹ค. cardName:" + koreanName));

ํ•œ ๊ฐ€์ง€ ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊ฒจ์„œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ใ€Ž์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”ใ€ ์˜ˆ์™ธ ํŒŒํŠธ์™€ ๊ด€๋ จ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ, of ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์ž ์ž…์žฅ์—์„œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์–ด IllegalArgumentException์ด ๋” ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
ํ˜น์‹œ ์ด๋ฒˆ ์ƒํ™ฉ์—์„œ ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹  ํ‘œ์ค€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”? ํŒ๋‹จํ•˜์‹  ๊ตฌ์ฒด์ ์ธ ๋ฐฐ๊ฒฝ์ด๋‚˜ ํ”„๋กœ์ ํŠธ ์ปจ๋ฒค์…˜์ด ์žˆ์„์ง€ ๋กœํ‚ค๋‹˜์˜ ์ƒ๊ฐ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค..

์ €๋„ ์ด ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์œ ์‹ฌํžˆ ์‚ดํŽด๋ณด๋ฉฐ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ง์”€ํ•˜์‹  ํ•ด์„์— ์ €๋„ ๋™์˜ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”!
of ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์ ์˜ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ์กฐํšŒํ–ˆ๋‹ค๊ธฐ๋ณด๋‹ค ์œ ํšจํ•˜์ง€ ์•Š์€ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•œ ์ƒํ™ฉ์ด๋ผ IllegalArgumentException์ด ๋” ์ ์ ˆํ•ด ๋ณด์ด๋Š”๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™์•„์š”.
์ œ๊ฐ€ ๋‚จ๊ธด ์ฝ”๋ฉ˜ํŠธ๋Š” โ€œํ‘œ์ค€ ์˜ˆ์™ธ๋ฅผ ํ•œ ๋ฒˆ ๋” ๊ฒ€ํ† ํ•ด๋ณด๋ฉด ์ข‹๊ฒ ๋‹คโ€๋Š” ์ทจ์ง€์˜€๋Š”๋ฐ, ๋‹ค์‹œ ์‚ดํŽด๋ณด๋‹ˆ ์ด๋ฒˆ ์ผ€์ด์Šค์—์„œ๋Š” IllegalArgumentException์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ํŒ๋‹จ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘๐Ÿ‘

ํŒ๋‹จํ•˜์‹  ๊ตฌ์ฒด์ ์ธ ๋ฐฐ๊ฒฝ์ด๋‚˜ ํ”„๋กœ์ ํŠธ ์ปจ๋ฒค์…˜ ์€ ์ œ๊ฐ€ ์•Œ๊ธฐ๋กœ๋Š” ์ด๋Ÿฐ ์ •์˜๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ๋ช…ํ™•ํ•˜์ง€๋Š” ์•Š์€ ๊ฒƒ ๊ฐ™์•„์š”.
์ด๋ฒˆ ํŒ๋‹จ์€ ๊ฐœ์ธ์ ์œผ๋กœ ์ด๋Ÿฐ ์ผ€์ด์Šค๊ฐ€ ์˜์†ํ™” ๊ณ„์ธต์—์„œ ์ฐพ์•„์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๋ณด๋‹ˆ ์Šต๊ด€์ ์œผ๋กœ NoSuchElementException์„ ๋จผ์ € ๋– ์˜ฌ๋ ธ๋˜ ๊ฒƒ ๊ฐ™์•„์š”. ๐Ÿค”

  1. ์„œ๋น„์Šค ๋ ˆ์ด์–ด ๊ด€๋ จ ์งˆ๋ฌธ

์„œ๋น„์Šค๋ฅผ โ€œํ๋ฆ„ ์ œ์–ด ๋ ˆ์ด์–ดโ€๋กœ ๋ณด๊ณ , BlackjackGame์€ ์ƒํƒœ์™€ ๊ทœ์น™์„ ํ•จ๊ป˜ ๊ฐ€์ง€๋ฏ€๋กœ ๋„๋ฉ”์ธ์œผ๋กœ ํŒ๋‹จํ–ˆ๋‹ค๋Š” ์„ค๋ช…์€ ์ถฉ๋ถ„ํžˆ ๋‚ฉ๋“๋๊ณ  ๋˜ ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ ์„œ๋น„์Šค๊ฐ€ ๋‹จ์ˆœ ํŒจ์Šค์Šค๋ฃจ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋‘์ง€ ์•Š๊ฒ ๋‹ค๋Š” ํŒ๋‹จ๋„ ํ•ฉ๋ฆฌ์ ์ด๋ผ ์ƒ๊ฐํ•ด์š”.

๋‹ค๋งŒ ์„œ๋น„์Šค/๋„๋ฉ”์ธ ๊ตฌ๋ถ„ ๊ธฐ์ค€์„ ๋‹จ์ˆœํžˆ ์ƒํƒœ ์œ ๋ฌด๋ณด๋‹ค ์œ ์Šค์ผ€์ด์Šค ์กฐ์œจ์ธ์ง€, ๋„๋ฉ”์ธ ์ž์ฒด ํ‘œํ˜„์ธ์ง€๋กœ ๊ฐ€์ ธ๊ฐ€๋ฉด ๋” ๋‹จ๋‹จํ•œ ์„ค๋ช…์ด ๋  ๊ฒƒ ๊ฐ™๊ณ , ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ BlackjackGame์€ ๋„๋ฉ”์ธ ์ชฝ์— ๋” ๊ฐ€๊นŒ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ์œ„์น˜๋„ ๊ทธ ์˜๋„์— ๋งž๊ฒŒ ์ •๋ฆฌ๋˜๋Š”๊ฒŒ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์–ด์š”. ๐Ÿ™‚ (์ˆ˜์ •ํ•ด์ฃผ์‹  ๊ฒƒ๋„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™)


import blackjack.controller.BlackjackController;
import blackjack.view.InputView;
import blackjack.view.OutputView;

public class AppConfig {
public BlackjackController blackjackController(){
return new BlackjackController(new InputView(), new OutputView());
}
}
97 changes: 36 additions & 61 deletions src/main/java/blackjack/controller/BlackjackController.java
Original file line number Diff line number Diff line change
@@ -1,85 +1,60 @@
package blackjack.controller;

import blackjack.domain.MatchResult;
import blackjack.domain.Player;
import blackjack.domain.BlackjackGame;
import blackjack.domain.vo.GameResult;
import blackjack.dto.DealResultDto;
import blackjack.dto.GameResultDto;
import blackjack.dto.PlayerHandDto;
import blackjack.domain.BlackjackGame;
import blackjack.util.Parser;
import blackjack.view.InputView;
import blackjack.view.OutputView;

import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import static blackjack.util.Parser.splitDelimiter;
import static blackjack.view.InputView.readPlayNames;
import static blackjack.view.InputView.readYesOrNo;
import static blackjack.view.OutputView.printCurrentPlayerHand;
import static blackjack.view.OutputView.printDealResult;
import static blackjack.view.OutputView.printDealerDrawMessage;
import static blackjack.view.OutputView.printEmptyLine;
import static blackjack.view.OutputView.printFinalResult;
import static blackjack.view.OutputView.printGameResult;

public class BlackjackController {
public void run() {
List<String> names = inputNames();
BlackjackGame blackjackGame = BlackjackGame.create(names, Collections::shuffle);

DealResultDto dealResultDto = deal(blackjackGame);
printDealResult(dealResultDto);
private final InputView inputView;
private final OutputView outputView;

playPlayerTurn(blackjackGame);
playDealerTurn(blackjackGame);

GameResultDto gameResultDto = blackjackGame.generateGameResult();
printGameResult(gameResultDto);

Map<Player, MatchResult> playerFinalResult = blackjackGame.getPlayerFinalResult();
Map<String, Long> dealerFinalResult = blackjackGame.getDealerFinalResult(playerFinalResult);
printFinalResult(playerFinalResult, dealerFinalResult);
public BlackjackController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

private List<String> inputNames() {
String input = readPlayNames();
Parser.notEmpty(input);
return splitDelimiter(input);
}
public void run() {
List<String> names = inputNames();
outputView.printEmptyLine();
BlackjackGame game = BlackjackGame.create(names, Collections::shuffle);

private DealResultDto deal(BlackjackGame blackjackGame) {
blackjackGame.deal();
return DealResultDto.from(blackjackGame.getPlayers(), blackjackGame.getDealer());
}
game.betPlayers(name -> {
String amount = inputView.readBetAmount(name);
outputView.printEmptyLine();
return amount;
});

private void playPlayerTurn(BlackjackGame blackjackGame) {
for (int i = 0; i < blackjackGame.playerCount(); i++) {
playTurn(blackjackGame, i);
}
}
game.deal();
outputView.printDealResult(DealResultDto.from(game));

private void playTurn(BlackjackGame blackjackGame, int index) {
while (blackjackGame.canPlayerHit(index) && wantsToHit(blackjackGame, index)) {
hitAndPrintHand(blackjackGame, index);
}
printEmptyLine();
}
game.playPlayerTurns(
name -> Parser.parseDrawInput(inputView.readYesOrNo(name)).isHit(),
outputView::printPlayerHand
);
outputView.printEmptyLine();

private boolean wantsToHit(BlackjackGame blackjackGame, int index) {
String answer = readYesOrNo(blackjackGame.playerNameByIndex(index));
DrawCommand drawCommand = Parser.parseDrawInput(answer);
return drawCommand.isHit();
}
game.playDealerTurn();
outputView.printDealerDrawMessage();

outputView.printGameResult(GameResultDto.from(game));

private void hitAndPrintHand(BlackjackGame blackjackGame, int index){
PlayerHandDto playerHandDto = PlayerHandDto.from(blackjackGame.playerDraw(index));
printCurrentPlayerHand(playerHandDto);
List<GameResult> gameResults = game.calculatePlayerProfits();
BigDecimal dealerProfit = game.calculateDealerProfit(gameResults);
outputView.printFinalResult(gameResults, dealerProfit);
}

private void playDealerTurn(BlackjackGame blackjackGame){
while (blackjackGame.canDealerHit()) {
printDealerDrawMessage();
blackjackGame.dealerDraw();
}
private List<String> inputNames() {
String input = inputView.readPlayNames();
return splitDelimiter(input);
}
}
43 changes: 43 additions & 0 deletions src/main/java/blackjack/domain/Bet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package blackjack.domain;

import java.math.BigDecimal;
import java.util.Objects;

public class Bet {
private final BigDecimal amount;

private Bet(BigDecimal amount) {
validate(amount);
this.amount = amount;
}

private void validate(BigDecimal amount) {
Objects.requireNonNull(amount, "๋ฐฐํŒ… ๊ธˆ์•ก์€ null์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
if (amount.compareTo(BigDecimal.ZERO) < 0) {
throw new IllegalArgumentException("๋ฐฐํŒ… ๊ธˆ์•ก์€ ์Œ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
}
}

public static Bet init(){
return new Bet(BigDecimal.ZERO);
}

public static Bet of(String amount){
return new Bet(new BigDecimal(amount));
}

public BigDecimal getAmount() {
return amount;
}

@Override
public final boolean equals(Object o) {
if (!(o instanceof Bet bet)) return false;
return Objects.equals(amount, bet.amount);
}

@Override
public int hashCode() {
return Objects.hashCode(amount);
}
}
6 changes: 6 additions & 0 deletions src/main/java/blackjack/domain/BetDecision.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package blackjack.domain;

@FunctionalInterface
public interface BetDecision {
String decideBet(String name);
}
90 changes: 54 additions & 36 deletions src/main/java/blackjack/domain/BlackjackGame.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package blackjack.domain;

import blackjack.dto.GameResultDto;
import blackjack.domain.participant.Dealer;
import blackjack.domain.participant.Player;
import blackjack.domain.vo.GameResult;
import blackjack.domain.vo.Payoff;

import java.util.LinkedHashMap;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;


public class BlackjackGame {
private final Dealer dealer;
private final Players players;
Expand Down Expand Up @@ -40,52 +42,68 @@ private static Players generatePlayers(List<String> names) {
.collect(Collectors.collectingAndThen(Collectors.toList(), Players::of));
}

public void deal() {
players.receiveCards(deck);
dealer.receiveCards(deck.drawSecondTimes());
}

public int playerCount() {
return players.count();
}

public boolean canPlayerHit(int index) {
return players.playerAt(index).canHit();
public void betPlayers(BetDecision decision) {
players.forEach(player -> {
String amount = decision.decideBet(player.getName());
player.placeBet(amount);
});
}

public String playerNameByIndex(int index) {
return players.playerAt(index).name();
public void deal() {
players.forEach(
player -> {
player.hit(deck.deal());
player.hit(deck.deal());
});
dealer.hit(deck.deal());
dealer.hit(deck.deal());
}

public Player playerDraw(int index) {
TrumpCard drawn = deck.draw();
players.playerAt(index).receiveCard(drawn);
return players.playerAt(index);
public void playPlayerTurns(HitDecision decision, TurnDisplay display) {
players.forEach(player -> {
playerTurn(player, decision, display);
});
}

public boolean canDealerHit() {
return dealer.shouldHit();
private void playerTurn(Player player, HitDecision decision, TurnDisplay display) {
boolean playing = true;
while (player.canHit() && playing) {
playing = processHit(player, decision, display);
}
}

public void dealerDraw() {
TrumpCard drawn = deck.draw();
dealer.receive(drawn);
private boolean processHit(Player player, HitDecision decision, TurnDisplay display) {
if (!decision.wantsHit(player.getName())) {
display.show(player.getName(), player.getCardNames());
return false;
}
player.hit(deck.deal());
display.show(player.getName(), player.getCardNames());
return true;
}

public GameResultDto generateGameResult() {
return GameResultDto.from(players, dealer);
public void playDealerTurn() {
while (dealer.canHit()) {
dealer.hit(deck.deal());
}
}

public Map<Player, MatchResult> getPlayerFinalResult() {
Map<Player, MatchResult> playerResult = new LinkedHashMap<>();
for (Player player : players.getPlayers()) {
playerResult.put(player, MatchResult.playerResult(player, dealer));
}
return playerResult;
public List<GameResult> calculatePlayerProfits(){
List<GameResult> results = new ArrayList<>();
players.forEach(player -> {
BigDecimal profit = Payoff.playerResult(player, dealer)
.calculateProfit(player.getBet().getAmount());
results.add(GameResult.from(player.getName(), profit));
}
);
return results;
}

public Map<String, Long> getDealerFinalResult(Map<Player, MatchResult> playerResult) {
return MatchResult.dealerResult(playerResult);
public BigDecimal calculateDealerProfit(List<GameResult> gameResults) {
return gameResults.stream()
.map(GameResult::profit)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.negate();
}

public Players getPlayers() {
Expand Down
53 changes: 0 additions & 53 deletions src/main/java/blackjack/domain/Dealer.java

This file was deleted.

Loading