From 5882e1a5e9c1e488c3141015826d88792c8285cc Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:06:19 +0900 Subject: [PATCH 01/25] =?UTF-8?q?docs(README):=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 745d1dcd2d5..596d72bfd28 100644 --- a/README.md +++ b/README.md @@ -5,22 +5,29 @@ ### 입력 - [x] "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리) " 를 출력한다. - [x] 게임에 참여하는 참가자의 이름을 쉼표 기준으로 나누는 문자열을 하나 입력받는다. +- [ ] 참가자 별로 베팅할 금액을 입력 - [x] 게임을 계속 진행할 지 결정하는 (y/n) 는 y, n를 입력한다. ### 입력 예외 - [x] 이름은 쉼표 기준으로 분리되어 1개 이상이어야 한다. - [x] 이름은 영어로 2~10자 사이여야 한다. -- [x] 이름은 영어로만 엊루이한야 져어루다한야. +- [x] 이름은 영어로만 이루어져야 한다. - [x] 이름은 소문자 기준으로 중복되지 않는다. +- [ ] 베팅할 금액은 1 이상의 양수여야 한다. - [x] 게임을 계속 진행할 지 결정하는 y, n만 입력할 수 있다. ### 기능 1. 입력 처리 -- [x] 입력받은 문자열을 ‘,’를 기준으로 파싱한다. -- [x] 파싱한 이름을 검증한다. + 1-1. 참가자 이름 입력 + - [x] 입력받은 문자열을 ‘,’를 기준으로 파싱한다. + - [x] 파싱한 이름을 검증한다. + + 1-2. 베팅 금액 입력 + - [ ] 참가자 별로 베팅할 금액을 입력받는다. + - [ ] 베팅한 금액을 검증한다. 2. 게임 진행 @@ -37,11 +44,14 @@ 3. 결과 처리 -- [X] 덱은 한 덱(52장)으로 고정한다(이때 하드코딩하지 않는다) - [x] 딜러와 각 참가자들의 카드 합을 구한다. -- [x] 참가자 승 : 딜러보다 합이 21에 더 가까운 경우 or 딜러가 버스트인 경우(참가자 버스트 X) -- [x] 참가자 무승부: 참가자와 딜러의 합이 같음(버스트 X) -- [x] 참가자 패 : 참가자 버스트 or 딜러보다 합이 적음(딜러가 버스트 X) +- [ ] 딜러와 참가자 수익 계산 초기값은 '0'으로 수익, 손해는 이 값을 기준으로 계산한다. +- [ ] 처음 두 장의 카드 합이 21이면 블랙잭으로, 베팅 금액의 1.5배를 딜러에게 받는다. +- [ ] 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다.(수익: 0) +- [ ] 카드를 추가로 뽑아 21을 초과할 경우 베팅 금액을 모두 잃게 된다. (수익: -베팅 금액) +- [ ] 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. (수익: 베팅 금액) +- [ ] 딜러가 21을 초과하더라도 플레이어가 21을 초과해 이미 베팅 금액을 잃었다면 베팅 금액을 받지 않는다. (수익: -베팅 금액) +- [ ] 딜러가 21을 초과할 때 플레이어가 이미 블랙잭으로 1.5배를 받았다면 추가로 금액을 받지 않는다. ### 출력 @@ -51,4 +61,4 @@ - [x] 참가자가 추가로 받은 카드들을“ [참가자]카드: 7클로버, K스페이드 ” 의 형태로 출력한다. - [x] 딜러가 받은 추가 카드를 “딜러는 16이하라 한장의 카드를 더 받았습니다.” 의 형태로 출력한다. - [x] 딜러, 참가자들의 카드 목록과 카드 합 결과를 “딜러카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20” 의 형태로 출력한다. -- [x] 딜러, 참가자들의 최종 승패를 “## 최종 승패 딜러: 1승 1패 [참가자]: 승 [참가자]: 패” 의 형태로 출력한다. +- [ ] 딜러, 참가자들의 수익을 ## 최종 수익 딜러 : xxxx [참가자]: xxxx [참가자]: xxxx” 의 형태로 출력한다. \ No newline at end of file From ffc8fa6d9aee437e70bfe28273f13f0df217c0b8 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:15:40 +0900 Subject: [PATCH 02/25] =?UTF-8?q?test(BettingAmountRequestDto):=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20null=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/BettingAmountRequestDto.java | 5 +++++ src/main/java/view/InputView.java | 1 + .../java/dto/BettingAmountRequestDtoTest.java | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 src/main/java/dto/BettingAmountRequestDto.java create mode 100644 src/test/java/dto/BettingAmountRequestDtoTest.java diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/dto/BettingAmountRequestDto.java new file mode 100644 index 00000000000..c8e306329ad --- /dev/null +++ b/src/main/java/dto/BettingAmountRequestDto.java @@ -0,0 +1,5 @@ +package dto; + +public record BettingAmountRequestDto(String bettingAmount) { + +} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index e5e633946ae..cecf631b23e 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -16,4 +16,5 @@ public AgreementRequestDto askHitOrStand(String name) { System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); return new AgreementRequestDto(sc.nextLine()); } + } diff --git a/src/test/java/dto/BettingAmountRequestDtoTest.java b/src/test/java/dto/BettingAmountRequestDtoTest.java new file mode 100644 index 00000000000..0f688000ed6 --- /dev/null +++ b/src/test/java/dto/BettingAmountRequestDtoTest.java @@ -0,0 +1,17 @@ +package dto; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class BettingAmountRequestDtoTest { + + @Test + @DisplayName("베팅 금액 입력 문자열이 null이면 에러 발생 검증") + void 베팅_금액_null_에러_발생_테스트() { + Assertions.assertThrows(IllegalArgumentException.class, + () -> new BettingAmountRequestDto(null)); + } +} From d023f75411a4c2f7b8bf41a397e2ec6ef1dd8b32 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:21:33 +0900 Subject: [PATCH 03/25] =?UTF-8?q?test(BettingAmountRequestDto):=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20=EA=B3=B5=EB=B0=B1=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/BettingAmountRequestDto.java | 1 - src/test/java/dto/BettingAmountRequestDtoTest.java | 9 ++++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/dto/BettingAmountRequestDto.java index c8e306329ad..3b201fc3063 100644 --- a/src/main/java/dto/BettingAmountRequestDto.java +++ b/src/main/java/dto/BettingAmountRequestDto.java @@ -1,5 +1,4 @@ package dto; public record BettingAmountRequestDto(String bettingAmount) { - } diff --git a/src/test/java/dto/BettingAmountRequestDtoTest.java b/src/test/java/dto/BettingAmountRequestDtoTest.java index 0f688000ed6..ae6b8008f07 100644 --- a/src/test/java/dto/BettingAmountRequestDtoTest.java +++ b/src/test/java/dto/BettingAmountRequestDtoTest.java @@ -10,8 +10,15 @@ class BettingAmountRequestDtoTest { @Test @DisplayName("베팅 금액 입력 문자열이 null이면 에러 발생 검증") - void 베팅_금액_null_에러_발생_테스트() { + void 베팅_금액_null_입력_에러_발생_테스트() { Assertions.assertThrows(IllegalArgumentException.class, () -> new BettingAmountRequestDto(null)); } + + @Test + @DisplayName("베팅 금액 입력 문자열이 빈 문자열(\"\")이면 에러 발생 검증") + void 베팅_금액_공백_입력_에러_발생_테스트() { + Assertions.assertThrows(IllegalArgumentException.class, + () -> new BettingAmountRequestDto("")); + } } From 41ac81fe83aaf602fa642ca017ed6b9a23004e81 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:25:51 +0900 Subject: [PATCH 04/25] =?UTF-8?q?feat(BettingAmountRequestDto):=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20null,=20=EA=B3=B5?= =?UTF-8?q?=EB=B0=B1=20=EC=9E=85=EB=A0=A5=20=EC=97=90=EB=9F=AC=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=20=EA=B8=B0=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/BettingAmountRequestDto.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/dto/BettingAmountRequestDto.java index 3b201fc3063..0b89528403a 100644 --- a/src/main/java/dto/BettingAmountRequestDto.java +++ b/src/main/java/dto/BettingAmountRequestDto.java @@ -1,4 +1,14 @@ package dto; public record BettingAmountRequestDto(String bettingAmount) { + + public BettingAmountRequestDto { + validateBettingAmountIsNotNullAndNotBlank(bettingAmount); + } + + private void validateBettingAmountIsNotNullAndNotBlank(String bettingAmount) { + if (bettingAmount == null || bettingAmount.isBlank()) { + throw new IllegalArgumentException("베팅 금액은 null 또는 공백이면 안 됩니다."); + } + } } From 26f6b7413dddc23dbedcc7918c702166b91dfc7d Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:31:08 +0900 Subject: [PATCH 05/25] =?UTF-8?q?test(BettingAmountRequestDto):=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20=EC=88=AB=EC=9E=90=20?= =?UTF-8?q?=EC=9D=B4=EC=99=B8=20=EB=AC=B8=EC=9E=90=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/dto/BettingAmountRequestDtoTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/dto/BettingAmountRequestDtoTest.java b/src/test/java/dto/BettingAmountRequestDtoTest.java index ae6b8008f07..b738942ee02 100644 --- a/src/test/java/dto/BettingAmountRequestDtoTest.java +++ b/src/test/java/dto/BettingAmountRequestDtoTest.java @@ -21,4 +21,11 @@ class BettingAmountRequestDtoTest { Assertions.assertThrows(IllegalArgumentException.class, () -> new BettingAmountRequestDto("")); } + + @Test + @DisplayName("베팅 금액 입력 문자열이 숫자가 아닌 문자면 에러 발생 검증") + void 베팅_금액_숫자_검증_테스트() { + Assertions.assertThrows(IllegalArgumentException.class, + () -> new BettingAmountRequestDto("123")); + } } From 7a5e58e2f8a25257895540fffd7f240ef12b45c9 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:57:58 +0900 Subject: [PATCH 06/25] =?UTF-8?q?feat(BettingAmountRequestDto):=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=B4=20=EC=88=AB=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=8C=20=EB=AC=B8=EC=9E=90=EC=9D=BC=20?= =?UTF-8?q?=EC=8B=9C=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/BettingAmountRequestDto.java | 10 ++++++++++ src/test/java/dto/BettingAmountRequestDtoTest.java | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/dto/BettingAmountRequestDto.java index 0b89528403a..dfb38cc0ea4 100644 --- a/src/main/java/dto/BettingAmountRequestDto.java +++ b/src/main/java/dto/BettingAmountRequestDto.java @@ -1,9 +1,12 @@ package dto; +import view.InputView; + public record BettingAmountRequestDto(String bettingAmount) { public BettingAmountRequestDto { validateBettingAmountIsNotNullAndNotBlank(bettingAmount); + validateBettingAmountIsDigit(bettingAmount); } private void validateBettingAmountIsNotNullAndNotBlank(String bettingAmount) { @@ -11,4 +14,11 @@ private void validateBettingAmountIsNotNullAndNotBlank(String bettingAmount) { throw new IllegalArgumentException("베팅 금액은 null 또는 공백이면 안 됩니다."); } } + + private void validateBettingAmountIsDigit(String bettingAmount) { + try { + Integer.parseInt(bettingAmount); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 숫자만 입력 가능합니다."); } + } } diff --git a/src/test/java/dto/BettingAmountRequestDtoTest.java b/src/test/java/dto/BettingAmountRequestDtoTest.java index b738942ee02..169db928253 100644 --- a/src/test/java/dto/BettingAmountRequestDtoTest.java +++ b/src/test/java/dto/BettingAmountRequestDtoTest.java @@ -26,6 +26,6 @@ class BettingAmountRequestDtoTest { @DisplayName("베팅 금액 입력 문자열이 숫자가 아닌 문자면 에러 발생 검증") void 베팅_금액_숫자_검증_테스트() { Assertions.assertThrows(IllegalArgumentException.class, - () -> new BettingAmountRequestDto("123")); + () -> new BettingAmountRequestDto("QWER")); } } From ef1ae2c5eaa5b2790941a61926009665a653c298 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 20:59:20 +0900 Subject: [PATCH 07/25] =?UTF-8?q?test(BettingAmountRequestDto):=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=9D=B4=20=EC=96=91=EC=88=98=EA=B0=80=20=EC=95=84=EB=8B=90=20?= =?UTF-8?q?=EC=8B=9C=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/dto/BettingAmountRequestDtoTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/dto/BettingAmountRequestDtoTest.java b/src/test/java/dto/BettingAmountRequestDtoTest.java index 169db928253..a5c6625eb3e 100644 --- a/src/test/java/dto/BettingAmountRequestDtoTest.java +++ b/src/test/java/dto/BettingAmountRequestDtoTest.java @@ -28,4 +28,11 @@ class BettingAmountRequestDtoTest { Assertions.assertThrows(IllegalArgumentException.class, () -> new BettingAmountRequestDto("QWER")); } + + @Test + @DisplayName("베팅 금액 입력 문자열이 양수가 아닌 문자면 에러 발생 검증") + void 베팅_금액_양수_검증_테스트() { + Assertions.assertThrows(IllegalArgumentException.class, + () -> new BettingAmountRequestDto("-1000")); + } } From a84a4c9c5d09e3f101aa2c2231ec7679fef5bc7a Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Thu, 12 Mar 2026 21:02:31 +0900 Subject: [PATCH 08/25] =?UTF-8?q?feat(BettingAmountDto):=20=EB=B2=A0?= =?UTF-8?q?=ED=8C=85=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=EC=9D=B4=20=EC=96=91=EC=88=98=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20=EB=AC=B8=EC=9E=90=EB=A9=B4=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/dto/BettingAmountRequestDto.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/dto/BettingAmountRequestDto.java index dfb38cc0ea4..e98d7377688 100644 --- a/src/main/java/dto/BettingAmountRequestDto.java +++ b/src/main/java/dto/BettingAmountRequestDto.java @@ -7,6 +7,7 @@ public record BettingAmountRequestDto(String bettingAmount) { public BettingAmountRequestDto { validateBettingAmountIsNotNullAndNotBlank(bettingAmount); validateBettingAmountIsDigit(bettingAmount); + validateBettingAmountIsPositive(bettingAmount); } private void validateBettingAmountIsNotNullAndNotBlank(String bettingAmount) { @@ -21,4 +22,10 @@ private void validateBettingAmountIsDigit(String bettingAmount) { } catch (NumberFormatException e) { throw new IllegalArgumentException("[ERROR] 숫자만 입력 가능합니다."); } } + + private void validateBettingAmountIsPositive(String bettingAmount) { + if(Integer.parseInt(bettingAmount) <= 0) { + throw new IllegalArgumentException("[ERROR] 양수만 입력 가능합니다."); + } + } } From 63cf1844f6d57d0d440fba47df6e86a93e658ce7 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 17:02:11 +0900 Subject: [PATCH 09/25] =?UTF-8?q?test(Betting):=20=EC=9D=B4=EB=A6=84,=20?= =?UTF-8?q?=EB=B2=A0=ED=8C=85=EA=B0=92=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EB=B3=84=20=EB=B2=A0=ED=8C=85=20=EA=B0=92=20map=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/betting/Betting.java | 4 ++ .../java/domain/betting/BettingAmount.java | 9 ++++ src/main/java/domain/player/Gambler.java | 11 ++++- src/main/java/view/InputView.java | 7 ++++ .../domain/betting/BettingAmountTest.java | 7 ++++ src/test/java/domain/betting/BettingTest.java | 41 +++++++++++++++++++ src/test/java/domain/player/GamblerTest.java | 3 +- 7 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/main/java/domain/betting/Betting.java create mode 100644 src/main/java/domain/betting/BettingAmount.java create mode 100644 src/test/java/domain/betting/BettingAmountTest.java create mode 100644 src/test/java/domain/betting/BettingTest.java diff --git a/src/main/java/domain/betting/Betting.java b/src/main/java/domain/betting/Betting.java new file mode 100644 index 00000000000..39cb5b72e04 --- /dev/null +++ b/src/main/java/domain/betting/Betting.java @@ -0,0 +1,4 @@ +package domain.betting; + +public class Betting { +} diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java new file mode 100644 index 00000000000..0afc15e0777 --- /dev/null +++ b/src/main/java/domain/betting/BettingAmount.java @@ -0,0 +1,9 @@ +package domain.betting; + +public class BettingAmount { + private final int bettingAmount; + + public BettingAmount(int bettingAmount) { + this.bettingAmount = bettingAmount; + } +} diff --git a/src/main/java/domain/player/Gambler.java b/src/main/java/domain/player/Gambler.java index c446a84ae8a..3efa47b6273 100644 --- a/src/main/java/domain/player/Gambler.java +++ b/src/main/java/domain/player/Gambler.java @@ -1,7 +1,14 @@ package domain.player; -public class Gambler extends Participant{ - public Gambler(String name) { +import domain.betting.BettingAmount; + +public class Gambler extends Participant { + + private final BettingAmount bettingAmount; + + public Gambler(String name, BettingAmount bettingAmount) { + super(name); + this.bettingAmount = bettingAmount; } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index cecf631b23e..77d4e2f5114 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,10 +1,13 @@ package view; +import domain.betting.BettingAmount; import dto.AgreementRequestDto; +import dto.BettingAmountRequestDto; import dto.NameRequestDto; import java.util.Scanner; public class InputView { + private Scanner sc = new Scanner(System.in); public NameRequestDto askGamblerNames() { @@ -17,4 +20,8 @@ public AgreementRequestDto askHitOrStand(String name) { return new AgreementRequestDto(sc.nextLine()); } + public BettingAmountRequestDto askBettingAmount(String name) { + System.out.println(name + "의 배팅 금액은?"); + return new BettingAmountRequestDto(sc.nextLine()); + } } diff --git a/src/test/java/domain/betting/BettingAmountTest.java b/src/test/java/domain/betting/BettingAmountTest.java new file mode 100644 index 00000000000..2620de048e9 --- /dev/null +++ b/src/test/java/domain/betting/BettingAmountTest.java @@ -0,0 +1,7 @@ +package domain.betting; + +import static org.junit.jupiter.api.Assertions.*; + +class BettingAmountTest { + +} \ No newline at end of file diff --git a/src/test/java/domain/betting/BettingTest.java b/src/test/java/domain/betting/BettingTest.java new file mode 100644 index 00000000000..3dc36fa0450 --- /dev/null +++ b/src/test/java/domain/betting/BettingTest.java @@ -0,0 +1,41 @@ +package domain.betting; + +import static org.junit.jupiter.api.Assertions.*; + +import domain.card.Card; +import domain.player.Gambler; +import domain.player.attribute.Name; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class BettingTest { + + @Test + @DisplayName("이름 별로 베팅 금액 정상적으로 입력받는지 테스트") + void 이름_리스트를_전달하면_각_이름에_대한_베팅_정보_맵을_생성한다() { + // given + List nameValues = List.of("pobi", "woni"); + Map gamblerBettingAmountInfo = new HashMap(); + gamblerBettingAmountInfo.put(new Name("pobi"), new BettingAmount(10000)); + gamblerBettingAmountInfo.put(new Name("woni"), new BettingAmount(20000)); + + Betting betting = new Betting(nameValues); + + betting.betBettingAmount(new Name("pobi"), new BettingAmount(10000)); + betting.betBettingAmount(new Name("woni"), new BettingAmount(20000)); + // then + Assertions.assertAll( + () -> Assertions.assertThat(betting.getBettingAmountByName(new Name("pobi"))) + .isEqualTo(new BettingAmount(10000)), + () -> Assertions.assertThat(betting.getBettingAmountByName(new Name("woni"))) + .isEqualTo(new BettingAmount(20000)) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/domain/player/GamblerTest.java b/src/test/java/domain/player/GamblerTest.java index 4f3a2014df1..09e731d69c9 100644 --- a/src/test/java/domain/player/GamblerTest.java +++ b/src/test/java/domain/player/GamblerTest.java @@ -1,5 +1,6 @@ package domain.player; +import domain.betting.BettingAmount; import domain.card.Card; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -12,7 +13,7 @@ class GamblerTest { void 카드_정상적으로_받기_테스트() { // given Card card = new Card("2", "하트"); - Gambler gambler = new Gambler("coco"); + Gambler gambler = new Gambler("coco", ); // when gambler.addCard(card); From 5b00d9033efd09069bfa084657690797141575b2 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 20:26:08 +0900 Subject: [PATCH 10/25] =?UTF-8?q?feat(Bettiing):=20=EA=B2=9C=EB=B8=94?= =?UTF-8?q?=EB=9F=AC=EB=B3=84=20=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=EC=9D=84=20=EC=A0=80=EC=9E=A5=ED=95=98=EA=B3=A0=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 6 +- .../java/controller/BlackJackController.java | 215 +++++++++--------- src/main/java/domain/betting/Betting.java | 19 ++ .../java/domain/betting/BettingAmount.java | 15 ++ src/main/java/domain/game/Game.java | 6 +- src/main/java/domain/player/Gamblers.java | 10 +- src/test/java/domain/betting/BettingTest.java | 31 +-- src/test/java/domain/game/GameTest.java | 60 ++--- src/test/java/domain/player/GamblerTest.java | 6 +- src/test/java/domain/player/GamblersTest.java | 78 +++---- 10 files changed, 242 insertions(+), 204 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 487e5ef19b6..66ee84f2fcc 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,4 +1,4 @@ -import controller.BlackJackController; +//import controller.BlackJackController; import view.InputView; import view.OutputView; @@ -6,7 +6,7 @@ public class Application { public static void main(String[] args) { InputView inputView = new InputView(); OutputView outputView = new OutputView(); - BlackJackController controller = new BlackJackController(inputView, outputView); - controller.run(); +// BlackJackController controller = new BlackJackController(inputView, outputView); +// controller.run(); } } diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 6cb515e20b4..d11f2cd9b80 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -1,103 +1,112 @@ -package controller; - -import static util.Constants.COMMA_DELIMITER; -import static util.Constants.DEALER_NAME; -import static util.Constants.DEFAULT_CARD_SET; -import static util.Constants.HIT; -import static util.Constants.STAND; - -import domain.game.GamblersGameResult; -import domain.game.Game; -import domain.player.Gambler; -import dto.AgreementRequestDto; -import dto.DealerResultDto; -import dto.ParticipantHandResponseDto; -import dto.ParticipantsGameInfoDto; -import dto.ParticipantsHandResponseDto; -import java.util.List; -import util.Parser; -import view.InputView; -import view.OutputView; - -public class BlackJackController { - private final InputView inputView; - private final OutputView outputView; - - public BlackJackController(InputView inputView, OutputView outputView) { - this.inputView = inputView; - this.outputView = outputView; - } - - public void run() { - List names = inputGamblersInfo(); - Game game = initializeGame(names); - - playGame(game); - checkDealerHand(game); - - printParticipantsResult(game); - - determineFinalGameResult(game.getResult()); - } - - private List inputGamblersInfo() { - String name = inputView.askGamblerNames().name(); - return Parser.parse(name, COMMA_DELIMITER); - } - - private Game initializeGame(List names) { - Game game = new Game(DEALER_NAME, names, DEFAULT_CARD_SET); - - outputView.printInitialDeal(names); - game.initializeGame(); - outputView.printParticipantsInfo( - new ParticipantsHandResponseDto(game.getInitialParticipantsHandInfo()) - ); - - return game; - } - - private void playGame(Game game) { - List gamblers = game.getGamblersList(); - for(Gambler gambler : gamblers) { - playTurn(game, gambler); - } - } - - private void playTurn(Game game, Gambler gambler) { - while(!gambler.isBust()) { - AgreementRequestDto agreementRequestDto = inputView.askHitOrStand(gambler.getName()); - if (agreementRequestDto.agreement().equals(HIT)) { - gambler.addCard(game.pickCard()); - outputView.printParticipantInfo( - new ParticipantHandResponseDto(gambler.getName(), gambler.getHandInfo())); - } - if (agreementRequestDto.agreement().equals(STAND)) { - break; - } - } - } - - private void checkDealerHand(Game game) { - if (game.shouldDealerDraw()) { - outputView.printDealerCardIsUnder16(); - game.addDealerCard(); - } - } - - private void printParticipantsResult(Game game) { - outputView.printParticipantsGameInfo(new ParticipantsGameInfoDto( - game.getParticipantGameInfos() - )); - } - - private void determineFinalGameResult(GamblersGameResult gamblersGameResult) { - outputView.printDealerResult( - new DealerResultDto(gamblersGameResult.countDealerWin(), - gamblersGameResult.countDealerLose(), - gamblersGameResult.countDealerDraw())); - outputView.printGamblerResult( - gamblersGameResult.getResultInfo() - ); - } -} +//package controller; +// +//import static util.Constants.COMMA_DELIMITER; +//import static util.Constants.DEALER_NAME; +//import static util.Constants.DEFAULT_CARD_SET; +//import static util.Constants.HIT; +//import static util.Constants.STAND; +// +//import domain.betting.Betting; +//import domain.betting.BettingAmount; +//import domain.game.GamblersGameResult; +//import domain.game.Game; +//import domain.player.Gambler; +//import dto.AgreementRequestDto; +//import dto.BettingAmountRequestDto; +//import dto.DealerResultDto; +//import dto.ParticipantHandResponseDto; +//import dto.ParticipantsGameInfoDto; +//import dto.ParticipantsHandResponseDto; +//import java.util.List; +//import java.util.Map; +//import util.Parser; +//import view.InputView; +//import view.OutputView; +// +//public class BlackJackController { +// private final InputView inputView; +// private final OutputView outputView; +// +// public BlackJackController(InputView inputView, OutputView outputView) { +// this.inputView = inputView; +// this.outputView = outputView; +// } +// +// public void run() { +// List names = inputGamblersInfo(); +// Map gamblerNameAndBettingInfo = betByName(names); +// Game game = initializeGame(names); +// +// playGame(game); +// checkDealerHand(game); +// +// printParticipantsResult(game); +// +// determineFinalGameResult(game.getResult()); +// } +// +// private List inputGamblersInfo() { +// String name = inputView.askGamblerNames().name(); +// return Parser.parse(name, COMMA_DELIMITER); +// } +// +// private Map betByName(List names) { +// Betting betting = new Betting(names); +// return betting.getGamblerNameAndBettingInfo(); +// } +// private Game initializeGame(List names) { +// Game game = new Game(DEALER_NAME, names, DEFAULT_CARD_SET); +// +// outputView.printInitialDeal(names); +// game.initializeGame(); +// outputView.printParticipantsInfo( +// new ParticipantsHandResponseDto(game.getInitialParticipantsHandInfo()) +// ); +// +// return game; +// } +// +// private void playGame(Game game) { +// List gamblers = game.getGamblersList(); +// for(Gambler gambler : gamblers) { +// playTurn(game, gambler); +// } +// } +// +// private void playTurn(Game game, Gambler gambler) { +// while(!gambler.isBust()) { +// AgreementRequestDto agreementRequestDto = inputView.askHitOrStand(gambler.getName()); +// if (agreementRequestDto.agreement().equals(HIT)) { +// gambler.addCard(game.pickCard()); +// outputView.printParticipantInfo( +// new ParticipantHandResponseDto(gambler.getName(), gambler.getHandInfo())); +// } +// if (agreementRequestDto.agreement().equals(STAND)) { +// break; +// } +// } +// } +// +// private void checkDealerHand(Game game) { +// if (game.shouldDealerDraw()) { +// outputView.printDealerCardIsUnder16(); +// game.addDealerCard(); +// } +// } +// +// private void printParticipantsResult(Game game) { +// outputView.printParticipantsGameInfo(new ParticipantsGameInfoDto( +// game.getParticipantGameInfos() +// )); +// } +// +// private void determineFinalGameResult(GamblersGameResult gamblersGameResult) { +// outputView.printDealerResult( +// new DealerResultDto(gamblersGameResult.countDealerWin(), +// gamblersGameResult.countDealerLose(), +// gamblersGameResult.countDealerDraw())); +// outputView.printGamblerResult( +// gamblersGameResult.getResultInfo() +// ); +// } +//} diff --git a/src/main/java/domain/betting/Betting.java b/src/main/java/domain/betting/Betting.java index 39cb5b72e04..e5339385f66 100644 --- a/src/main/java/domain/betting/Betting.java +++ b/src/main/java/domain/betting/Betting.java @@ -1,4 +1,23 @@ package domain.betting; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class Betting { + private final Map values = new HashMap<>(); + + public Betting(List names) { + for(String name : names) { + values.put(name, null); + } + } + + public void betBettingAmount(String name, BettingAmount bettingAmount) { + values.put(name, bettingAmount); + } + + public BettingAmount getBettingAmountByName(String name) { + return values.get(name); + } } diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java index 0afc15e0777..c5746c1520e 100644 --- a/src/main/java/domain/betting/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -1,9 +1,24 @@ package domain.betting; +import java.util.Objects; + public class BettingAmount { private final int bettingAmount; public BettingAmount(int bettingAmount) { this.bettingAmount = bettingAmount; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BettingAmount that = (BettingAmount) o; + return bettingAmount == that.bettingAmount; + } + + @Override + public int hashCode() { + return Objects.hash(bettingAmount); + } } diff --git a/src/main/java/domain/game/Game.java b/src/main/java/domain/game/Game.java index fd6f85c1a24..6f76f0e6a82 100644 --- a/src/main/java/domain/game/Game.java +++ b/src/main/java/domain/game/Game.java @@ -2,6 +2,8 @@ import static util.Constants.DEFAULT_START_CARD_COUNT; +import domain.betting.Betting; +import domain.betting.BettingAmount; import domain.card.Card; import domain.card.GameCards; import domain.player.Dealer; @@ -19,9 +21,9 @@ public class Game { private final Gamblers gamblers; private final GameCards gameCards; - public Game(String dealerName, List names, int amount) { + public Game(String dealerName, Map gamblersNameAndBettingInfo, int amount) { this.dealer = new Dealer(dealerName); - this.gamblers = new Gamblers(names); + this.gamblers = new Gamblers(gamblersNameAndBettingInfo); this.gameCards = new GameCards(amount); } diff --git a/src/main/java/domain/player/Gamblers.java b/src/main/java/domain/player/Gamblers.java index 9b22ec0113f..9143fb597af 100644 --- a/src/main/java/domain/player/Gamblers.java +++ b/src/main/java/domain/player/Gamblers.java @@ -1,5 +1,6 @@ package domain.player; +import domain.betting.BettingAmount; import domain.card.GameCards; import java.util.LinkedHashMap; import java.util.List; @@ -10,10 +11,11 @@ public class Gamblers { private List gamblers; - public Gamblers(List names) { - validateDuplicateNames(names); - this.gamblers = names.stream() - .map(Gambler::new) + public Gamblers(Map gamblerNameAndBettingInfo) { + validateDuplicateNames(gamblerNameAndBettingInfo.keySet().stream().toList()); + this.gamblers = gamblerNameAndBettingInfo.entrySet() + .stream() + .map(entry -> new Gambler(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); } diff --git a/src/test/java/domain/betting/BettingTest.java b/src/test/java/domain/betting/BettingTest.java index 3dc36fa0450..0a72b3c5a8b 100644 --- a/src/test/java/domain/betting/BettingTest.java +++ b/src/test/java/domain/betting/BettingTest.java @@ -1,39 +1,30 @@ package domain.betting; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.assertj.core.api.Assertions.assertThat; -import domain.card.Card; -import domain.player.Gambler; -import domain.player.attribute.Name; -import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Set; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class BettingTest { @Test - @DisplayName("이름 별로 베팅 금액 정상적으로 입력받는지 테스트") - void 이름_리스트를_전달하면_각_이름에_대한_베팅_정보_맵을_생성한다() { + @DisplayName("겜블러 별로 베팅 금액을 저장하고 조회하는 테스트") + void 겜블러별_베팅_금액을_저장하고_조회_수_있다() { // given List nameValues = List.of("pobi", "woni"); - Map gamblerBettingAmountInfo = new HashMap(); - gamblerBettingAmountInfo.put(new Name("pobi"), new BettingAmount(10000)); - gamblerBettingAmountInfo.put(new Name("woni"), new BettingAmount(20000)); - Betting betting = new Betting(nameValues); - betting.betBettingAmount(new Name("pobi"), new BettingAmount(10000)); - betting.betBettingAmount(new Name("woni"), new BettingAmount(20000)); + // when + betting.betBettingAmount("pobi", new BettingAmount(10000)); + betting.betBettingAmount("woni", new BettingAmount(20000)); + // then - Assertions.assertAll( - () -> Assertions.assertThat(betting.getBettingAmountByName(new Name("pobi"))) + assertAll( + () -> assertThat(betting.getBettingAmountByName("pobi")) .isEqualTo(new BettingAmount(10000)), - () -> Assertions.assertThat(betting.getBettingAmountByName(new Name("woni"))) + () -> assertThat(betting.getBettingAmountByName("woni")) .isEqualTo(new BettingAmount(20000)) ); } diff --git a/src/test/java/domain/game/GameTest.java b/src/test/java/domain/game/GameTest.java index a8c7e0d6162..0944da8065f 100644 --- a/src/test/java/domain/game/GameTest.java +++ b/src/test/java/domain/game/GameTest.java @@ -1,30 +1,30 @@ -package domain.game; - -import static util.Constants.DEALER_NAME; -import static util.Constants.DEFAULT_CARD_SET; -import static util.Constants.DEFAULT_START_CARD_COUNT; - -import java.util.List; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class GameTest { - - @Test - @DisplayName("게임을 처음 시작했을 떄 딜러와 참가자들 각각에게 카드가 2장씩 가는지 검증") - void 게임_초기화_검증 () { - // given - Game game = new Game(DEALER_NAME, List.of("pobi", "jason"), DEFAULT_CARD_SET); - - // when - game.initializeGame(); - - // then - Assertions.assertThat(game.getDealerHandSize()).isEqualTo(2); - Assertions.assertThat(game.getGamblersHandSize() - .stream() - .allMatch(count -> count == DEFAULT_START_CARD_COUNT)) - .isEqualTo(true); - } -} +//package domain.game; +// +//import static util.Constants.DEALER_NAME; +//import static util.Constants.DEFAULT_CARD_SET; +//import static util.Constants.DEFAULT_START_CARD_COUNT; +// +//import java.util.List; +//import org.assertj.core.api.Assertions; +//import org.junit.jupiter.api.DisplayName; +//import org.junit.jupiter.api.Test; +// +//class GameTest { +// +// @Test +// @DisplayName("게임을 처음 시작했을 떄 딜러와 참가자들 각각에게 카드가 2장씩 가는지 검증") +// void 게임_초기화_검증 () { +// // given +// Game game = new Game(DEALER_NAME, List.of("pobi", "jason"), DEFAULT_CARD_SET); +// +// // when +// game.initializeGame(); +// +// // then +// Assertions.assertThat(game.getDealerHandSize()).isEqualTo(2); +// Assertions.assertThat(game.getGamblersHandSize() +// .stream() +// .allMatch(count -> count == DEFAULT_START_CARD_COUNT)) +// .isEqualTo(true); +// } +//} diff --git a/src/test/java/domain/player/GamblerTest.java b/src/test/java/domain/player/GamblerTest.java index 09e731d69c9..1ff350b4b33 100644 --- a/src/test/java/domain/player/GamblerTest.java +++ b/src/test/java/domain/player/GamblerTest.java @@ -13,7 +13,7 @@ class GamblerTest { void 카드_정상적으로_받기_테스트() { // given Card card = new Card("2", "하트"); - Gambler gambler = new Gambler("coco", ); + Gambler gambler = new Gambler("coco", new BettingAmount(20000)); // when gambler.addCard(card); @@ -32,7 +32,7 @@ class GamblerTest { Card card2 = new Card("K", "다이아몬드"); Card card3 = new Card("K", "클로버"); - Gambler gambler = new Gambler("coco"); + Gambler gambler = new Gambler("coco", new BettingAmount(20000)); // when gambler.addCard(card1); @@ -52,7 +52,7 @@ class GamblerTest { Card card2 = new Card("K", "다이아몬드"); Card card3 = new Card("K", "클로버"); - Gambler gambler = new Gambler("coco"); + Gambler gambler = new Gambler("coco", new BettingAmount(20000)); // when gambler.addCard(card1); diff --git a/src/test/java/domain/player/GamblersTest.java b/src/test/java/domain/player/GamblersTest.java index c6029b19889..44a1577e827 100644 --- a/src/test/java/domain/player/GamblersTest.java +++ b/src/test/java/domain/player/GamblersTest.java @@ -1,39 +1,39 @@ -package domain.player; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.util.List; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class GamblersTest { - - @Test - @DisplayName("이름 리스트를 통해 player 객체들이 제대로 생성되는지 테스트") - void 이름_정상_저장_테스트() { - // given - List names = List.of("pobi", "coco"); - - // when - Gamblers gamblers = new Gamblers(names); - - // then - boolean allContainName = names.stream() - .allMatch(name -> gamblers.containGambler(name)); - - Assertions.assertThat(allContainName).isEqualTo(true); - } - - @Test - @DisplayName("이름 중복 없음 테스트") - void 이름_중복_없음_테스트() { - // given - List names = List.of("pobi", "coco", "coco", "kaiya"); - - // then - assertThrows(IllegalArgumentException.class, () -> { - new Gamblers(names); - }); - } -} +//package domain.player; +// +//import static org.junit.jupiter.api.Assertions.assertThrows; +// +//import java.util.List; +//import org.assertj.core.api.Assertions; +//import org.junit.jupiter.api.DisplayName; +//import org.junit.jupiter.api.Test; +// +//class GamblersTest { +// +// @Test +// @DisplayName("이름 리스트를 통해 player 객체들이 제대로 생성되는지 테스트") +// void 이름_정상_저장_테스트() { +// // given +// List names = List.of("pobi", "coco"); +// +// // when +// Gamblers gamblers = new Gamblers(names); +// +// // then +// boolean allContainName = names.stream() +// .allMatch(name -> gamblers.containGambler(name)); +// +// Assertions.assertThat(allContainName).isEqualTo(true); +// } +// +// @Test +// @DisplayName("이름 중복 없음 테스트") +// void 이름_중복_없음_테스트() { +// // given +// List names = List.of("pobi", "coco", "coco", "kaiya"); +// +// // then +// assertThrows(IllegalArgumentException.class, () -> { +// new Gamblers(names); +// }); +// } +//} From 1262dac2f5078a1e2376ff58c6dc2c661ab66b88 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 20:32:24 +0900 Subject: [PATCH 11/25] =?UTF-8?q?test(Betting):=20=EA=B2=9C=EB=B8=94?= =?UTF-8?q?=EB=9F=AC=20=EC=9D=B4=EB=A6=84=20=EC=A4=91=EB=B3=B5=20=EC=97=86?= =?UTF-8?q?=EC=9D=8C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/betting/Betting.java | 1 + src/test/java/domain/betting/BettingTest.java | 15 +++++++++++++++ src/test/java/domain/player/GamblersTest.java | 12 ------------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/domain/betting/Betting.java b/src/main/java/domain/betting/Betting.java index e5339385f66..a79ab6c5acd 100644 --- a/src/main/java/domain/betting/Betting.java +++ b/src/main/java/domain/betting/Betting.java @@ -8,6 +8,7 @@ public class Betting { private final Map values = new HashMap<>(); public Betting(List names) { + for(String name : names) { values.put(name, null); } diff --git a/src/test/java/domain/betting/BettingTest.java b/src/test/java/domain/betting/BettingTest.java index 0a72b3c5a8b..8621a118917 100644 --- a/src/test/java/domain/betting/BettingTest.java +++ b/src/test/java/domain/betting/BettingTest.java @@ -2,8 +2,11 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import domain.player.Gamblers; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,4 +32,16 @@ class BettingTest { ); } + + @Test + @DisplayName("이름 중복 없음 테스트") + void 이름_중복_없음_테스트() { + // given + List names = List.of("pobi", "coco", "coco", "kaiya"); + // then + assertThrows(IllegalArgumentException.class, () -> { + new Betting(names); + }); + } + } \ No newline at end of file diff --git a/src/test/java/domain/player/GamblersTest.java b/src/test/java/domain/player/GamblersTest.java index 44a1577e827..2a781182cb3 100644 --- a/src/test/java/domain/player/GamblersTest.java +++ b/src/test/java/domain/player/GamblersTest.java @@ -24,16 +24,4 @@ // // Assertions.assertThat(allContainName).isEqualTo(true); // } -// -// @Test -// @DisplayName("이름 중복 없음 테스트") -// void 이름_중복_없음_테스트() { -// // given -// List names = List.of("pobi", "coco", "coco", "kaiya"); -// -// // then -// assertThrows(IllegalArgumentException.class, () -> { -// new Gamblers(names); -// }); -// } //} From 12d28c96db67baa3189d73657ce627d3d4fa699c Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 20:34:11 +0900 Subject: [PATCH 12/25] =?UTF-8?q?feat(Betting):=20=EA=B2=9C=EB=B8=94?= =?UTF-8?q?=EB=9F=AC=20=EC=9D=B4=EB=A6=84=20=EC=A4=91=EB=B3=B5=20=EC=97=86?= =?UTF-8?q?=EC=9D=8C=20=EA=B2=80=EC=A6=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/betting/Betting.java | 11 ++++++++++- src/main/java/domain/player/Gamblers.java | 9 --------- src/test/java/domain/betting/BettingTest.java | 1 - 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/domain/betting/Betting.java b/src/main/java/domain/betting/Betting.java index a79ab6c5acd..116b0a5e1cc 100644 --- a/src/main/java/domain/betting/Betting.java +++ b/src/main/java/domain/betting/Betting.java @@ -3,12 +3,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class Betting { private final Map values = new HashMap<>(); public Betting(List names) { - + validateDuplicateNames(names); for(String name : names) { values.put(name, null); } @@ -21,4 +22,12 @@ public void betBettingAmount(String name, BettingAmount bettingAmount) { public BettingAmount getBettingAmountByName(String name) { return values.get(name); } + + public void validateDuplicateNames(List names) { + List distinctNamesCount = names.stream(). + distinct().collect(Collectors.toList()); + if(distinctNamesCount.size() != names.size()) { + throw new IllegalArgumentException("중복된 이름이 입력됩니다."); + } + } } diff --git a/src/main/java/domain/player/Gamblers.java b/src/main/java/domain/player/Gamblers.java index 9143fb597af..1c9710e2b12 100644 --- a/src/main/java/domain/player/Gamblers.java +++ b/src/main/java/domain/player/Gamblers.java @@ -12,7 +12,6 @@ public class Gamblers { private List gamblers; public Gamblers(Map gamblerNameAndBettingInfo) { - validateDuplicateNames(gamblerNameAndBettingInfo.keySet().stream().toList()); this.gamblers = gamblerNameAndBettingInfo.entrySet() .stream() .map(entry -> new Gambler(entry.getKey(), entry.getValue())) @@ -59,12 +58,4 @@ public List getHandSize() { public List getGamblers() { return gamblers; } - - public void validateDuplicateNames(List names) { - List distinctNamesCount = names.stream(). - distinct().collect(Collectors.toList()); - if(distinctNamesCount.size() != names.size()) { - throw new IllegalArgumentException("중복된 이름이 입력됩니다."); - } - } } diff --git a/src/test/java/domain/betting/BettingTest.java b/src/test/java/domain/betting/BettingTest.java index 8621a118917..aa03a7da26a 100644 --- a/src/test/java/domain/betting/BettingTest.java +++ b/src/test/java/domain/betting/BettingTest.java @@ -32,7 +32,6 @@ class BettingTest { ); } - @Test @DisplayName("이름 중복 없음 테스트") void 이름_중복_없음_테스트() { From 4422cabdb4084116d1885e9d3a60e61cf71743fe Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 20:52:09 +0900 Subject: [PATCH 13/25] =?UTF-8?q?test(Gamblers):=20=EA=B2=9C=EB=B8=94?= =?UTF-8?q?=EB=9F=AC=20=EC=9D=B4=EB=A6=84=EA=B3=BC=20=EB=B2=A0=ED=8C=85?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/domain/player/GamblersTest.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/test/java/domain/player/GamblersTest.java b/src/test/java/domain/player/GamblersTest.java index 2a781182cb3..8c179e5abc5 100644 --- a/src/test/java/domain/player/GamblersTest.java +++ b/src/test/java/domain/player/GamblersTest.java @@ -1,27 +1,30 @@ -//package domain.player; -// -//import static org.junit.jupiter.api.Assertions.assertThrows; -// -//import java.util.List; -//import org.assertj.core.api.Assertions; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -// -//class GamblersTest { -// -// @Test -// @DisplayName("이름 리스트를 통해 player 객체들이 제대로 생성되는지 테스트") -// void 이름_정상_저장_테스트() { -// // given -// List names = List.of("pobi", "coco"); -// -// // when -// Gamblers gamblers = new Gamblers(names); -// -// // then -// boolean allContainName = names.stream() -// .allMatch(name -> gamblers.containGambler(name)); -// -// Assertions.assertThat(allContainName).isEqualTo(true); -// } -//} +package domain.player; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import domain.betting.Betting; +import domain.betting.BettingAmount; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GamblersTest { + + @Test + @DisplayName("이름, 베팅금액 정상 저장 테스트") + void 겜블러_이름_베팅금액_정상_저장_생성_테스트() { + // given + Map gamblerBettingInfo = new HashMap() {}; + gamblerBettingInfo.put("pobi", new BettingAmount(10000)); + gamblerBettingInfo.put("coco", new BettingAmount(20000)); + + // when + Gamblers gamblers = new Gamblers(gamblerBettingInfo); + + // then + Assertions.assertThat(gamblers.getGamblersSize()).isEqualTo(2); + } +} From 7a76f598b1628afe615299ab76e0cef43e4efd9d Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 20:52:43 +0900 Subject: [PATCH 14/25] =?UTF-8?q?feat(Gamblers):=20=EA=B2=9C=EB=B8=94?= =?UTF-8?q?=EB=9F=AC=20=EC=9D=B4=EB=A6=84=EA=B3=BC=20=EB=B2=A0=ED=8C=85?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EC=A0=80=EC=9E=A5=20=EB=B0=8F=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Gamblers.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/player/Gamblers.java b/src/main/java/domain/player/Gamblers.java index 1c9710e2b12..26a6e76488d 100644 --- a/src/main/java/domain/player/Gamblers.java +++ b/src/main/java/domain/player/Gamblers.java @@ -58,4 +58,8 @@ public List getHandSize() { public List getGamblers() { return gamblers; } + + public int getGamblersSize() { + return gamblers.size(); + } } From e70776260da973f002cfb3e6fbe92331902c7637 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 21:12:24 +0900 Subject: [PATCH 15/25] =?UTF-8?q?test(Participants):=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=202=EC=9E=A5=20=EA=B0=92=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Participant.java | 2 ++ .../java/domain/player/ParticipantTest.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/test/java/domain/player/ParticipantTest.java diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/Participant.java index 2a0fa73c96a..ee5e20c8041 100644 --- a/src/main/java/domain/player/Participant.java +++ b/src/main/java/domain/player/Participant.java @@ -1,5 +1,7 @@ package domain.player; +import static util.Constants.BLACK_JACK; + import domain.card.Card; import domain.player.attribute.Hand; import domain.player.attribute.Name; diff --git a/src/test/java/domain/player/ParticipantTest.java b/src/test/java/domain/player/ParticipantTest.java new file mode 100644 index 00000000000..feb80e20873 --- /dev/null +++ b/src/test/java/domain/player/ParticipantTest.java @@ -0,0 +1,19 @@ +package domain.player; + +import org.assertj.core.api.Assertions; + +import domain.card.Card; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class ParticipantTest { + @Test + @DisplayName("초기 2장의 합이 21, 블랙잭인지 확인") + void 초기_2장의_합이_21_블랙잭인지_검증() { + Participant participant = new Participant("pobi"); + participant.addCard(new Card("K", "다이아몬드")); + participant.addCard(new Card("A", "다이아몬드")); + + Assertions.assertThat(participant.isBlackJack()).isEqualTo(true); + } +} \ No newline at end of file From d7235ed13058da506deece86a6de03fd75d1168b Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Fri, 13 Mar 2026 21:12:59 +0900 Subject: [PATCH 16/25] =?UTF-8?q?feat(Participants):=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=202=EC=9E=A5=20=EA=B0=92=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/player/Participant.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/Participant.java index ee5e20c8041..a9cf95ad7f6 100644 --- a/src/main/java/domain/player/Participant.java +++ b/src/main/java/domain/player/Participant.java @@ -53,4 +53,8 @@ public ParticipantGameInfo getParticipantGameInfo() { public boolean isEqualName(String name) { return this.name.isEqualName(name); } + + public boolean isBlackJack() { + return hand.calculateScore() == BLACK_JACK; + } } From 3ccae12383a1c1e8116ab83d1e0324e21119911f Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 03:25:38 +0900 Subject: [PATCH 17/25] =?UTF-8?q?test(GameResult):=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EC=99=80=20=EA=B2=9C=EB=B8=94=EB=9F=AC=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EA=B2=B0=EA=B3=BC=20=ED=8C=90=EB=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/game/GamblersGameResult.java | 49 +++------------ src/main/java/domain/game/Game.java | 2 +- src/main/java/domain/game/GameResult.java | 30 +++------ src/main/java/domain/player/Gambler.java | 5 +- src/main/java/domain/player/Participant.java | 8 ++- .../java/domain/player/attribute/Hand.java | 10 ++- src/main/java/util/Constants.java | 2 +- .../domain/game/GamblersGameResultTest.java | 63 ++++++++++--------- src/test/java/domain/game/GameResultTest.java | 58 ++++++++++++++--- 9 files changed, 120 insertions(+), 107 deletions(-) diff --git a/src/main/java/domain/game/GamblersGameResult.java b/src/main/java/domain/game/GamblersGameResult.java index d37c6490c11..14a1ee718fe 100644 --- a/src/main/java/domain/game/GamblersGameResult.java +++ b/src/main/java/domain/game/GamblersGameResult.java @@ -1,5 +1,9 @@ package domain.game; +import domain.player.Gambler; +import domain.player.Gamblers; +import domain.player.Participant; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.stream.Collectors; @@ -8,48 +12,15 @@ public class GamblersGameResult { private Map gamblersResult; - public GamblersGameResult(int dealerScore, Map gameResults) { - this.gamblersResult = gameResults.entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, - entry -> GameResult.determine( - dealerScore, - entry.getValue()), - (a, b) -> a, LinkedHashMap::new)); + public GamblersGameResult(Participant dealer, Gamblers gamblers) { + gamblersResult = new HashMap<>(); + for(Participant gambler : gamblers.getGamblers()) { + GameResult result = GameResult.determine(dealer, gambler); + gamblersResult.put(gambler.getName(), result); + } } public GameResult getMatchResult(String name) { return gamblersResult.get(name); } - - public int countDealerWin() { - return (int) gamblersResult.values() - .stream() - .filter(result -> result == GameResult.LOSE) - .count(); - } - - public int countDealerLose() { - return (int) gamblersResult.values() - .stream() - .filter(result -> result == GameResult.WIN) - .count(); - } - - public int countDealerDraw() { - return (int) gamblersResult - .values() - .stream() - .filter(result -> result == GameResult.DRAW) - .count(); - } - - public Map getResultInfo() { - return gamblersResult.entrySet() - .stream() - .collect(Collectors.toMap(Map.Entry::getKey, - entry -> entry.getValue().getGameResult(), - (a, b) -> a, LinkedHashMap::new - )); - } } diff --git a/src/main/java/domain/game/Game.java b/src/main/java/domain/game/Game.java index 6f76f0e6a82..e08a08c498b 100644 --- a/src/main/java/domain/game/Game.java +++ b/src/main/java/domain/game/Game.java @@ -73,6 +73,6 @@ public List getGamblersHandSize() { } public GamblersGameResult getResult(){ - return new GamblersGameResult(dealer.getTotalScore(), gamblers.getParticipantTotalScore()); + return new GamblersGameResult(dealer, gamblers); } } diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 9ff5145c8aa..e86ccf20e24 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,33 +1,19 @@ package domain.game; -import static util.Constants.BLACK_JACK; +import domain.player.Participant; public enum GameResult { - WIN("승"), - LOSE("패"), - DRAW("무"); + BLACK_JACK(1.5), + WIN(1.0), + LOSE(-1.0), + DRAW(0.0); - private String gameResult; + private final double benefitRatio; - GameResult(String gameResult) { - this.gameResult = gameResult; + GameResult(double gameResult) { + this.benefitRatio = gameResult; } - public static GameResult determine(int dealerScore, int gamblerScore) { - if(gamblerScore > BLACK_JACK) return LOSE; - if(dealerScore > BLACK_JACK) return WIN; - if(dealerScore < gamblerScore) { - return WIN; - } - if(dealerScore > gamblerScore) { - return LOSE; - } - return DRAW; - } - - public String getGameResult() { - return gameResult; - } } diff --git a/src/main/java/domain/player/Gambler.java b/src/main/java/domain/player/Gambler.java index 3efa47b6273..d82bbb2d72d 100644 --- a/src/main/java/domain/player/Gambler.java +++ b/src/main/java/domain/player/Gambler.java @@ -7,8 +7,11 @@ public class Gambler extends Participant { private final BettingAmount bettingAmount; public Gambler(String name, BettingAmount bettingAmount) { - super(name); this.bettingAmount = bettingAmount; } + + public BettingAmount getBettingAmount() { + return bettingAmount; + } } diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/Participant.java index a9cf95ad7f6..b911b860478 100644 --- a/src/main/java/domain/player/Participant.java +++ b/src/main/java/domain/player/Participant.java @@ -1,6 +1,6 @@ package domain.player; -import static util.Constants.BLACK_JACK; +import static util.Constants.BLACK_JACK_SCORE; import domain.card.Card; import domain.player.attribute.Hand; @@ -55,6 +55,10 @@ public boolean isEqualName(String name) { } public boolean isBlackJack() { - return hand.calculateScore() == BLACK_JACK; + return hand.isBlackJack(); + } + + public boolean canHit() { + return !isBlackJack() && !isBust(); } } diff --git a/src/main/java/domain/player/attribute/Hand.java b/src/main/java/domain/player/attribute/Hand.java index 7b7f2fc87be..e433f18ab98 100644 --- a/src/main/java/domain/player/attribute/Hand.java +++ b/src/main/java/domain/player/attribute/Hand.java @@ -2,7 +2,7 @@ import static util.Constants.ACE_HIGH_SCORE; import static util.Constants.ACE_LOW_SCORE; -import static util.Constants.BLACK_JACK; +import static util.Constants.BLACK_JACK_SCORE; import domain.card.Card; import java.util.ArrayList; @@ -26,14 +26,14 @@ public int getCardsSize() { } public boolean isBust() { - return calculateScore() > BLACK_JACK; + return calculateScore() > BLACK_JACK_SCORE; } public int calculateScore() { int sum = calculateBaseScore(); int aceCount = countAce(); - while (sum > BLACK_JACK && aceCount > 0) { + while (sum > BLACK_JACK_SCORE && aceCount > 0) { sum -= (ACE_HIGH_SCORE - ACE_LOW_SCORE); aceCount--; } @@ -61,6 +61,10 @@ private int calculateBaseScore() { return sum; } + public boolean isBlackJack() { + return getCardsSize() == 2 && calculateScore() == BLACK_JACK_SCORE; + } + private int countAce() { int aceCount = 0; diff --git a/src/main/java/util/Constants.java b/src/main/java/util/Constants.java index 334940f9a82..faf28338201 100644 --- a/src/main/java/util/Constants.java +++ b/src/main/java/util/Constants.java @@ -12,7 +12,7 @@ public class Constants { public static final int ACE_LOW_SCORE = 1; - public static final int BLACK_JACK = 21; + public static final int BLACK_JACK_SCORE = 21; public static final int DEALER_REFERENCE_POINT = 16; diff --git a/src/test/java/domain/game/GamblersGameResultTest.java b/src/test/java/domain/game/GamblersGameResultTest.java index 7b369b924f2..5cc28a6ac92 100644 --- a/src/test/java/domain/game/GamblersGameResultTest.java +++ b/src/test/java/domain/game/GamblersGameResultTest.java @@ -1,29 +1,34 @@ -package domain.game; - -import java.util.HashMap; -import java.util.Map; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class GamblersGameResultTest { - - @Test - @DisplayName("승패 결과 저장 검증") - void 승패_결과_저장_검증() { - // given - Map gamblers = new HashMap<>(); - gamblers.put("pobi",10); - gamblers.put("coco", 21); - gamblers.put("kaiya", 20); - - - // when - GamblersGameResult gameResult = new GamblersGameResult(20, gamblers); - - // then - Assertions.assertThat(gameResult.getMatchResult("pobi")).isEqualTo(GameResult.LOSE); - Assertions.assertThat(gameResult.getMatchResult("coco")).isEqualTo(GameResult.WIN); - Assertions.assertThat(gameResult.getMatchResult("kaiya")).isEqualTo(GameResult.DRAW); - } -} +//package domain.game; +// +//import static util.Constants.DEALER_NAME; +// +//import domain.card.Card; +//import domain.player.Dealer; +//import java.util.HashMap; +//import java.util.Map; +//import org.assertj.core.api.Assertions; +//import org.junit.jupiter.api.DisplayName; +//import org.junit.jupiter.api.Test; +// +//class GamblersGameResultTest { +// +// @Test +// @DisplayName("승패 결과 저장 검증") +// void 승패_결과_저장_검증() { +// // given +// Map gamblers = new HashMap<>(); +// gamblers.put("pobi",10); +// gamblers.put("coco", 21); +// gamblers.put("kaiya", 20); +// Dealer dealer = new Dealer(DEALER_NAME); +// dealer.addCard(new Card("K", "다이아몬드")); +// +// // when +// GamblersGameResult gameResult = new GamblersGameResult(dealer, gamblers); +// +// // then +// Assertions.assertThat(gameResult.getMatchResult("pobi")).isEqualTo(GameResult.LOSE); +// Assertions.assertThat(gameResult.getMatchResult("coco")).isEqualTo(GameResult.WIN); +// Assertions.assertThat(gameResult.getMatchResult("kaiya")).isEqualTo(GameResult.DRAW); +// } +//} diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 52613550085..820ce57066a 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -1,25 +1,65 @@ package domain.game; +import static util.Constants.DEALER_NAME; + +import domain.betting.BettingAmount; +import domain.card.Card; +import domain.player.Dealer; +import domain.player.Gambler; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class GameResultTest { @Test - @DisplayName("게임 최종 결과 테스트") - void 게임_최종_결과_검증_겜블러_패() { - Assertions.assertThat(GameResult.determine(20, 16)).isEqualTo(GameResult.LOSE); + @DisplayName("게임 최종 결과 딜러, 겜블러 동시에 블랙잭") + void 게임_최종_결과_딜러_겜블러_블랙잭() { + Dealer dealer = new Dealer(DEALER_NAME); + dealer.addCard(new Card("K", "다이아몬드")); + dealer.addCard(new Card("A", "다이아몬드")); + + Gambler gambler = new Gambler("pobi", new BettingAmount(10000)); + gambler.addCard(new Card("Q", "다이아몬드")); + gambler.addCard(new Card("A", "하트")); + Assertions.assertThat(GameResult.determine(dealer, gambler)).isEqualTo(GameResult.DRAW); + } + + @Test + @DisplayName("게임 최종 결과 겜블러 블랙잭") + void 게임_최종_결과_겜블러_블랙잭() { + Dealer dealer = new Dealer(DEALER_NAME); + dealer.addCard(new Card("2", "다이아몬드")); + dealer.addCard(new Card("A", "다이아몬드")); + + Gambler gambler = new Gambler("pobi", new BettingAmount(10000)); + gambler.addCard(new Card("Q", "다이아몬드")); + gambler.addCard(new Card("A", "하트")); + Assertions.assertThat(GameResult.determine(dealer, gambler)).isEqualTo(GameResult.BLACK_JACK); } @Test - @DisplayName("게임 최종 결과 테스트") - void 게임_최종_결과_검증_겜블러_승() { - Assertions.assertThat(GameResult.determine(18, 21)).isEqualTo(GameResult.WIN); + @DisplayName("게임 최종 결과 딜러 승리") + void 게임_최종_결과_딜러_승() { + Dealer dealer = new Dealer(DEALER_NAME); + dealer.addCard(new Card("8", "다이아몬드")); + dealer.addCard(new Card("A", "다이아몬드")); + + Gambler gambler = new Gambler("pobi", new BettingAmount(10000)); + gambler.addCard(new Card("2", "다이아몬드")); + gambler.addCard(new Card("3", "하트")); + Assertions.assertThat(GameResult.determine(dealer, gambler)).isEqualTo(GameResult.LOSE); } @Test - @DisplayName("게임 최종 결과 테스트") - void 게임_최종_결과_검증_무승부() { - Assertions.assertThat(GameResult.determine(20, 20)).isEqualTo(GameResult.DRAW); + @DisplayName("게임 최종 결과 겜블러 승리") + void 게임_최종_결과_겜블러_승리() { + Dealer dealer = new Dealer(DEALER_NAME); + dealer.addCard(new Card("3", "다이아몬드")); + dealer.addCard(new Card("6", "다이아몬드")); + + Gambler gambler = new Gambler("pobi", new BettingAmount(10000)); + gambler.addCard(new Card("9", "다이아몬드")); + gambler.addCard(new Card("A", "하트")); + Assertions.assertThat(GameResult.determine(dealer, gambler)).isEqualTo(GameResult.WIN); } } From cbd521b72916ca6a8e1a0e6c5f42e19a82d993c4 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 03:26:12 +0900 Subject: [PATCH 18/25] =?UTF-8?q?feat(GameResult):=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EC=99=80=20=EA=B2=9C=EB=B8=94=EB=9F=AC=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EA=B2=B0=EA=B3=BC=20=ED=8C=90=EB=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/game/GameResult.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index e86ccf20e24..34c5f868df0 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -15,5 +15,22 @@ public enum GameResult { this.benefitRatio = gameResult; } - + public static GameResult determine(Participant dealer, Participant gambler) { + if (dealer.isBlackJack() && gambler.isBlackJack()) { + return DRAW; + } + if (gambler.isBlackJack()) { + return BLACK_JACK; + } + if (dealer.isBlackJack()) { + return LOSE; + } + if (dealer.getTotalScore() > gambler.getTotalScore()) { + return LOSE; + } + if (dealer.getTotalScore() < gambler.getTotalScore()) { + return WIN; + } + return DRAW; + } } From 7a3f30c27baafbcc4de1a92a3ddaf646697334aa Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 09:08:28 +0900 Subject: [PATCH 19/25] =?UTF-8?q?test(GameResult):=20=EC=B5=9C=EC=A2=85=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EB=94=9C=EB=9F=AC,=20=EC=B0=B8=EC=97=AC?= =?UTF-8?q?=EC=9E=90=EB=93=A4=20=EC=88=98=EC=9D=B5=EA=B8=88=EC=95=A1=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/betting/BettingAmount.java | 4 + .../java/domain/game/GamblersGameResult.java | 15 ++-- src/main/java/domain/game/GameResult.java | 14 ++++ src/main/java/domain/game/Profit.java | 29 +++++++ src/main/java/domain/player/Gamblers.java | 3 + src/main/java/util/Constants.java | 2 + .../domain/game/GamblersGameResultTest.java | 84 +++++++++++-------- src/test/java/domain/game/GameResultTest.java | 33 ++++++++ src/test/java/domain/game/GameTest.java | 66 ++++++++------- 9 files changed, 176 insertions(+), 74 deletions(-) create mode 100644 src/main/java/domain/game/Profit.java diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java index c5746c1520e..1c31eb578b3 100644 --- a/src/main/java/domain/betting/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -21,4 +21,8 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(bettingAmount); } + + public int getBettingAmount() { + return bettingAmount; + } } diff --git a/src/main/java/domain/game/GamblersGameResult.java b/src/main/java/domain/game/GamblersGameResult.java index 14a1ee718fe..55a8b781099 100644 --- a/src/main/java/domain/game/GamblersGameResult.java +++ b/src/main/java/domain/game/GamblersGameResult.java @@ -1,5 +1,7 @@ package domain.game; +import static util.Constants.REVERSE_SIGN; + import domain.player.Gambler; import domain.player.Gamblers; import domain.player.Participant; @@ -10,17 +12,10 @@ public class GamblersGameResult { - private Map gamblersResult; + private Map participantProfits; public GamblersGameResult(Participant dealer, Gamblers gamblers) { - gamblersResult = new HashMap<>(); - for(Participant gambler : gamblers.getGamblers()) { - GameResult result = GameResult.determine(dealer, gambler); - gamblersResult.put(gambler.getName(), result); - } - } - - public GameResult getMatchResult(String name) { - return gamblersResult.get(name); + this.participantProfits = new HashMap<>(); + calculateProfits(dealer, gamblers); } } diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 34c5f868df0..906ae952014 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,5 +1,7 @@ package domain.game; +import domain.betting.BettingAmount; +import domain.player.Gambler; import domain.player.Participant; public enum GameResult { @@ -33,4 +35,16 @@ public static GameResult determine(Participant dealer, Participant gambler) { } return DRAW; } + public Profit calculateProfit(BettingAmount bettingAmount) { + if(this == BLACK_JACK) { + return new Profit((bettingAmount.getBettingAmount() * 3)/2); + } + if(this == WIN) { + return new Profit(bettingAmount.getBettingAmount()); + } + if(this == DRAW) { + return new Profit(0); + } + return new Profit(-bettingAmount.getBettingAmount()); + } } diff --git a/src/main/java/domain/game/Profit.java b/src/main/java/domain/game/Profit.java new file mode 100644 index 00000000000..b7dee35bcc2 --- /dev/null +++ b/src/main/java/domain/game/Profit.java @@ -0,0 +1,29 @@ +package domain.game; + +import domain.betting.BettingAmount; +import java.util.Objects; + +public class Profit { + private final int profit; + + public Profit(int profit) { + this.profit = profit; + } + + public int getProfit() { + return profit; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Profit that = (Profit) o; + return profit == that.profit; + } + + @Override + public int hashCode() { + return Objects.hash(profit); + } +} diff --git a/src/main/java/domain/player/Gamblers.java b/src/main/java/domain/player/Gamblers.java index 26a6e76488d..6784a1c804a 100644 --- a/src/main/java/domain/player/Gamblers.java +++ b/src/main/java/domain/player/Gamblers.java @@ -18,6 +18,9 @@ public Gamblers(Map gamblerNameAndBettingInfo) { .collect(Collectors.toList()); } + public Gamblers(List gamblerList) { + this.gamblers = gamblerList; + } public boolean containGambler(String name) { return gamblers.stream() .anyMatch(gambler -> gambler.isEqualName(name)); diff --git a/src/main/java/util/Constants.java b/src/main/java/util/Constants.java index faf28338201..e6f312a129b 100644 --- a/src/main/java/util/Constants.java +++ b/src/main/java/util/Constants.java @@ -26,6 +26,8 @@ public class Constants { public static final int MAXIMUM_NAME_LENGTH = 10; + public static final int REVERSE_SIGN = -1; + private Constants() { } } diff --git a/src/test/java/domain/game/GamblersGameResultTest.java b/src/test/java/domain/game/GamblersGameResultTest.java index 5cc28a6ac92..980da7de9ee 100644 --- a/src/test/java/domain/game/GamblersGameResultTest.java +++ b/src/test/java/domain/game/GamblersGameResultTest.java @@ -1,34 +1,50 @@ -//package domain.game; -// -//import static util.Constants.DEALER_NAME; -// -//import domain.card.Card; -//import domain.player.Dealer; -//import java.util.HashMap; -//import java.util.Map; -//import org.assertj.core.api.Assertions; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -// -//class GamblersGameResultTest { -// -// @Test -// @DisplayName("승패 결과 저장 검증") -// void 승패_결과_저장_검증() { -// // given -// Map gamblers = new HashMap<>(); -// gamblers.put("pobi",10); -// gamblers.put("coco", 21); -// gamblers.put("kaiya", 20); -// Dealer dealer = new Dealer(DEALER_NAME); -// dealer.addCard(new Card("K", "다이아몬드")); -// -// // when -// GamblersGameResult gameResult = new GamblersGameResult(dealer, gamblers); -// -// // then -// Assertions.assertThat(gameResult.getMatchResult("pobi")).isEqualTo(GameResult.LOSE); -// Assertions.assertThat(gameResult.getMatchResult("coco")).isEqualTo(GameResult.WIN); -// Assertions.assertThat(gameResult.getMatchResult("kaiya")).isEqualTo(GameResult.DRAW); -// } -//} +package domain.game; + +import static util.Constants.DEALER_NAME; + +import domain.betting.BettingAmount; +import domain.card.Card; +import domain.player.Dealer; +import domain.player.Gambler; +import domain.player.Gamblers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GamblersGameResultTest { + + @Test + @DisplayName("딜러, 참여자들의 수익을 정산") + void 딜러_참여자들_수익_정산() { + // given + Dealer dealer = new Dealer(DEALER_NAME); + dealer.addCard(new Card("K", "하트")); + dealer.addCard(new Card("Q", "하트")); + + Gambler pobi = new Gambler("pobi", new BettingAmount(10000)); + pobi.addCard(new Card("A", "스페이드")); + pobi.addCard(new Card("J", "클로버")); + + Gambler coco = new Gambler("coco", new BettingAmount(20000)); + coco.addCard(new Card("7", "하트")); + coco.addCard(new Card("Q", "스페이드")); + + Gambler kaiya = new Gambler("kaiya", new BettingAmount(30000)); + kaiya.addCard(new Card("J", "하트")); + kaiya.addCard(new Card("Q", "다이아몬드")); + + Gamblers gamblers = new Gamblers(List.of(pobi, coco, kaiya)); + + // when + GamblersGameResult gameResult = new GamblersGameResult(dealer, gamblers); + + // then + Assertions.assertThat(gameResult.getDealerProfit()).isEqualTo(new Profit(5000)); + Assertions.assertThat(gameResult.getMatchProfits("pobi")).isEqualTo(new Profit(15000)); + Assertions.assertThat(gameResult.getMatchProfits("coco")).isEqualTo(new Profit(-20000)); + Assertions.assertThat(gameResult.getMatchProfits("kaiya")).isEqualTo(new Profit(0)); + } +} diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 820ce57066a..95efc7c3429 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -6,6 +6,7 @@ import domain.card.Card; import domain.player.Dealer; import domain.player.Gambler; +import java.lang.annotation.Documented; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -62,4 +63,36 @@ class GameResultTest { gambler.addCard(new Card("A", "하트")); Assertions.assertThat(GameResult.determine(dealer, gambler)).isEqualTo(GameResult.WIN); } + + @Test + @DisplayName("블랙잭 시 베팅 금액의 1.5배 수익을 반환한다") + void 겜블러_블랙잭_수익금액_계산() { + BettingAmount bettingAmount = new BettingAmount(10000); + Profit resultProfit = GameResult.BLACK_JACK.calculateProfit(bettingAmount); + Assertions.assertThat(resultProfit).isEqualTo(new Profit(15000)); + } + + @Test + @DisplayName("승리 시 베팅 금액의 1배 수익을 반환한다") + void 겜블러_승리_수익금액_계산() { + BettingAmount bettingAmount = new BettingAmount(10000); + Profit resultProfit = GameResult.WIN.calculateProfit(bettingAmount); + Assertions.assertThat(resultProfit).isEqualTo(new Profit(10000)); + } + + @Test + @DisplayName("패배 시 베팅 금액의 -1배 수익을 반환한다") + void 겜블러_패배_수익금액_계산() { + BettingAmount bettingAmount = new BettingAmount(10000); + Profit resultProfit = GameResult.LOSE.calculateProfit(bettingAmount); + Assertions.assertThat(resultProfit).isEqualTo(new Profit(-10000)); + } + + @Test + @DisplayName("무승부 시 베팅 금액의 0배 수익을 반환한다") + void 겜블러_블랙잭_무승부_수익금액_계산() { + BettingAmount bettingAmount = new BettingAmount(10000); + Profit resultProfit = GameResult.DRAW.calculateProfit(bettingAmount); + Assertions.assertThat(resultProfit).isEqualTo(new Profit(0)); + } } diff --git a/src/test/java/domain/game/GameTest.java b/src/test/java/domain/game/GameTest.java index 0944da8065f..39b83627305 100644 --- a/src/test/java/domain/game/GameTest.java +++ b/src/test/java/domain/game/GameTest.java @@ -1,30 +1,36 @@ -//package domain.game; -// -//import static util.Constants.DEALER_NAME; -//import static util.Constants.DEFAULT_CARD_SET; -//import static util.Constants.DEFAULT_START_CARD_COUNT; -// -//import java.util.List; -//import org.assertj.core.api.Assertions; -//import org.junit.jupiter.api.DisplayName; -//import org.junit.jupiter.api.Test; -// -//class GameTest { -// -// @Test -// @DisplayName("게임을 처음 시작했을 떄 딜러와 참가자들 각각에게 카드가 2장씩 가는지 검증") -// void 게임_초기화_검증 () { -// // given -// Game game = new Game(DEALER_NAME, List.of("pobi", "jason"), DEFAULT_CARD_SET); -// -// // when -// game.initializeGame(); -// -// // then -// Assertions.assertThat(game.getDealerHandSize()).isEqualTo(2); -// Assertions.assertThat(game.getGamblersHandSize() -// .stream() -// .allMatch(count -> count == DEFAULT_START_CARD_COUNT)) -// .isEqualTo(true); -// } -//} +package domain.game; + +import static util.Constants.DEALER_NAME; +import static util.Constants.DEFAULT_CARD_SET; +import static util.Constants.DEFAULT_START_CARD_COUNT; + +import domain.betting.BettingAmount; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class GameTest { + + @Test + @DisplayName("게임을 처음 시작했을 떄 딜러와 참가자들 각각에게 카드가 2장씩 가는지 검증") + void 게임_초기화_검증 () { + // given + Map tempGamblers = new HashMap<>(); + tempGamblers.put("pobi", new BettingAmount(10000)); + tempGamblers.put("jason", new BettingAmount(20000)); + Game game = new Game(DEALER_NAME, tempGamblers, DEFAULT_CARD_SET); + + // when + game.initializeGame(); + + // then + Assertions.assertThat(game.getDealerHandSize()).isEqualTo(2); + Assertions.assertThat(game.getGamblersHandSize() + .stream() + .allMatch(count -> count == DEFAULT_START_CARD_COUNT)) + .isEqualTo(true); + } +} From 481010e866185b22f11156c263ca3d9ebd8b0ba1 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 09:09:30 +0900 Subject: [PATCH 20/25] =?UTF-8?q?feat(GamblersGameResult):=20=EB=94=9C?= =?UTF-8?q?=EB=9F=AC,=20=EC=B0=B8=EC=97=AC=EC=9E=90=EB=93=A4=EC=9D=98=20?= =?UTF-8?q?=EC=88=98=EC=9D=B5=EC=9D=84=20=EC=A0=95=EC=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/domain/game/GamblersGameResult.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/domain/game/GamblersGameResult.java b/src/main/java/domain/game/GamblersGameResult.java index 55a8b781099..095d50b2aef 100644 --- a/src/main/java/domain/game/GamblersGameResult.java +++ b/src/main/java/domain/game/GamblersGameResult.java @@ -18,4 +18,24 @@ public GamblersGameResult(Participant dealer, Gamblers gamblers) { this.participantProfits = new HashMap<>(); calculateProfits(dealer, gamblers); } + + private void calculateProfits(Participant dealer, Gamblers gamblers) { + for (Gambler gambler : gamblers.getGamblers()) { + GameResult result = GameResult.determine(dealer, gambler); + Profit profit = result.calculateProfit(gambler.getBettingAmount()); + participantProfits.put(gambler.getName(), profit); + } + } + + public Profit getMatchProfits(String name) { + return participantProfits.get(name); + } + + + public Profit getDealerProfit() { + int totalProfit = participantProfits.values().stream() + .mapToInt(Profit::getProfit) + .sum(); + return new Profit(totalProfit * REVERSE_SIGN); + } } From 4f9240039b7597ed0fa5789b33f590fa6eb331d1 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 10:25:34 +0900 Subject: [PATCH 21/25] =?UTF-8?q?refactor(BettingAmountRequestDto):=20?= =?UTF-8?q?=EC=B5=9C=EC=86=8C=20=EB=B2=A0=ED=8C=85=20=EA=B8=88=EC=95=A1=20?= =?UTF-8?q?=EC=83=81=EC=88=98=EB=A1=9C=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 5 +- .../java/controller/BlackJackController.java | 231 +++++++++--------- src/main/java/domain/betting/Betting.java | 7 +- .../java/domain/game/GamblersGameResult.java | 5 +- src/main/java/domain/game/GameResult.java | 7 + .../java/domain/player/attribute/Hand.java | 6 - .../java/dto/BettingAmountRequestDto.java | 15 +- src/main/java/dto/DealerResultDto.java | 2 +- src/main/java/util/Constants.java | 2 + src/main/java/view/OutputView.java | 28 +-- 10 files changed, 165 insertions(+), 143 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 66ee84f2fcc..7cd71ffcac9 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,4 +1,5 @@ //import controller.BlackJackController; +import controller.BlackJackController; import view.InputView; import view.OutputView; @@ -6,7 +7,7 @@ public class Application { public static void main(String[] args) { InputView inputView = new InputView(); OutputView outputView = new OutputView(); -// BlackJackController controller = new BlackJackController(inputView, outputView); -// controller.run(); + BlackJackController controller = new BlackJackController(inputView, outputView); + controller.run(); } } diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index d11f2cd9b80..98533bcaefd 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -1,112 +1,119 @@ -//package controller; -// -//import static util.Constants.COMMA_DELIMITER; -//import static util.Constants.DEALER_NAME; -//import static util.Constants.DEFAULT_CARD_SET; -//import static util.Constants.HIT; -//import static util.Constants.STAND; -// -//import domain.betting.Betting; -//import domain.betting.BettingAmount; -//import domain.game.GamblersGameResult; -//import domain.game.Game; -//import domain.player.Gambler; -//import dto.AgreementRequestDto; -//import dto.BettingAmountRequestDto; -//import dto.DealerResultDto; -//import dto.ParticipantHandResponseDto; -//import dto.ParticipantsGameInfoDto; -//import dto.ParticipantsHandResponseDto; -//import java.util.List; -//import java.util.Map; -//import util.Parser; -//import view.InputView; -//import view.OutputView; -// -//public class BlackJackController { -// private final InputView inputView; -// private final OutputView outputView; -// -// public BlackJackController(InputView inputView, OutputView outputView) { -// this.inputView = inputView; -// this.outputView = outputView; -// } -// -// public void run() { -// List names = inputGamblersInfo(); -// Map gamblerNameAndBettingInfo = betByName(names); -// Game game = initializeGame(names); -// -// playGame(game); -// checkDealerHand(game); -// -// printParticipantsResult(game); -// -// determineFinalGameResult(game.getResult()); -// } -// -// private List inputGamblersInfo() { -// String name = inputView.askGamblerNames().name(); -// return Parser.parse(name, COMMA_DELIMITER); -// } -// -// private Map betByName(List names) { -// Betting betting = new Betting(names); -// return betting.getGamblerNameAndBettingInfo(); -// } -// private Game initializeGame(List names) { -// Game game = new Game(DEALER_NAME, names, DEFAULT_CARD_SET); -// -// outputView.printInitialDeal(names); -// game.initializeGame(); -// outputView.printParticipantsInfo( -// new ParticipantsHandResponseDto(game.getInitialParticipantsHandInfo()) -// ); -// -// return game; -// } -// -// private void playGame(Game game) { -// List gamblers = game.getGamblersList(); -// for(Gambler gambler : gamblers) { -// playTurn(game, gambler); -// } -// } -// -// private void playTurn(Game game, Gambler gambler) { -// while(!gambler.isBust()) { -// AgreementRequestDto agreementRequestDto = inputView.askHitOrStand(gambler.getName()); -// if (agreementRequestDto.agreement().equals(HIT)) { -// gambler.addCard(game.pickCard()); -// outputView.printParticipantInfo( -// new ParticipantHandResponseDto(gambler.getName(), gambler.getHandInfo())); -// } -// if (agreementRequestDto.agreement().equals(STAND)) { -// break; -// } -// } -// } -// -// private void checkDealerHand(Game game) { -// if (game.shouldDealerDraw()) { -// outputView.printDealerCardIsUnder16(); -// game.addDealerCard(); -// } -// } -// -// private void printParticipantsResult(Game game) { -// outputView.printParticipantsGameInfo(new ParticipantsGameInfoDto( -// game.getParticipantGameInfos() -// )); -// } -// -// private void determineFinalGameResult(GamblersGameResult gamblersGameResult) { -// outputView.printDealerResult( -// new DealerResultDto(gamblersGameResult.countDealerWin(), -// gamblersGameResult.countDealerLose(), -// gamblersGameResult.countDealerDraw())); -// outputView.printGamblerResult( -// gamblersGameResult.getResultInfo() -// ); -// } -//} +package controller; + +import static util.Constants.COMMA_DELIMITER; +import static util.Constants.DEALER_NAME; +import static util.Constants.DEFAULT_CARD_SET; +import static util.Constants.HIT; +import static util.Constants.STAND; + +import domain.betting.Betting; +import domain.betting.BettingAmount; +import domain.game.GamblersGameResult; +import domain.game.Game; +import domain.player.Gambler; +import dto.AgreementRequestDto; +import dto.BettingAmountRequestDto; +import dto.DealerResultDto; +import dto.ParticipantHandResponseDto; +import dto.ParticipantsGameInfoDto; +import dto.ParticipantsHandResponseDto; +import java.util.List; +import java.util.Map; +import util.Parser; +import view.InputView; +import view.OutputView; + +public class BlackJackController { + private final InputView inputView; + private final OutputView outputView; + + public BlackJackController(InputView inputView, OutputView outputView) { + this.inputView = inputView; + this.outputView = outputView; + } + + public void run() { + List names = inputGamblersInfo(); + Map gamblerNameAndBettingInfo = betByName(names); + Game game = initializeGame(gamblerNameAndBettingInfo); + + playGame(game); + checkDealerHand(game); + + printParticipantsResult(game); + + determineFinalGameProfit(game.getResult()); + } + + private List inputGamblersInfo() { + String name = inputView.askGamblerNames().name(); + return Parser.parse(name, COMMA_DELIMITER); + } + + private Map betByName(List names) { + Betting betting = new Betting(names); + for(String name : names) { + BettingAmountRequestDto bettingAmountRequestDto = inputView.askBettingAmount(name); + betting.betBettingAmount(name, + new BettingAmount(bettingAmountRequestDto.getBettingAmount())); + } + return betting.getBettingAmounts(); + } + + private Game initializeGame(Map gamblerNameAndBettingInfo) { + Game game = new Game(DEALER_NAME, gamblerNameAndBettingInfo, DEFAULT_CARD_SET); + + outputView.printInitialDeal(gamblerNameAndBettingInfo.keySet().stream().toList()); + game.initializeGame(); + outputView.printParticipantsInfo( + new ParticipantsHandResponseDto(game.getInitialParticipantsHandInfo()) + ); + return game; + } + + private void playGame(Game game) { + List gamblers = game.getGamblersList(); + for(Gambler gambler : gamblers) { + if(gambler.isBlackJack()) { + outputView.printBlackJackMessage(gambler.getName()); + continue; + } + playTurn(game, gambler); + } + } + + private void playTurn(Game game, Gambler gambler) { + while(!gambler.isBust()) { + AgreementRequestDto agreementRequestDto = inputView.askHitOrStand(gambler.getName()); + if (agreementRequestDto.agreement().equals(HIT)) { + gambler.addCard(game.pickCard()); + outputView.printParticipantInfo( + new ParticipantHandResponseDto(gambler.getName(), gambler.getHandInfo())); + } + if (agreementRequestDto.agreement().equals(STAND)) { + break; + } + } + } + + private void checkDealerHand(Game game) { + if (game.shouldDealerDraw()) { + outputView.printDealerCardIsBelowDrawThreshold(); + game.addDealerCard(); + } + } + + private void printParticipantsResult(Game game) { + outputView.printParticipantsGameInfo(new ParticipantsGameInfoDto( + game.getParticipantGameInfos() + )); + } + + private void determineFinalGameProfit(GamblersGameResult gamblersGameResult) { + outputView.printDealerResult( + new DealerResultDto(gamblersGameResult.getDealerProfit().getProfit())); + outputView.printGamblerResult( + gamblersGameResult.getParticipantProfits() + ); + } +} diff --git a/src/main/java/domain/betting/Betting.java b/src/main/java/domain/betting/Betting.java index 116b0a5e1cc..e2331c13c54 100644 --- a/src/main/java/domain/betting/Betting.java +++ b/src/main/java/domain/betting/Betting.java @@ -1,12 +1,13 @@ package domain.betting; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Betting { - private final Map values = new HashMap<>(); + private final Map values = new LinkedHashMap<>(); public Betting(List names) { validateDuplicateNames(names); @@ -23,6 +24,10 @@ public BettingAmount getBettingAmountByName(String name) { return values.get(name); } + public Map getBettingAmounts() { + return values; + } + public void validateDuplicateNames(List names) { List distinctNamesCount = names.stream(). distinct().collect(Collectors.toList()); diff --git a/src/main/java/domain/game/GamblersGameResult.java b/src/main/java/domain/game/GamblersGameResult.java index 095d50b2aef..bac572bc898 100644 --- a/src/main/java/domain/game/GamblersGameResult.java +++ b/src/main/java/domain/game/GamblersGameResult.java @@ -15,7 +15,7 @@ public class GamblersGameResult { private Map participantProfits; public GamblersGameResult(Participant dealer, Gamblers gamblers) { - this.participantProfits = new HashMap<>(); + this.participantProfits = new LinkedHashMap<>(); calculateProfits(dealer, gamblers); } @@ -31,6 +31,9 @@ public Profit getMatchProfits(String name) { return participantProfits.get(name); } + public Map getParticipantProfits() { + return participantProfits; + } public Profit getDealerProfit() { int totalProfit = participantProfits.values().stream() diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index 906ae952014..a87f49e0e2f 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -18,6 +18,13 @@ public enum GameResult { } public static GameResult determine(Participant dealer, Participant gambler) { + if(gambler.isBust()) { + return LOSE; + } + + if(dealer.isBust()) { + return WIN; + } if (dealer.isBlackJack() && gambler.isBlackJack()) { return DRAW; } diff --git a/src/main/java/domain/player/attribute/Hand.java b/src/main/java/domain/player/attribute/Hand.java index e433f18ab98..e3505c156bd 100644 --- a/src/main/java/domain/player/attribute/Hand.java +++ b/src/main/java/domain/player/attribute/Hand.java @@ -32,12 +32,10 @@ public boolean isBust() { public int calculateScore() { int sum = calculateBaseScore(); int aceCount = countAce(); - while (sum > BLACK_JACK_SCORE && aceCount > 0) { sum -= (ACE_HIGH_SCORE - ACE_LOW_SCORE); aceCount--; } - return sum; } @@ -53,11 +51,9 @@ public String getFirstCardInfo() { private int calculateBaseScore() { int sum = 0; - for (Card card : cards) { sum += getCardScore(card); } - return sum; } @@ -67,11 +63,9 @@ public boolean isBlackJack() { private int countAce() { int aceCount = 0; - for (Card card : cards) { aceCount += getAceToInt(card); } - return aceCount; } diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/dto/BettingAmountRequestDto.java index e98d7377688..3c47f190259 100644 --- a/src/main/java/dto/BettingAmountRequestDto.java +++ b/src/main/java/dto/BettingAmountRequestDto.java @@ -1,5 +1,7 @@ package dto; +import static util.Constants.MINIMUM_BETTING_AMOUNT; + import view.InputView; public record BettingAmountRequestDto(String bettingAmount) { @@ -7,9 +9,8 @@ public record BettingAmountRequestDto(String bettingAmount) { public BettingAmountRequestDto { validateBettingAmountIsNotNullAndNotBlank(bettingAmount); validateBettingAmountIsDigit(bettingAmount); - validateBettingAmountIsPositive(bettingAmount); + validateBettingAmountIsOverMinimumAmount(bettingAmount); } - private void validateBettingAmountIsNotNullAndNotBlank(String bettingAmount) { if (bettingAmount == null || bettingAmount.isBlank()) { throw new IllegalArgumentException("베팅 금액은 null 또는 공백이면 안 됩니다."); @@ -23,9 +24,13 @@ private void validateBettingAmountIsDigit(String bettingAmount) { throw new IllegalArgumentException("[ERROR] 숫자만 입력 가능합니다."); } } - private void validateBettingAmountIsPositive(String bettingAmount) { - if(Integer.parseInt(bettingAmount) <= 0) { - throw new IllegalArgumentException("[ERROR] 양수만 입력 가능합니다."); + private void validateBettingAmountIsOverMinimumAmount(String bettingAmount) { + if(Integer.parseInt(bettingAmount) <= MINIMUM_BETTING_AMOUNT) { + throw new IllegalArgumentException("[ERROR] 최소 베팅 금액은" + MINIMUM_BETTING_AMOUNT + " 입니다"); } } + + public int getBettingAmount() { + return Integer.parseInt(bettingAmount); + } } diff --git a/src/main/java/dto/DealerResultDto.java b/src/main/java/dto/DealerResultDto.java index d34f30f59bc..39c09602c75 100644 --- a/src/main/java/dto/DealerResultDto.java +++ b/src/main/java/dto/DealerResultDto.java @@ -1,4 +1,4 @@ package dto; -public record DealerResultDto(int dealerWinCount, int dealerLoseCount, int dealerDrawCount) { +public record DealerResultDto(int dealerProfit) { } diff --git a/src/main/java/util/Constants.java b/src/main/java/util/Constants.java index e6f312a129b..080551dc8a0 100644 --- a/src/main/java/util/Constants.java +++ b/src/main/java/util/Constants.java @@ -28,6 +28,8 @@ public class Constants { public static final int REVERSE_SIGN = -1; + public static final int MINIMUM_BETTING_AMOUNT = 10; + private Constants() { } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index c2fb020e88d..78490e66f30 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,9 @@ package view; +import domain.betting.BettingAmount; +import domain.game.Profit; import domain.player.ParticipantGameInfo; +import dto.BettingAmountRequestDto; import dto.DealerResultDto; import dto.ParticipantHandResponseDto; import dto.ParticipantsGameInfoDto; @@ -26,7 +29,7 @@ public void printParticipantsInfo(ParticipantsHandResponseDto responseDto) { System.out.println(); } - public void printDealerCardIsUnder16() { + public void printDealerCardIsBelowDrawThreshold() { System.out.println(); System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); } @@ -46,23 +49,18 @@ public void printParticipantsGameInfo(ParticipantsGameInfoDto responseDto) { } public void printDealerResult(DealerResultDto resultDto) { - System.out.println("## 최종 승패"); - System.out.print("딜러: "); - if (resultDto.dealerWinCount() > 0) { - System.out.print(resultDto.dealerWinCount() + "승 "); - } - if (resultDto.dealerLoseCount() > 0) { - System.out.print(resultDto.dealerLoseCount() + "패 "); - } - if (resultDto.dealerDrawCount() > 0) { - System.out.print(resultDto.dealerLoseCount() + "무 "); - } + System.out.println("## 최종 수익"); + System.out.print("딜러: " + resultDto.dealerProfit()); System.out.println(); } - public void printGamblerResult(Map gamblersResult) { - for (Entry result : gamblersResult.entrySet()) { - System.out.println(result.getKey() + ": " + result.getValue()); + public void printGamblerResult(Map gamblersResult) { + for (Entry result : gamblersResult.entrySet()) { + System.out.println(result.getKey() + ": " + result.getValue().getProfit()); } } + + public void printBlackJackMessage(String name) { + System.out.println(name + " 블랙잭입니다!"); + } } From 2b5ca1f5c3b1ab09575bde0d1aa74866a0304ba2 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 10:34:40 +0900 Subject: [PATCH 22/25] =?UTF-8?q?refactor(GameCards):=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=20=EB=8D=B1=20=EC=88=98=20=EC=83=81=EC=88=98=20=EA=B3=A0?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/domain/card/GameCards.java | 6 ++++-- src/main/java/domain/game/Game.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/domain/card/GameCards.java b/src/main/java/domain/card/GameCards.java index 36af9465472..a2b058d8262 100644 --- a/src/main/java/domain/card/GameCards.java +++ b/src/main/java/domain/card/GameCards.java @@ -1,5 +1,7 @@ package domain.card; +import static util.Constants.DEFAULT_CARD_SET; + import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; @@ -11,11 +13,11 @@ public class GameCards { private List cards; - public GameCards(int amount) { + public GameCards(int DEFAULT_CARD_SET) { this.cards = Arrays.stream(CardKind.values()) .flatMap(cardKind -> Arrays.stream(CardScore.values()) .flatMap(cardScore -> - IntStream.range(0, amount) + IntStream.range(0, DEFAULT_CARD_SET) .mapToObj(card -> new Card(cardScore.getScore(), cardKind.getKind())) )) diff --git a/src/main/java/domain/game/Game.java b/src/main/java/domain/game/Game.java index e08a08c498b..909949b8b10 100644 --- a/src/main/java/domain/game/Game.java +++ b/src/main/java/domain/game/Game.java @@ -21,10 +21,10 @@ public class Game { private final Gamblers gamblers; private final GameCards gameCards; - public Game(String dealerName, Map gamblersNameAndBettingInfo, int amount) { + public Game(String dealerName, Map gamblersNameAndBettingInfo, int DEFAULT_CARD_SET) { this.dealer = new Dealer(dealerName); this.gamblers = new Gamblers(gamblersNameAndBettingInfo); - this.gameCards = new GameCards(amount); + this.gameCards = new GameCards(DEFAULT_CARD_SET); } public void initializeGame() { From d941c5d336667d7f62dcc5e1fd630eaaee434a8f Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 11:46:32 +0900 Subject: [PATCH 23/25] =?UTF-8?q?refactor:=20=EC=A0=84=EC=97=AD=20?= =?UTF-8?q?=EC=83=81=EC=88=98=EB=A5=BC=20=ED=95=B4=EB=8B=B9=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EB=B0=8F=20=EB=B7=B0=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=82=B4=EB=B6=80=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Application.java | 2 +- .../java/controller/BlackJackController.java | 52 ++++++++----------- src/main/java/domain/betting/Betting.java | 6 +-- .../java/domain/betting/BettingAmount.java | 9 +++- src/main/java/domain/card/Card.java | 1 + src/main/java/domain/card/CardKind.java | 4 +- src/main/java/domain/card/CardScore.java | 2 +- src/main/java/domain/card/GameCards.java | 5 +- .../java/domain/game/GamblersGameResult.java | 6 +-- src/main/java/domain/game/Game.java | 10 ++-- src/main/java/domain/game/GameResult.java | 14 ++--- src/main/java/domain/game/Profit.java | 10 ++-- src/main/java/domain/player/Dealer.java | 10 ++-- src/main/java/domain/player/Gamblers.java | 1 + src/main/java/domain/player/Participant.java | 2 - .../domain/player/ParticipantGameInfo.java | 1 + .../java/domain/player/attribute/Hand.java | 9 ++-- .../java/domain/player/attribute/Name.java | 6 +-- src/main/java/dto/NameRequestDto.java | 14 ----- src/main/java/util/Constants.java | 35 ------------- src/main/java/view/InputView.java | 13 ++--- src/main/java/view/OutputView.java | 18 +++---- src/main/java/{util => view}/Parser.java | 5 +- .../requestDto}/AgreementRequestDto.java | 2 +- .../requestDto}/BettingAmountRequestDto.java | 17 +++--- .../java/view/requestDto/NameRequestDto.java | 21 ++++++++ .../responseDto}/DealerResultDto.java | 3 +- .../ParticipantHandResponseDto.java | 6 ++- .../responseDto}/ParticipantsGameInfoDto.java | 2 +- .../ParticipantsHandResponseDto.java | 3 +- .../domain/betting/BettingAmountTest.java | 7 --- src/test/java/domain/betting/BettingTest.java | 2 - src/test/java/domain/card/CardTest.java | 5 +- src/test/java/domain/card/GameCardsTest.java | 13 +++-- .../domain/game/GamblersGameResultTest.java | 6 +-- src/test/java/domain/game/GameResultTest.java | 15 +++--- src/test/java/domain/game/GameTest.java | 17 +++--- src/test/java/domain/player/DealerTest.java | 1 + src/test/java/domain/player/GamblersTest.java | 7 +-- src/test/java/domain/player/HandTest.java | 2 +- src/test/java/domain/player/NameTest.java | 1 + .../java/domain/player/ParticipantTest.java | 1 + .../java/dto/AgreementRequestDtoTest.java | 2 + .../java/dto/BettingAmountRequestDtoTest.java | 3 +- src/test/java/dto/NameRequestDtoTest.java | 8 +-- src/test/java/util/ParserTest.java | 3 +- 46 files changed, 174 insertions(+), 208 deletions(-) delete mode 100644 src/main/java/dto/NameRequestDto.java delete mode 100644 src/main/java/util/Constants.java rename src/main/java/{util => view}/Parser.java (86%) rename src/main/java/{dto => view/requestDto}/AgreementRequestDto.java (96%) rename src/main/java/{dto => view/requestDto}/BettingAmountRequestDto.java (75%) create mode 100644 src/main/java/view/requestDto/NameRequestDto.java rename src/main/java/{dto => view/responseDto}/DealerResultDto.java (66%) rename src/main/java/{dto => view/responseDto}/ParticipantHandResponseDto.java (77%) rename src/main/java/{dto => view/responseDto}/ParticipantsGameInfoDto.java (85%) rename src/main/java/{dto => view/responseDto}/ParticipantsHandResponseDto.java (83%) delete mode 100644 src/test/java/domain/betting/BettingAmountTest.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 7cd71ffcac9..84db4a518eb 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,9 +1,9 @@ -//import controller.BlackJackController; import controller.BlackJackController; import view.InputView; import view.OutputView; public class Application { + public static void main(String[] args) { InputView inputView = new InputView(); OutputView outputView = new OutputView(); diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 98533bcaefd..9662bc13a99 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -1,29 +1,25 @@ package controller; -import static util.Constants.COMMA_DELIMITER; -import static util.Constants.DEALER_NAME; -import static util.Constants.DEFAULT_CARD_SET; -import static util.Constants.HIT; -import static util.Constants.STAND; - import domain.betting.Betting; import domain.betting.BettingAmount; +import domain.card.GameCards; import domain.game.GamblersGameResult; import domain.game.Game; +import domain.player.Dealer; import domain.player.Gambler; -import dto.AgreementRequestDto; -import dto.BettingAmountRequestDto; -import dto.DealerResultDto; -import dto.ParticipantHandResponseDto; -import dto.ParticipantsGameInfoDto; -import dto.ParticipantsHandResponseDto; +import view.requestDto.AgreementRequestDto; +import view.requestDto.BettingAmountRequestDto; +import view.responseDto.DealerResultDto; +import view.responseDto.ParticipantHandResponseDto; +import view.responseDto.ParticipantsGameInfoDto; +import view.responseDto.ParticipantsHandResponseDto; import java.util.List; import java.util.Map; -import util.Parser; import view.InputView; import view.OutputView; public class BlackJackController { + private final InputView inputView; private final OutputView outputView; @@ -46,13 +42,12 @@ public void run() { } private List inputGamblersInfo() { - String name = inputView.askGamblerNames().name(); - return Parser.parse(name, COMMA_DELIMITER); + return inputView.askGamblerNames().names(); } private Map betByName(List names) { Betting betting = new Betting(names); - for(String name : names) { + for (String name : names) { BettingAmountRequestDto bettingAmountRequestDto = inputView.askBettingAmount(name); betting.betBettingAmount(name, new BettingAmount(bettingAmountRequestDto.getBettingAmount())); @@ -61,20 +56,20 @@ private Map betByName(List names) { } private Game initializeGame(Map gamblerNameAndBettingInfo) { - Game game = new Game(DEALER_NAME, gamblerNameAndBettingInfo, DEFAULT_CARD_SET); + Game game = new Game(Dealer.DEALER_NAME, gamblerNameAndBettingInfo, + GameCards.DEFAULT_CARD_SET); outputView.printInitialDeal(gamblerNameAndBettingInfo.keySet().stream().toList()); game.initializeGame(); outputView.printParticipantsInfo( - new ParticipantsHandResponseDto(game.getInitialParticipantsHandInfo()) - ); + new ParticipantsHandResponseDto(game.getInitialParticipantsHandInfo())); return game; } private void playGame(Game game) { List gamblers = game.getGamblersList(); - for(Gambler gambler : gamblers) { - if(gambler.isBlackJack()) { + for (Gambler gambler : gamblers) { + if (gambler.isBlackJack()) { outputView.printBlackJackMessage(gambler.getName()); continue; } @@ -83,14 +78,14 @@ private void playGame(Game game) { } private void playTurn(Game game, Gambler gambler) { - while(!gambler.isBust()) { + while (!gambler.isBust()) { AgreementRequestDto agreementRequestDto = inputView.askHitOrStand(gambler.getName()); - if (agreementRequestDto.agreement().equals(HIT)) { + if (agreementRequestDto.agreement().equals(InputView.HIT)) { gambler.addCard(game.pickCard()); outputView.printParticipantInfo( new ParticipantHandResponseDto(gambler.getName(), gambler.getHandInfo())); } - if (agreementRequestDto.agreement().equals(STAND)) { + if (agreementRequestDto.agreement().equals(InputView.STAND)) { break; } } @@ -104,16 +99,13 @@ private void checkDealerHand(Game game) { } private void printParticipantsResult(Game game) { - outputView.printParticipantsGameInfo(new ParticipantsGameInfoDto( - game.getParticipantGameInfos() - )); + outputView.printParticipantsGameInfo( + new ParticipantsGameInfoDto(game.getParticipantGameInfos())); } private void determineFinalGameProfit(GamblersGameResult gamblersGameResult) { outputView.printDealerResult( new DealerResultDto(gamblersGameResult.getDealerProfit().getProfit())); - outputView.printGamblerResult( - gamblersGameResult.getParticipantProfits() - ); + outputView.printGamblerResult(gamblersGameResult.getParticipantProfits()); } } diff --git a/src/main/java/domain/betting/Betting.java b/src/main/java/domain/betting/Betting.java index e2331c13c54..76b36fca034 100644 --- a/src/main/java/domain/betting/Betting.java +++ b/src/main/java/domain/betting/Betting.java @@ -1,17 +1,17 @@ package domain.betting; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Betting { + private final Map values = new LinkedHashMap<>(); public Betting(List names) { validateDuplicateNames(names); - for(String name : names) { + for (String name : names) { values.put(name, null); } } @@ -31,7 +31,7 @@ public Map getBettingAmounts() { public void validateDuplicateNames(List names) { List distinctNamesCount = names.stream(). distinct().collect(Collectors.toList()); - if(distinctNamesCount.size() != names.size()) { + if (distinctNamesCount.size() != names.size()) { throw new IllegalArgumentException("중복된 이름이 입력됩니다."); } } diff --git a/src/main/java/domain/betting/BettingAmount.java b/src/main/java/domain/betting/BettingAmount.java index 1c31eb578b3..c9869de3653 100644 --- a/src/main/java/domain/betting/BettingAmount.java +++ b/src/main/java/domain/betting/BettingAmount.java @@ -3,6 +3,7 @@ import java.util.Objects; public class BettingAmount { + private final int bettingAmount; public BettingAmount(int bettingAmount) { @@ -11,8 +12,12 @@ public BettingAmount(int bettingAmount) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } BettingAmount that = (BettingAmount) o; return bettingAmount == that.bettingAmount; } diff --git a/src/main/java/domain/card/Card.java b/src/main/java/domain/card/Card.java index b602d883aeb..e48b28b22b3 100644 --- a/src/main/java/domain/card/Card.java +++ b/src/main/java/domain/card/Card.java @@ -1,6 +1,7 @@ package domain.card; public class Card { + private final CardScore score; private final CardKind kind; diff --git a/src/main/java/domain/card/CardKind.java b/src/main/java/domain/card/CardKind.java index e4aadc66dcd..6fef5943e86 100644 --- a/src/main/java/domain/card/CardKind.java +++ b/src/main/java/domain/card/CardKind.java @@ -5,7 +5,7 @@ public enum CardKind { CLOVER("클로버"), HEART("하트"), - DIAMOND ("다이아몬드"), + DIAMOND("다이아몬드"), SPADES("스페이드"); private final String kind; @@ -18,7 +18,7 @@ public String getKind() { return kind; } - public static CardKind of(final String kind){ + public static CardKind of(final String kind) { return Arrays.stream(values()) .filter(val -> val.kind.equals(kind)) .findFirst() diff --git a/src/main/java/domain/card/CardScore.java b/src/main/java/domain/card/CardScore.java index fc3d11ee3b2..3333c7a5621 100644 --- a/src/main/java/domain/card/CardScore.java +++ b/src/main/java/domain/card/CardScore.java @@ -33,7 +33,7 @@ public String getScore() { return this.score; } - public static CardScore of(final String score){ + public static CardScore of(final String score) { return Arrays.stream(values()) .filter(val -> val.score.equals(score)) .findFirst() diff --git a/src/main/java/domain/card/GameCards.java b/src/main/java/domain/card/GameCards.java index a2b058d8262..e4066ccbf53 100644 --- a/src/main/java/domain/card/GameCards.java +++ b/src/main/java/domain/card/GameCards.java @@ -1,7 +1,5 @@ package domain.card; -import static util.Constants.DEFAULT_CARD_SET; - import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; @@ -11,6 +9,9 @@ public class GameCards { + public static final int DEFAULT_CARD_SET = 1; + public static final int DEFAULT_START_CARD_COUNT = 2; + private List cards; public GameCards(int DEFAULT_CARD_SET) { diff --git a/src/main/java/domain/game/GamblersGameResult.java b/src/main/java/domain/game/GamblersGameResult.java index bac572bc898..8913efcc1c2 100644 --- a/src/main/java/domain/game/GamblersGameResult.java +++ b/src/main/java/domain/game/GamblersGameResult.java @@ -1,17 +1,15 @@ package domain.game; -import static util.Constants.REVERSE_SIGN; - import domain.player.Gambler; import domain.player.Gamblers; import domain.player.Participant; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import java.util.stream.Collectors; public class GamblersGameResult { + public static final int REVERSE_SIGN = -1; + private Map participantProfits; public GamblersGameResult(Participant dealer, Gamblers gamblers) { diff --git a/src/main/java/domain/game/Game.java b/src/main/java/domain/game/Game.java index 909949b8b10..6d39f632b95 100644 --- a/src/main/java/domain/game/Game.java +++ b/src/main/java/domain/game/Game.java @@ -1,8 +1,5 @@ package domain.game; -import static util.Constants.DEFAULT_START_CARD_COUNT; - -import domain.betting.Betting; import domain.betting.BettingAmount; import domain.card.Card; import domain.card.GameCards; @@ -21,14 +18,15 @@ public class Game { private final Gamblers gamblers; private final GameCards gameCards; - public Game(String dealerName, Map gamblersNameAndBettingInfo, int DEFAULT_CARD_SET) { + public Game(String dealerName, Map gamblersNameAndBettingInfo, + int DEFAULT_CARD_SET) { this.dealer = new Dealer(dealerName); this.gamblers = new Gamblers(gamblersNameAndBettingInfo); this.gameCards = new GameCards(DEFAULT_CARD_SET); } public void initializeGame() { - for (int i = 0; i < DEFAULT_START_CARD_COUNT; i++) { + for (int i = 0; i < GameCards.DEFAULT_START_CARD_COUNT; i++) { dealer.addCard(gameCards.drawCard()); gamblers.receiveCards(gameCards); } @@ -72,7 +70,7 @@ public List getGamblersHandSize() { return gamblers.getHandSize(); } - public GamblersGameResult getResult(){ + public GamblersGameResult getResult() { return new GamblersGameResult(dealer, gamblers); } } diff --git a/src/main/java/domain/game/GameResult.java b/src/main/java/domain/game/GameResult.java index a87f49e0e2f..4fec26afaee 100644 --- a/src/main/java/domain/game/GameResult.java +++ b/src/main/java/domain/game/GameResult.java @@ -1,7 +1,6 @@ package domain.game; import domain.betting.BettingAmount; -import domain.player.Gambler; import domain.player.Participant; public enum GameResult { @@ -18,11 +17,11 @@ public enum GameResult { } public static GameResult determine(Participant dealer, Participant gambler) { - if(gambler.isBust()) { + if (gambler.isBust()) { return LOSE; } - if(dealer.isBust()) { + if (dealer.isBust()) { return WIN; } if (dealer.isBlackJack() && gambler.isBlackJack()) { @@ -42,14 +41,15 @@ public static GameResult determine(Participant dealer, Participant gambler) { } return DRAW; } + public Profit calculateProfit(BettingAmount bettingAmount) { - if(this == BLACK_JACK) { - return new Profit((bettingAmount.getBettingAmount() * 3)/2); + if (this == BLACK_JACK) { + return new Profit((bettingAmount.getBettingAmount() * 3) / 2); } - if(this == WIN) { + if (this == WIN) { return new Profit(bettingAmount.getBettingAmount()); } - if(this == DRAW) { + if (this == DRAW) { return new Profit(0); } return new Profit(-bettingAmount.getBettingAmount()); diff --git a/src/main/java/domain/game/Profit.java b/src/main/java/domain/game/Profit.java index b7dee35bcc2..47b386baff3 100644 --- a/src/main/java/domain/game/Profit.java +++ b/src/main/java/domain/game/Profit.java @@ -1,9 +1,9 @@ package domain.game; -import domain.betting.BettingAmount; import java.util.Objects; public class Profit { + private final int profit; public Profit(int profit) { @@ -16,8 +16,12 @@ public int getProfit() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Profit that = (Profit) o; return profit == that.profit; } diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index c3d1ff3aa36..81e4d2a8684 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -1,11 +1,13 @@ package domain.player; -import static util.Constants.DEALER_REFERENCE_POINT; - public class Dealer extends Participant { - public Dealer(String name) { - super(name); + public static final String DEALER_NAME = "딜러"; + public static final int DEALER_REFERENCE_POINT = 16; + + + public Dealer(String DEALER_NAME) { + super(DEALER_NAME); } public boolean isBelowDrawThreshold() { diff --git a/src/main/java/domain/player/Gamblers.java b/src/main/java/domain/player/Gamblers.java index 6784a1c804a..4a3db1cef6a 100644 --- a/src/main/java/domain/player/Gamblers.java +++ b/src/main/java/domain/player/Gamblers.java @@ -21,6 +21,7 @@ public Gamblers(Map gamblerNameAndBettingInfo) { public Gamblers(List gamblerList) { this.gamblers = gamblerList; } + public boolean containGambler(String name) { return gamblers.stream() .anyMatch(gambler -> gambler.isEqualName(name)); diff --git a/src/main/java/domain/player/Participant.java b/src/main/java/domain/player/Participant.java index b911b860478..fe31f132f43 100644 --- a/src/main/java/domain/player/Participant.java +++ b/src/main/java/domain/player/Participant.java @@ -1,7 +1,5 @@ package domain.player; -import static util.Constants.BLACK_JACK_SCORE; - import domain.card.Card; import domain.player.attribute.Hand; import domain.player.attribute.Name; diff --git a/src/main/java/domain/player/ParticipantGameInfo.java b/src/main/java/domain/player/ParticipantGameInfo.java index 5871574af4f..80266ca6df7 100644 --- a/src/main/java/domain/player/ParticipantGameInfo.java +++ b/src/main/java/domain/player/ParticipantGameInfo.java @@ -6,4 +6,5 @@ public record ParticipantGameInfo( String name, List cards, int score) { + } diff --git a/src/main/java/domain/player/attribute/Hand.java b/src/main/java/domain/player/attribute/Hand.java index e3505c156bd..9bf1069c27e 100644 --- a/src/main/java/domain/player/attribute/Hand.java +++ b/src/main/java/domain/player/attribute/Hand.java @@ -1,9 +1,5 @@ package domain.player.attribute; -import static util.Constants.ACE_HIGH_SCORE; -import static util.Constants.ACE_LOW_SCORE; -import static util.Constants.BLACK_JACK_SCORE; - import domain.card.Card; import java.util.ArrayList; import java.util.List; @@ -11,6 +7,11 @@ public class Hand { + public static final int ACE_HIGH_SCORE = 11; + public static final int ACE_LOW_SCORE = 1; + + public static final int BLACK_JACK_SCORE = 21; + private final List cards; public Hand() { diff --git a/src/main/java/domain/player/attribute/Name.java b/src/main/java/domain/player/attribute/Name.java index 2d2f2dc237e..45b514df301 100644 --- a/src/main/java/domain/player/attribute/Name.java +++ b/src/main/java/domain/player/attribute/Name.java @@ -1,9 +1,9 @@ package domain.player.attribute; -import static util.Constants.MAXIMUM_NAME_LENGTH; -import static util.Constants.MINIMUM_NAME_LENGTH; - public class Name { + + public static final int MINIMUM_NAME_LENGTH = 2; + public static final int MAXIMUM_NAME_LENGTH = 10; private final String name; public Name(String name) { diff --git a/src/main/java/dto/NameRequestDto.java b/src/main/java/dto/NameRequestDto.java deleted file mode 100644 index bcffbfc7716..00000000000 --- a/src/main/java/dto/NameRequestDto.java +++ /dev/null @@ -1,14 +0,0 @@ -package dto; - -public record NameRequestDto(String name) { - - public NameRequestDto { - validateNameIsNotNullAndIsNotBlank(name); - } - - private void validateNameIsNotNullAndIsNotBlank(String name) { - if (name == null || name.isBlank()) { - throw new IllegalArgumentException("이름 리스트는 null 또는 공백이면 안됩니다"); - } - } -} diff --git a/src/main/java/util/Constants.java b/src/main/java/util/Constants.java deleted file mode 100644 index 080551dc8a0..00000000000 --- a/src/main/java/util/Constants.java +++ /dev/null @@ -1,35 +0,0 @@ -package util; - -public class Constants { - - public static final String COMMA_DELIMITER = ","; - - public static final int DEFAULT_CARD_SET = 1; - - public static final int DEFAULT_START_CARD_COUNT = 2; - - public static final int ACE_HIGH_SCORE = 11; - - public static final int ACE_LOW_SCORE = 1; - - public static final int BLACK_JACK_SCORE = 21; - - public static final int DEALER_REFERENCE_POINT = 16; - - public static final String DEALER_NAME = "딜러"; - - public static final String HIT = "y"; - - public static final String STAND = "n"; - - public static final int MINIMUM_NAME_LENGTH = 2; - - public static final int MAXIMUM_NAME_LENGTH = 10; - - public static final int REVERSE_SIGN = -1; - - public static final int MINIMUM_BETTING_AMOUNT = 10; - - private Constants() { - } -} diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index 77d4e2f5114..fe39c416a9e 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,22 +1,23 @@ package view; -import domain.betting.BettingAmount; -import dto.AgreementRequestDto; -import dto.BettingAmountRequestDto; -import dto.NameRequestDto; +import view.requestDto.AgreementRequestDto; +import view.requestDto.BettingAmountRequestDto; +import view.requestDto.NameRequestDto; import java.util.Scanner; public class InputView { + public static final String HIT = "y"; + public static final String STAND = "n"; private Scanner sc = new Scanner(System.in); public NameRequestDto askGamblerNames() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); - return new NameRequestDto(sc.nextLine()); + return NameRequestDto.from(sc.nextLine()); } public AgreementRequestDto askHitOrStand(String name) { - System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 " + HIT + " 아니오는 " + STAND + ")"); return new AgreementRequestDto(sc.nextLine()); } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 78490e66f30..ac15589ac2b 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,13 +1,11 @@ package view; -import domain.betting.BettingAmount; import domain.game.Profit; import domain.player.ParticipantGameInfo; -import dto.BettingAmountRequestDto; -import dto.DealerResultDto; -import dto.ParticipantHandResponseDto; -import dto.ParticipantsGameInfoDto; -import dto.ParticipantsHandResponseDto; +import view.responseDto.DealerResultDto; +import view.responseDto.ParticipantHandResponseDto; +import view.responseDto.ParticipantsGameInfoDto; +import view.responseDto.ParticipantsHandResponseDto; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -17,12 +15,12 @@ public class OutputView { public void printInitialDeal(List names) { System.out.println(); System.out.println("딜러와 " - + String.join(", ", names) - + "에게 2장을 나누었습니다."); + + String.join(", ", names) + + "에게 2장을 나누었습니다."); } public void printParticipantsInfo(ParticipantsHandResponseDto responseDto) { - for(Entry> gamblers : responseDto.gamblersInfo().entrySet()) { + for (Entry> gamblers : responseDto.gamblersInfo().entrySet()) { System.out.println(gamblers.getKey() + "카드: " + String.join(", ", gamblers.getValue())); } @@ -50,7 +48,7 @@ public void printParticipantsGameInfo(ParticipantsGameInfoDto responseDto) { public void printDealerResult(DealerResultDto resultDto) { System.out.println("## 최종 수익"); - System.out.print("딜러: " + resultDto.dealerProfit()); + System.out.print("딜러: " + resultDto.dealerProfit()); System.out.println(); } diff --git a/src/main/java/util/Parser.java b/src/main/java/view/Parser.java similarity index 86% rename from src/main/java/util/Parser.java rename to src/main/java/view/Parser.java index 57270a4d4f8..432a406d9e2 100644 --- a/src/main/java/util/Parser.java +++ b/src/main/java/view/Parser.java @@ -1,11 +1,12 @@ -package util; +package view; import java.util.Arrays; import java.util.List; public class Parser { - private Parser() {} + private Parser() { + } public static List parse(String input, String delimiter) { return Arrays.stream(input.split(delimiter)) diff --git a/src/main/java/dto/AgreementRequestDto.java b/src/main/java/view/requestDto/AgreementRequestDto.java similarity index 96% rename from src/main/java/dto/AgreementRequestDto.java rename to src/main/java/view/requestDto/AgreementRequestDto.java index d48012d2b83..ce16d9274b5 100644 --- a/src/main/java/dto/AgreementRequestDto.java +++ b/src/main/java/view/requestDto/AgreementRequestDto.java @@ -1,4 +1,4 @@ -package dto; +package view.requestDto; public record AgreementRequestDto(String agreement) { diff --git a/src/main/java/dto/BettingAmountRequestDto.java b/src/main/java/view/requestDto/BettingAmountRequestDto.java similarity index 75% rename from src/main/java/dto/BettingAmountRequestDto.java rename to src/main/java/view/requestDto/BettingAmountRequestDto.java index 3c47f190259..7c2c9047f68 100644 --- a/src/main/java/dto/BettingAmountRequestDto.java +++ b/src/main/java/view/requestDto/BettingAmountRequestDto.java @@ -1,16 +1,15 @@ -package dto; - -import static util.Constants.MINIMUM_BETTING_AMOUNT; - -import view.InputView; +package view.requestDto; public record BettingAmountRequestDto(String bettingAmount) { + public static final int MINIMUM_BETTING_AMOUNT = 10; + public BettingAmountRequestDto { validateBettingAmountIsNotNullAndNotBlank(bettingAmount); validateBettingAmountIsDigit(bettingAmount); validateBettingAmountIsOverMinimumAmount(bettingAmount); } + private void validateBettingAmountIsNotNullAndNotBlank(String bettingAmount) { if (bettingAmount == null || bettingAmount.isBlank()) { throw new IllegalArgumentException("베팅 금액은 null 또는 공백이면 안 됩니다."); @@ -21,12 +20,14 @@ private void validateBettingAmountIsDigit(String bettingAmount) { try { Integer.parseInt(bettingAmount); } catch (NumberFormatException e) { - throw new IllegalArgumentException("[ERROR] 숫자만 입력 가능합니다."); } + throw new IllegalArgumentException("[ERROR] 숫자만 입력 가능합니다."); + } } private void validateBettingAmountIsOverMinimumAmount(String bettingAmount) { - if(Integer.parseInt(bettingAmount) <= MINIMUM_BETTING_AMOUNT) { - throw new IllegalArgumentException("[ERROR] 최소 베팅 금액은" + MINIMUM_BETTING_AMOUNT + " 입니다"); + if (Integer.parseInt(bettingAmount) < MINIMUM_BETTING_AMOUNT) { + throw new IllegalArgumentException( + "[ERROR] 최소 베팅 금액은 " + MINIMUM_BETTING_AMOUNT + " 입니다"); } } diff --git a/src/main/java/view/requestDto/NameRequestDto.java b/src/main/java/view/requestDto/NameRequestDto.java new file mode 100644 index 00000000000..dd299c1dadd --- /dev/null +++ b/src/main/java/view/requestDto/NameRequestDto.java @@ -0,0 +1,21 @@ +package view.requestDto; + +import java.util.List; +import view.Parser; + +public record NameRequestDto(List names) { + + public static final String COMMA_DELIMITER = ","; + + public static NameRequestDto from(String input) { + validateNameIsNotNullAndIsNotBlank(input); + List parsedNames = Parser.parse(input, COMMA_DELIMITER); + return new NameRequestDto(parsedNames); + } + + private static void validateNameIsNotNullAndIsNotBlank(String name) { + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("이름 리스트는 null 또는 공백이면 안됩니다"); + } + } +} diff --git a/src/main/java/dto/DealerResultDto.java b/src/main/java/view/responseDto/DealerResultDto.java similarity index 66% rename from src/main/java/dto/DealerResultDto.java rename to src/main/java/view/responseDto/DealerResultDto.java index 39c09602c75..b6f54a75036 100644 --- a/src/main/java/dto/DealerResultDto.java +++ b/src/main/java/view/responseDto/DealerResultDto.java @@ -1,4 +1,5 @@ -package dto; +package view.responseDto; public record DealerResultDto(int dealerProfit) { + } diff --git a/src/main/java/dto/ParticipantHandResponseDto.java b/src/main/java/view/responseDto/ParticipantHandResponseDto.java similarity index 77% rename from src/main/java/dto/ParticipantHandResponseDto.java rename to src/main/java/view/responseDto/ParticipantHandResponseDto.java index d28b48b2a6a..2ce16ed5074 100644 --- a/src/main/java/dto/ParticipantHandResponseDto.java +++ b/src/main/java/view/responseDto/ParticipantHandResponseDto.java @@ -1,8 +1,10 @@ -package dto; +package view.responseDto; import java.util.List; public record ParticipantHandResponseDto( String name, List cards -) {} +) { + +} diff --git a/src/main/java/dto/ParticipantsGameInfoDto.java b/src/main/java/view/responseDto/ParticipantsGameInfoDto.java similarity index 85% rename from src/main/java/dto/ParticipantsGameInfoDto.java rename to src/main/java/view/responseDto/ParticipantsGameInfoDto.java index 7299c755a05..3b0144e4c47 100644 --- a/src/main/java/dto/ParticipantsGameInfoDto.java +++ b/src/main/java/view/responseDto/ParticipantsGameInfoDto.java @@ -1,4 +1,4 @@ -package dto; +package view.responseDto; import domain.player.ParticipantGameInfo; import java.util.List; diff --git a/src/main/java/dto/ParticipantsHandResponseDto.java b/src/main/java/view/responseDto/ParticipantsHandResponseDto.java similarity index 83% rename from src/main/java/dto/ParticipantsHandResponseDto.java rename to src/main/java/view/responseDto/ParticipantsHandResponseDto.java index 60e9886692a..20734cea684 100644 --- a/src/main/java/dto/ParticipantsHandResponseDto.java +++ b/src/main/java/view/responseDto/ParticipantsHandResponseDto.java @@ -1,7 +1,8 @@ -package dto; +package view.responseDto; import java.util.List; import java.util.Map; public record ParticipantsHandResponseDto(Map> gamblersInfo) { + } diff --git a/src/test/java/domain/betting/BettingAmountTest.java b/src/test/java/domain/betting/BettingAmountTest.java deleted file mode 100644 index 2620de048e9..00000000000 --- a/src/test/java/domain/betting/BettingAmountTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package domain.betting; - -import static org.junit.jupiter.api.Assertions.*; - -class BettingAmountTest { - -} \ No newline at end of file diff --git a/src/test/java/domain/betting/BettingTest.java b/src/test/java/domain/betting/BettingTest.java index aa03a7da26a..cc519d0a443 100644 --- a/src/test/java/domain/betting/BettingTest.java +++ b/src/test/java/domain/betting/BettingTest.java @@ -4,9 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; -import domain.player.Gamblers; import java.util.List; -import java.util.Map; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/domain/card/CardTest.java b/src/test/java/domain/card/CardTest.java index 0c7eb1bb16d..459a083612c 100644 --- a/src/test/java/domain/card/CardTest.java +++ b/src/test/java/domain/card/CardTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.card.Card; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -54,7 +53,7 @@ class CardTest { Assertions.assertThrows(IllegalArgumentException.class, () -> { new Card("14", "하트"); - }); + }); } @Test @@ -63,7 +62,7 @@ class CardTest { Assertions.assertThrows(IllegalArgumentException.class, () -> { new Card("10", "별"); - }); + }); } @Test diff --git a/src/test/java/domain/card/GameCardsTest.java b/src/test/java/domain/card/GameCardsTest.java index ed3f5849749..c67b311ad48 100644 --- a/src/test/java/domain/card/GameCardsTest.java +++ b/src/test/java/domain/card/GameCardsTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import domain.card.GameCards; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -24,10 +23,14 @@ class GameCardsTest { } @ParameterizedTest - @ValueSource(strings = {"2클로버","3클로버","4클로버","5클로버","6클로버","7클로버","8클로버","9클로버","10클로버","J클로버","Q클로버","K클로버","A클로버", - "2스페이드","3스페이드","4스페이드","5스페이드","6스페이드","7스페이드","8스페이드","9스페이드","10스페이드","J스페이드","Q스페이드","K스페이드","A스페이드", - "2하트","3하트","4하트","5하트","6하트","7하트","8하트","9하트","10하트","J하트","Q하트","K하트","A하트", - "2다이아몬드","3다이아몬드","4다이아몬드","5다이아몬드","6다이아몬드","7다이아몬드","8다이아몬드","9다이아몬드","10다이아몬드","J다이아몬드","Q다이아몬드","K다이아몬드","A다이아몬드"}) + @ValueSource(strings = {"2클로버", "3클로버", "4클로버", "5클로버", "6클로버", "7클로버", "8클로버", "9클로버", "10클로버", + "J클로버", "Q클로버", "K클로버", "A클로버", + "2스페이드", "3스페이드", "4스페이드", "5스페이드", "6스페이드", "7스페이드", "8스페이드", "9스페이드", "10스페이드", + "J스페이드", "Q스페이드", "K스페이드", "A스페이드", + "2하트", "3하트", "4하트", "5하트", "6하트", "7하트", "8하트", "9하트", "10하트", "J하트", "Q하트", "K하트", + "A하트", + "2다이아몬드", "3다이아몬드", "4다이아몬드", "5다이아몬드", "6다이아몬드", "7다이아몬드", "8다이아몬드", "9다이아몬드", + "10다이아몬드", "J다이아몬드", "Q다이아몬드", "K다이아몬드", "A다이아몬드"}) @DisplayName("52개 종류의 카드 포함 여부 검증") void 덱_종류_검증(String string) { // given diff --git a/src/test/java/domain/game/GamblersGameResultTest.java b/src/test/java/domain/game/GamblersGameResultTest.java index 980da7de9ee..00527f121ae 100644 --- a/src/test/java/domain/game/GamblersGameResultTest.java +++ b/src/test/java/domain/game/GamblersGameResultTest.java @@ -1,15 +1,11 @@ package domain.game; -import static util.Constants.DEALER_NAME; - import domain.betting.BettingAmount; import domain.card.Card; import domain.player.Dealer; import domain.player.Gambler; import domain.player.Gamblers; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -20,7 +16,7 @@ class GamblersGameResultTest { @DisplayName("딜러, 참여자들의 수익을 정산") void 딜러_참여자들_수익_정산() { // given - Dealer dealer = new Dealer(DEALER_NAME); + Dealer dealer = new Dealer(Dealer.DEALER_NAME); dealer.addCard(new Card("K", "하트")); dealer.addCard(new Card("Q", "하트")); diff --git a/src/test/java/domain/game/GameResultTest.java b/src/test/java/domain/game/GameResultTest.java index 95efc7c3429..98b651e8653 100644 --- a/src/test/java/domain/game/GameResultTest.java +++ b/src/test/java/domain/game/GameResultTest.java @@ -1,21 +1,19 @@ package domain.game; -import static util.Constants.DEALER_NAME; - import domain.betting.BettingAmount; import domain.card.Card; import domain.player.Dealer; import domain.player.Gambler; -import java.lang.annotation.Documented; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class GameResultTest { + @Test @DisplayName("게임 최종 결과 딜러, 겜블러 동시에 블랙잭") void 게임_최종_결과_딜러_겜블러_블랙잭() { - Dealer dealer = new Dealer(DEALER_NAME); + Dealer dealer = new Dealer(Dealer.DEALER_NAME); dealer.addCard(new Card("K", "다이아몬드")); dealer.addCard(new Card("A", "다이아몬드")); @@ -28,20 +26,21 @@ class GameResultTest { @Test @DisplayName("게임 최종 결과 겜블러 블랙잭") void 게임_최종_결과_겜블러_블랙잭() { - Dealer dealer = new Dealer(DEALER_NAME); + Dealer dealer = new Dealer(Dealer.DEALER_NAME); dealer.addCard(new Card("2", "다이아몬드")); dealer.addCard(new Card("A", "다이아몬드")); Gambler gambler = new Gambler("pobi", new BettingAmount(10000)); gambler.addCard(new Card("Q", "다이아몬드")); gambler.addCard(new Card("A", "하트")); - Assertions.assertThat(GameResult.determine(dealer, gambler)).isEqualTo(GameResult.BLACK_JACK); + Assertions.assertThat(GameResult.determine(dealer, gambler)) + .isEqualTo(GameResult.BLACK_JACK); } @Test @DisplayName("게임 최종 결과 딜러 승리") void 게임_최종_결과_딜러_승() { - Dealer dealer = new Dealer(DEALER_NAME); + Dealer dealer = new Dealer(Dealer.DEALER_NAME); dealer.addCard(new Card("8", "다이아몬드")); dealer.addCard(new Card("A", "다이아몬드")); @@ -54,7 +53,7 @@ class GameResultTest { @Test @DisplayName("게임 최종 결과 겜블러 승리") void 게임_최종_결과_겜블러_승리() { - Dealer dealer = new Dealer(DEALER_NAME); + Dealer dealer = new Dealer(Dealer.DEALER_NAME); dealer.addCard(new Card("3", "다이아몬드")); dealer.addCard(new Card("6", "다이아몬드")); diff --git a/src/test/java/domain/game/GameTest.java b/src/test/java/domain/game/GameTest.java index 39b83627305..7f55c9ae687 100644 --- a/src/test/java/domain/game/GameTest.java +++ b/src/test/java/domain/game/GameTest.java @@ -1,12 +1,9 @@ package domain.game; -import static util.Constants.DEALER_NAME; -import static util.Constants.DEFAULT_CARD_SET; -import static util.Constants.DEFAULT_START_CARD_COUNT; - import domain.betting.BettingAmount; +import domain.card.GameCards; +import domain.player.Dealer; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -16,12 +13,12 @@ class GameTest { @Test @DisplayName("게임을 처음 시작했을 떄 딜러와 참가자들 각각에게 카드가 2장씩 가는지 검증") - void 게임_초기화_검증 () { + void 게임_초기화_검증() { // given Map tempGamblers = new HashMap<>(); tempGamblers.put("pobi", new BettingAmount(10000)); tempGamblers.put("jason", new BettingAmount(20000)); - Game game = new Game(DEALER_NAME, tempGamblers, DEFAULT_CARD_SET); + Game game = new Game(Dealer.DEALER_NAME, tempGamblers, GameCards.DEFAULT_CARD_SET); // when game.initializeGame(); @@ -29,8 +26,8 @@ class GameTest { // then Assertions.assertThat(game.getDealerHandSize()).isEqualTo(2); Assertions.assertThat(game.getGamblersHandSize() - .stream() - .allMatch(count -> count == DEFAULT_START_CARD_COUNT)) - .isEqualTo(true); + .stream() + .allMatch(count -> count == GameCards.DEFAULT_START_CARD_COUNT)) + .isEqualTo(true); } } diff --git a/src/test/java/domain/player/DealerTest.java b/src/test/java/domain/player/DealerTest.java index ad07061b87d..4b8cad89074 100644 --- a/src/test/java/domain/player/DealerTest.java +++ b/src/test/java/domain/player/DealerTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; class DealerTest { + @Test @DisplayName("딜러 카드 값의 합이 드로우 임계치 미만일 때 true를 정상적으로 반환함을 테스트") void 딜러_카드_합_드로우_임계치_미만_true_반환_테스트() { diff --git a/src/test/java/domain/player/GamblersTest.java b/src/test/java/domain/player/GamblersTest.java index 8c179e5abc5..0dd19a4372c 100644 --- a/src/test/java/domain/player/GamblersTest.java +++ b/src/test/java/domain/player/GamblersTest.java @@ -1,11 +1,7 @@ package domain.player; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import domain.betting.Betting; import domain.betting.BettingAmount; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; @@ -17,7 +13,8 @@ class GamblersTest { @DisplayName("이름, 베팅금액 정상 저장 테스트") void 겜블러_이름_베팅금액_정상_저장_생성_테스트() { // given - Map gamblerBettingInfo = new HashMap() {}; + Map gamblerBettingInfo = new HashMap() { + }; gamblerBettingInfo.put("pobi", new BettingAmount(10000)); gamblerBettingInfo.put("coco", new BettingAmount(20000)); diff --git a/src/test/java/domain/player/HandTest.java b/src/test/java/domain/player/HandTest.java index 11b821a002d..32902988b90 100644 --- a/src/test/java/domain/player/HandTest.java +++ b/src/test/java/domain/player/HandTest.java @@ -2,13 +2,13 @@ import domain.card.Card; import domain.player.attribute.Hand; -import java.util.Arrays; import java.util.List; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class HandTest { + @Test @DisplayName("카드 정보를 문자열 리스트로 반환하는지 검증") void 카드_정보_문자열_반환_테스트() { diff --git a/src/test/java/domain/player/NameTest.java b/src/test/java/domain/player/NameTest.java index c935a0ccc5b..8174377df0b 100644 --- a/src/test/java/domain/player/NameTest.java +++ b/src/test/java/domain/player/NameTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; class NameTest { + @Test @DisplayName("이름 영어, 글자 수, 이름 내 공백 여부 테스트") void 이름_영어_글자수_공백미포함_검증() { diff --git a/src/test/java/domain/player/ParticipantTest.java b/src/test/java/domain/player/ParticipantTest.java index feb80e20873..28240dc74ed 100644 --- a/src/test/java/domain/player/ParticipantTest.java +++ b/src/test/java/domain/player/ParticipantTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; class ParticipantTest { + @Test @DisplayName("초기 2장의 합이 21, 블랙잭인지 확인") void 초기_2장의_합이_21_블랙잭인지_검증() { diff --git a/src/test/java/dto/AgreementRequestDtoTest.java b/src/test/java/dto/AgreementRequestDtoTest.java index 59740cf5230..91d0028641e 100644 --- a/src/test/java/dto/AgreementRequestDtoTest.java +++ b/src/test/java/dto/AgreementRequestDtoTest.java @@ -3,8 +3,10 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import view.requestDto.AgreementRequestDto; class AgreementRequestDtoTest { + @Test @DisplayName("y/n 입력 문자열이 null이면 에러 발생 검증") void agreement_is_not_null() { diff --git a/src/test/java/dto/BettingAmountRequestDtoTest.java b/src/test/java/dto/BettingAmountRequestDtoTest.java index a5c6625eb3e..3b0e56d1cf8 100644 --- a/src/test/java/dto/BettingAmountRequestDtoTest.java +++ b/src/test/java/dto/BettingAmountRequestDtoTest.java @@ -1,10 +1,9 @@ package dto; -import static org.junit.jupiter.api.Assertions.*; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import view.requestDto.BettingAmountRequestDto; class BettingAmountRequestDtoTest { diff --git a/src/test/java/dto/NameRequestDtoTest.java b/src/test/java/dto/NameRequestDtoTest.java index 59221e4e23b..3e0ce10412c 100644 --- a/src/test/java/dto/NameRequestDtoTest.java +++ b/src/test/java/dto/NameRequestDtoTest.java @@ -1,17 +1,17 @@ package dto; -import static org.junit.jupiter.api.Assertions.*; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import view.requestDto.NameRequestDto; class NameRequestDtoTest { + @Test @DisplayName("이름 입력 문자열이 null이면 에러 발생 검증") void name_is_not_null() { Assertions.assertThrows(IllegalArgumentException.class, - () -> new NameRequestDto(null)); + () -> NameRequestDto.from(null)); } @@ -19,6 +19,6 @@ void name_is_not_null() { @DisplayName("이름 입력 문자열이 빈 문자열(\"\")이면 에러 발생 검증") void name_is_not_blank() { Assertions.assertThrows(IllegalArgumentException.class, - () -> new NameRequestDto("")); + () -> NameRequestDto.from("")); } } diff --git a/src/test/java/util/ParserTest.java b/src/test/java/util/ParserTest.java index b33cd7f1c4a..83f9c9468cc 100644 --- a/src/test/java/util/ParserTest.java +++ b/src/test/java/util/ParserTest.java @@ -4,9 +4,10 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import util.Parser; +import view.Parser; class ParserTest { + @Test @DisplayName("게임 참가자 이름 문자열 구분자 기준 분리 테스트") void 게임_참가자_이름_문자열_분리_테스트() { From 88a8436023f6e11fbdf0ccbc98b584c1cd5f1fb2 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 12:04:00 +0900 Subject: [PATCH 24/25] =?UTF-8?q?refactor:=20game=EB=82=B4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=ED=8A=B9=EC=A0=95=20participant=EC=97=90=EA=B2=8C?= =?UTF-8?q?=20card=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/BlackJackController.java | 4 ++-- src/main/java/domain/game/Game.java | 12 ++++++++---- src/main/java/domain/player/Dealer.java | 1 - 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/controller/BlackJackController.java b/src/main/java/controller/BlackJackController.java index 9662bc13a99..89909b497f3 100644 --- a/src/main/java/controller/BlackJackController.java +++ b/src/main/java/controller/BlackJackController.java @@ -81,7 +81,7 @@ private void playTurn(Game game, Gambler gambler) { while (!gambler.isBust()) { AgreementRequestDto agreementRequestDto = inputView.askHitOrStand(gambler.getName()); if (agreementRequestDto.agreement().equals(InputView.HIT)) { - gambler.addCard(game.pickCard()); + game.drawCardTo(gambler); outputView.printParticipantInfo( new ParticipantHandResponseDto(gambler.getName(), gambler.getHandInfo())); } @@ -94,7 +94,7 @@ private void playTurn(Game game, Gambler gambler) { private void checkDealerHand(Game game) { if (game.shouldDealerDraw()) { outputView.printDealerCardIsBelowDrawThreshold(); - game.addDealerCard(); + game.drawCardTo(game.getDealer()); } } diff --git a/src/main/java/domain/game/Game.java b/src/main/java/domain/game/Game.java index 6d39f632b95..d26e5599d91 100644 --- a/src/main/java/domain/game/Game.java +++ b/src/main/java/domain/game/Game.java @@ -6,6 +6,7 @@ import domain.player.Dealer; import domain.player.Gambler; import domain.player.Gamblers; +import domain.player.Participant; import domain.player.ParticipantGameInfo; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -39,18 +40,21 @@ public Map> getInitialParticipantsHandInfo() { return info; } + public Dealer getDealer() { + return dealer; + } public boolean shouldDealerDraw() { return dealer.isBelowDrawThreshold(); } - public void addDealerCard() { - dealer.addCard(pickCard()); - } - public Card pickCard() { return gameCards.drawCard(); } + public void drawCardTo(Participant participant) { + participant.addCard(pickCard()); + } + public List getGamblersList() { return gamblers.getGamblers(); } diff --git a/src/main/java/domain/player/Dealer.java b/src/main/java/domain/player/Dealer.java index 81e4d2a8684..9e4e54c3196 100644 --- a/src/main/java/domain/player/Dealer.java +++ b/src/main/java/domain/player/Dealer.java @@ -5,7 +5,6 @@ public class Dealer extends Participant { public static final String DEALER_NAME = "딜러"; public static final int DEALER_REFERENCE_POINT = 16; - public Dealer(String DEALER_NAME) { super(DEALER_NAME); } From d353c147d31818718b705d853ab8c89be8a96ce8 Mon Sep 17 00:00:00 2001 From: originalchaltteokcookie Date: Sat, 14 Mar 2026 12:11:39 +0900 Subject: [PATCH 25/25] =?UTF-8?q?docs(README):=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EA=B5=AC=ED=98=84=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B2=B4=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 596d72bfd28..97b6c8da327 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ### 입력 - [x] "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리) " 를 출력한다. - [x] 게임에 참여하는 참가자의 이름을 쉼표 기준으로 나누는 문자열을 하나 입력받는다. -- [ ] 참가자 별로 베팅할 금액을 입력 +- [x] 참가자 별로 베팅할 금액을 입력 - [x] 게임을 계속 진행할 지 결정하는 (y/n) 는 y, n를 입력한다. ### 입력 예외 @@ -14,7 +14,7 @@ - [x] 이름은 영어로 2~10자 사이여야 한다. - [x] 이름은 영어로만 이루어져야 한다. - [x] 이름은 소문자 기준으로 중복되지 않는다. -- [ ] 베팅할 금액은 1 이상의 양수여야 한다. +- [x] 베팅할 금액은 10 이상의 양수여야 한다. - [x] 게임을 계속 진행할 지 결정하는 y, n만 입력할 수 있다. ### 기능 @@ -26,8 +26,8 @@ - [x] 파싱한 이름을 검증한다. 1-2. 베팅 금액 입력 - - [ ] 참가자 별로 베팅할 금액을 입력받는다. - - [ ] 베팅한 금액을 검증한다. + - [x] 참가자 별로 베팅할 금액을 입력받는다. + - [x] 베팅한 금액을 검증한다. 2. 게임 진행 @@ -45,13 +45,13 @@ 3. 결과 처리 - [x] 딜러와 각 참가자들의 카드 합을 구한다. -- [ ] 딜러와 참가자 수익 계산 초기값은 '0'으로 수익, 손해는 이 값을 기준으로 계산한다. -- [ ] 처음 두 장의 카드 합이 21이면 블랙잭으로, 베팅 금액의 1.5배를 딜러에게 받는다. -- [ ] 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다.(수익: 0) -- [ ] 카드를 추가로 뽑아 21을 초과할 경우 베팅 금액을 모두 잃게 된다. (수익: -베팅 금액) -- [ ] 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. (수익: 베팅 금액) -- [ ] 딜러가 21을 초과하더라도 플레이어가 21을 초과해 이미 베팅 금액을 잃었다면 베팅 금액을 받지 않는다. (수익: -베팅 금액) -- [ ] 딜러가 21을 초과할 때 플레이어가 이미 블랙잭으로 1.5배를 받았다면 추가로 금액을 받지 않는다. +- [x] 딜러와 참가자 수익 계산 초기값은 '0'으로 수익, 손해는 이 값을 기준으로 계산한다. +- [x] 처음 두 장의 카드 합이 21이면 블랙잭으로, 베팅 금액의 1.5배를 딜러에게 받는다. +- [x] 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다.(수익: 0) +- [x] 카드를 추가로 뽑아 21을 초과할 경우 베팅 금액을 모두 잃게 된다. (수익: -베팅 금액) +- [x] 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. (수익: 베팅 금액) +- [x] 딜러가 21을 초과하더라도 플레이어가 21을 초과해 이미 베팅 금액을 잃었다면 베팅 금액을 받지 않는다. (수익: -베팅 금액) +- [x] 딜러가 21을 초과할 때 플레이어가 이미 블랙잭으로 1.5배를 받았다면 추가로 금액을 받지 않는다. ### 출력 @@ -61,4 +61,4 @@ - [x] 참가자가 추가로 받은 카드들을“ [참가자]카드: 7클로버, K스페이드 ” 의 형태로 출력한다. - [x] 딜러가 받은 추가 카드를 “딜러는 16이하라 한장의 카드를 더 받았습니다.” 의 형태로 출력한다. - [x] 딜러, 참가자들의 카드 목록과 카드 합 결과를 “딜러카드: 3다이아몬드, 9클로버, 8다이아몬드 - 결과: 20” 의 형태로 출력한다. -- [ ] 딜러, 참가자들의 수익을 ## 최종 수익 딜러 : xxxx [참가자]: xxxx [참가자]: xxxx” 의 형태로 출력한다. \ No newline at end of file +- [x] 딜러, 참가자들의 수익을 ## 최종 수익 딜러 : xxxx [참가자]: xxxx [참가자]: xxxx” 의 형태로 출력한다. \ No newline at end of file