From b9c43d87ddc39c40202b7c7fa31712ce40244d51 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 16:07:30 +0900 Subject: [PATCH 01/39] =?UTF-8?q?feat:=20=EA=B8=B0=EB=8A=A5=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=EC=A0=95=EC=9D=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03ba7ed3..f7a352c0 100644 --- a/README.md +++ b/README.md @@ -1 +1,16 @@ -# java-blackjack \ No newline at end of file +# 연료 주입 + +## 기능 요구사항 +우리 회사는 렌터카를 운영하고 있다. 현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. 고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. 이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. +각 차량별 연비는 다음과 같다. +* Sonata : 10km/리터 +* Avante : 15km/리터 +* K5 : 13km/리터 + +## 기능 목록 +- 자동차를 생성한다. + - 종류 : Sonata, Avante, k5 + - 개수 : Sonata 2대, Avante 1대, K5 2대 +- 주입해야할 연료량을 계산한다. +- 차량 별로 주입해야할 보고서를 생성한다. +- 회사를 생성한다. \ No newline at end of file From fcb9e17162b5cdaacb8c6cae7740f1a3974289a6 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 16:29:11 +0900 Subject: [PATCH 02/39] =?UTF-8?q?feat:=20Car=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=95=84=EB=93=9C,=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/empty.txt | 0 src/main/java/fuel/Avante.java | 28 ++++++++++++++++++++++++++++ src/main/java/fuel/Car.java | 14 ++++++++++++++ src/main/java/fuel/K5.java | 28 ++++++++++++++++++++++++++++ src/main/java/fuel/Sonata.java | 28 ++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+) delete mode 100644 src/main/java/empty.txt create mode 100644 src/main/java/fuel/Avante.java create mode 100644 src/main/java/fuel/Car.java create mode 100644 src/main/java/fuel/K5.java create mode 100644 src/main/java/fuel/Sonata.java diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/fuel/Avante.java b/src/main/java/fuel/Avante.java new file mode 100644 index 00000000..95d54578 --- /dev/null +++ b/src/main/java/fuel/Avante.java @@ -0,0 +1,28 @@ +package fuel; + +public class Avante extends Car{ + + private static final String NAME = "Avante"; + private static final int DISTANCE_PER_LITER = 15; + + private final double tripDistance; + + public Avante(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/fuel/Car.java b/src/main/java/fuel/Car.java new file mode 100644 index 00000000..89a1e778 --- /dev/null +++ b/src/main/java/fuel/Car.java @@ -0,0 +1,14 @@ +package fuel; + +abstract public class Car { + + abstract double getDistancePerLiter(); + + abstract double getTripDistance(); + + abstract String getName(); + + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} diff --git a/src/main/java/fuel/K5.java b/src/main/java/fuel/K5.java new file mode 100644 index 00000000..0b7ac85a --- /dev/null +++ b/src/main/java/fuel/K5.java @@ -0,0 +1,28 @@ +package fuel; + +public class K5 extends Car{ + + private static final String NAME = "K5"; + private static final int DISTANCE_PER_LITER = 13; + + private final double tripDistance; + + public K5(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/fuel/Sonata.java b/src/main/java/fuel/Sonata.java new file mode 100644 index 00000000..d0959d50 --- /dev/null +++ b/src/main/java/fuel/Sonata.java @@ -0,0 +1,28 @@ +package fuel; + +public class Sonata extends Car{ + + private static final String NAME = "Sonata"; + private static final int DISTANCE_PER_LITER = 13; + + private final double tripDistance; + + public Sonata(double tripDistance) { + this.tripDistance = tripDistance; + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} From 85d2e1dd75848d4f19c0a4c19aacf7fe3881bfe8 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 16:42:03 +0900 Subject: [PATCH 03/39] =?UTF-8?q?feat:=20=EB=A6=AC=ED=8F=AC=ED=8A=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/fuel/RentCompany.java | 34 +++++++++++++++++++++++++ src/main/java/fuel/Sonata.java | 2 +- src/test/java/fuel/RentCompanyTest.java | 29 +++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 src/main/java/fuel/RentCompany.java create mode 100644 src/test/java/fuel/RentCompanyTest.java diff --git a/src/main/java/fuel/RentCompany.java b/src/main/java/fuel/RentCompany.java new file mode 100644 index 00000000..1a15b4d3 --- /dev/null +++ b/src/main/java/fuel/RentCompany.java @@ -0,0 +1,34 @@ +package fuel; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + + private static final String NEWLINE = "\n"; + private static final String REPORT_VIEW = "%s : %d리터" + NEWLINE; + + private final List cars; + + private RentCompany() { + cars = new ArrayList<>(); + } + + public static RentCompany create() { + return new RentCompany(); + } + + public void addCar(Car car) { + cars.add(car); + } + + public String generateReport() { + StringBuilder stringBuilder = new StringBuilder(); + + for (Car car : cars) { + stringBuilder.append(String.format(REPORT_VIEW, car.getName(), (int) car.getChargeQuantity())); + } + + return stringBuilder.toString(); + } +} diff --git a/src/main/java/fuel/Sonata.java b/src/main/java/fuel/Sonata.java index d0959d50..eea62ab4 100644 --- a/src/main/java/fuel/Sonata.java +++ b/src/main/java/fuel/Sonata.java @@ -3,7 +3,7 @@ public class Sonata extends Car{ private static final String NAME = "Sonata"; - private static final int DISTANCE_PER_LITER = 13; + private static final int DISTANCE_PER_LITER = 10; private final double tripDistance; diff --git a/src/test/java/fuel/RentCompanyTest.java b/src/test/java/fuel/RentCompanyTest.java new file mode 100644 index 00000000..7ca0b35e --- /dev/null +++ b/src/test/java/fuel/RentCompanyTest.java @@ -0,0 +1,29 @@ +package fuel; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import org.junit.jupiter.api.Test; + +class RentCompanyTest { + + private static final String NEWLINE = "\n"; + + @Test + public void report() throws Exception { + RentCompany company = RentCompany.create(); // factory method를 사용해 생성 + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + assertThat(report).isEqualTo( + "Sonata : 15리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +} \ No newline at end of file From e857713231eaa1cb86a52046d29a1abd320b2863 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 16:42:28 +0900 Subject: [PATCH 04/39] =?UTF-8?q?docs:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f7a352c0..988d93a6 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ * K5 : 13km/리터 ## 기능 목록 -- 자동차를 생성한다. +- [x] 자동차를 생성한다. - 종류 : Sonata, Avante, k5 - 개수 : Sonata 2대, Avante 1대, K5 2대 -- 주입해야할 연료량을 계산한다. -- 차량 별로 주입해야할 보고서를 생성한다. -- 회사를 생성한다. \ No newline at end of file +- [x] 주입해야할 연료량을 계산한다. +- [x] 차량 별로 주입해야할 보고서를 생성한다. +- [x] 회사를 생성한다. \ No newline at end of file From 442e4b1cf196abb888771911d2f4c2ce0b8d7fa1 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 16:43:37 +0900 Subject: [PATCH 05/39] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/fuel/{ => domain}/Avante.java | 4 ++-- src/main/java/fuel/{ => domain}/Car.java | 2 +- src/main/java/fuel/{ => domain}/K5.java | 4 ++-- src/main/java/fuel/{ => domain}/RentCompany.java | 5 +++-- src/main/java/fuel/{ => domain}/Sonata.java | 4 ++-- src/test/java/fuel/RentCompanyTest.java | 4 ++++ 6 files changed, 14 insertions(+), 9 deletions(-) rename src/main/java/fuel/{ => domain}/Avante.java (89%) rename src/main/java/fuel/{ => domain}/Car.java (92%) rename src/main/java/fuel/{ => domain}/K5.java (90%) rename src/main/java/fuel/{ => domain}/RentCompany.java (81%) rename src/main/java/fuel/{ => domain}/Sonata.java (89%) diff --git a/src/main/java/fuel/Avante.java b/src/main/java/fuel/domain/Avante.java similarity index 89% rename from src/main/java/fuel/Avante.java rename to src/main/java/fuel/domain/Avante.java index 95d54578..f453257b 100644 --- a/src/main/java/fuel/Avante.java +++ b/src/main/java/fuel/domain/Avante.java @@ -1,6 +1,6 @@ -package fuel; +package fuel.domain; -public class Avante extends Car{ +public class Avante extends Car { private static final String NAME = "Avante"; private static final int DISTANCE_PER_LITER = 15; diff --git a/src/main/java/fuel/Car.java b/src/main/java/fuel/domain/Car.java similarity index 92% rename from src/main/java/fuel/Car.java rename to src/main/java/fuel/domain/Car.java index 89a1e778..bcef18a0 100644 --- a/src/main/java/fuel/Car.java +++ b/src/main/java/fuel/domain/Car.java @@ -1,4 +1,4 @@ -package fuel; +package fuel.domain; abstract public class Car { diff --git a/src/main/java/fuel/K5.java b/src/main/java/fuel/domain/K5.java similarity index 90% rename from src/main/java/fuel/K5.java rename to src/main/java/fuel/domain/K5.java index 0b7ac85a..baa30684 100644 --- a/src/main/java/fuel/K5.java +++ b/src/main/java/fuel/domain/K5.java @@ -1,6 +1,6 @@ -package fuel; +package fuel.domain; -public class K5 extends Car{ +public class K5 extends Car { private static final String NAME = "K5"; private static final int DISTANCE_PER_LITER = 13; diff --git a/src/main/java/fuel/RentCompany.java b/src/main/java/fuel/domain/RentCompany.java similarity index 81% rename from src/main/java/fuel/RentCompany.java rename to src/main/java/fuel/domain/RentCompany.java index 1a15b4d3..3d849b07 100644 --- a/src/main/java/fuel/RentCompany.java +++ b/src/main/java/fuel/domain/RentCompany.java @@ -1,4 +1,4 @@ -package fuel; +package fuel.domain; import java.util.ArrayList; import java.util.List; @@ -26,7 +26,8 @@ public String generateReport() { StringBuilder stringBuilder = new StringBuilder(); for (Car car : cars) { - stringBuilder.append(String.format(REPORT_VIEW, car.getName(), (int) car.getChargeQuantity())); + stringBuilder.append( + String.format(REPORT_VIEW, car.getName(), (int) car.getChargeQuantity())); } return stringBuilder.toString(); diff --git a/src/main/java/fuel/Sonata.java b/src/main/java/fuel/domain/Sonata.java similarity index 89% rename from src/main/java/fuel/Sonata.java rename to src/main/java/fuel/domain/Sonata.java index eea62ab4..ced3b427 100644 --- a/src/main/java/fuel/Sonata.java +++ b/src/main/java/fuel/domain/Sonata.java @@ -1,6 +1,6 @@ -package fuel; +package fuel.domain; -public class Sonata extends Car{ +public class Sonata extends Car { private static final String NAME = "Sonata"; private static final int DISTANCE_PER_LITER = 10; diff --git a/src/test/java/fuel/RentCompanyTest.java b/src/test/java/fuel/RentCompanyTest.java index 7ca0b35e..a15ce874 100644 --- a/src/test/java/fuel/RentCompanyTest.java +++ b/src/test/java/fuel/RentCompanyTest.java @@ -2,6 +2,10 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import fuel.domain.Avante; +import fuel.domain.K5; +import fuel.domain.RentCompany; +import fuel.domain.Sonata; import org.junit.jupiter.api.Test; class RentCompanyTest { From 54702d24f0802f2f9964f3540cb5f2ac399fba9f Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 17:08:35 +0900 Subject: [PATCH 06/39] =?UTF-8?q?feat:=20tripDistance=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20=EC=83=81=EC=9C=84=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=97=90=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/fuel/domain/Avante.java | 4 +--- src/main/java/fuel/domain/Car.java | 6 ++++++ src/main/java/fuel/domain/K5.java | 4 +--- src/main/java/fuel/domain/Sonata.java | 4 +--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/fuel/domain/Avante.java b/src/main/java/fuel/domain/Avante.java index f453257b..6782d472 100644 --- a/src/main/java/fuel/domain/Avante.java +++ b/src/main/java/fuel/domain/Avante.java @@ -5,10 +5,8 @@ public class Avante extends Car { private static final String NAME = "Avante"; private static final int DISTANCE_PER_LITER = 15; - private final double tripDistance; - public Avante(double tripDistance) { - this.tripDistance = tripDistance; + super(tripDistance); } @Override diff --git a/src/main/java/fuel/domain/Car.java b/src/main/java/fuel/domain/Car.java index bcef18a0..95b6df96 100644 --- a/src/main/java/fuel/domain/Car.java +++ b/src/main/java/fuel/domain/Car.java @@ -2,6 +2,12 @@ abstract public class Car { + protected final double tripDistance; + + protected Car(double tripDistance) { + this.tripDistance = tripDistance; + } + abstract double getDistancePerLiter(); abstract double getTripDistance(); diff --git a/src/main/java/fuel/domain/K5.java b/src/main/java/fuel/domain/K5.java index baa30684..c5d90ca6 100644 --- a/src/main/java/fuel/domain/K5.java +++ b/src/main/java/fuel/domain/K5.java @@ -5,10 +5,8 @@ public class K5 extends Car { private static final String NAME = "K5"; private static final int DISTANCE_PER_LITER = 13; - private final double tripDistance; - public K5(double tripDistance) { - this.tripDistance = tripDistance; + super(tripDistance); } @Override diff --git a/src/main/java/fuel/domain/Sonata.java b/src/main/java/fuel/domain/Sonata.java index ced3b427..43c90320 100644 --- a/src/main/java/fuel/domain/Sonata.java +++ b/src/main/java/fuel/domain/Sonata.java @@ -5,10 +5,8 @@ public class Sonata extends Car { private static final String NAME = "Sonata"; private static final int DISTANCE_PER_LITER = 10; - private final double tripDistance; - public Sonata(double tripDistance) { - this.tripDistance = tripDistance; + super(tripDistance); } @Override From bbec84cc5df0b1a928c561be4e02a15daa11c4dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 14:11:35 +0900 Subject: [PATCH 07/39] docs: update readme.md --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 988d93a6..36a7f6e8 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,11 @@ * K5 : 13km/리터 ## 기능 목록 -- [x] 자동차를 생성한다. - - 종류 : Sonata, Avante, k5 - - 개수 : Sonata 2대, Avante 1대, K5 2대 -- [x] 주입해야할 연료량을 계산한다. -- [x] 차량 별로 주입해야할 보고서를 생성한다. -- [x] 회사를 생성한다. \ No newline at end of file + +- [x] 회사를 생성한다. - RentCompany + - [x] 자동차를 생성한다. - RentCompany.addCar + - 종류 : Sonata, Avante, k5 + - 개수 : Sonata 2대, Avante 1대, K5 2대 + - [x] 주입해야할 연료량을 계산한다. - Car.getChargeQuantity() + - [x] 차량 별로 주입해야할 보고서를 생성한다. - RentCompany.generateReport() + From 4189d873c78cefe77e14b835257292338c89e042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 16:38:19 +0900 Subject: [PATCH 08/39] =?UTF-8?q?feat:=20getChargeQuantity=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20final=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/fuel/domain/Car.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fuel/domain/Car.java b/src/main/java/fuel/domain/Car.java index 95b6df96..991fe3e7 100644 --- a/src/main/java/fuel/domain/Car.java +++ b/src/main/java/fuel/domain/Car.java @@ -14,7 +14,7 @@ protected Car(double tripDistance) { abstract String getName(); - double getChargeQuantity() { + final double getChargeQuantity() { return getTripDistance() / getDistancePerLiter(); } } From bba97a17d8e71a94dac673e5238471c14c1c0b03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 16:40:36 +0900 Subject: [PATCH 09/39] =?UTF-8?q?refactor:=20getChargeQuantity()=20=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - caculate 접두사로 변경 --- src/main/java/fuel/domain/Car.java | 8 ++++---- src/main/java/fuel/domain/RentCompany.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/fuel/domain/Car.java b/src/main/java/fuel/domain/Car.java index 991fe3e7..bec9ffc5 100644 --- a/src/main/java/fuel/domain/Car.java +++ b/src/main/java/fuel/domain/Car.java @@ -8,13 +8,13 @@ protected Car(double tripDistance) { this.tripDistance = tripDistance; } + final double calculateChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } + abstract double getDistancePerLiter(); abstract double getTripDistance(); abstract String getName(); - - final double getChargeQuantity() { - return getTripDistance() / getDistancePerLiter(); - } } diff --git a/src/main/java/fuel/domain/RentCompany.java b/src/main/java/fuel/domain/RentCompany.java index 3d849b07..4db7fa75 100644 --- a/src/main/java/fuel/domain/RentCompany.java +++ b/src/main/java/fuel/domain/RentCompany.java @@ -27,7 +27,7 @@ public String generateReport() { for (Car car : cars) { stringBuilder.append( - String.format(REPORT_VIEW, car.getName(), (int) car.getChargeQuantity())); + String.format(REPORT_VIEW, car.getName(), (int) car.calculateChargeQuantity())); } return stringBuilder.toString(); From 55e623fe8db994b40adc66c427e0996cb6f87c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 16:50:49 +0900 Subject: [PATCH 10/39] =?UTF-8?q?feat:=20Participnat=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=8A=A4=EC=BC=88=EB=A0=88=ED=86=A4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/Participant.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/blackjack/domain/Participant.java diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java new file mode 100644 index 00000000..d40c36f6 --- /dev/null +++ b/src/main/java/blackjack/domain/Participant.java @@ -0,0 +1,18 @@ +package blackjack.domain; + +import java.util.List; + +abstract public class Participant { + protected final String name; + protected final List cards; + protected final int winCount, loseCount; + + public Participant(String name, List cards, int winCount, int loseCount) { + this.name = name; + this.cards = cards; + this.winCount = winCount; + this.loseCount = loseCount; + } + + abstract void drawCard(); +} From d68dff7c5cd939b74ffa1c8999d548dbd575da71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 17:10:16 +0900 Subject: [PATCH 11/39] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=8A=A4=EC=BC=88=EB=A0=88=ED=86=A4=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 어떻게 구현할 것인지 전체적인 윤곽잡기 --- src/main/java/blackjack/domain/Game.java | 42 ++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/java/blackjack/domain/Game.java diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/domain/Game.java new file mode 100644 index 00000000..0d5d09c8 --- /dev/null +++ b/src/main/java/blackjack/domain/Game.java @@ -0,0 +1,42 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.List; + +public class Game { + + public void start() { + // 사용자 입력 + List name = new ArrayList<>(); + name.add("pobi"); + name.add("jason"); + + // 딜러 추가 + Participant dealer = new Dealer("dealer"); + + // 사용자 추가 + List players = new ArrayList<>(); + players.add(new Player(name.get(0))); + players.add(new Player(name.get(1))); + + // 딜러 , 사용자 에게 카드 2장씩 분배 + dealer.drawCard(2); + for (Participant player : players) { + player.drawCard(2); + } + + // 받은 카드 상태 출력 + + // 사용자 1장씩 뽑기 + for (Participant player : players) { + player.drawCard(1); + } + + // 딜러 1장 뽑기 + dealer.drawCard(1); + + // 사용자별 카드 최종 상태 출력 + + // 최종 승패 + } +} From 9d2dc0e5a85d4317cfa58b9933568cd543adf04f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 17:20:21 +0900 Subject: [PATCH 12/39] =?UTF-8?q?feat:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=9D=BC=EA=B8=89=20?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 플레이어 리스트를 관리 - 정적 팩토리 메서드로 생성 - 카드 한꺼번에 뽑는 메서드 구현 - Game 안에 관련로직 수정 --- src/main/java/blackjack/domain/Game.java | 12 +++-------- src/main/java/blackjack/domain/Players.java | 23 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 src/main/java/blackjack/domain/Players.java diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/domain/Game.java index 0d5d09c8..d55ec5d6 100644 --- a/src/main/java/blackjack/domain/Game.java +++ b/src/main/java/blackjack/domain/Game.java @@ -15,22 +15,16 @@ public void start() { Participant dealer = new Dealer("dealer"); // 사용자 추가 - List players = new ArrayList<>(); - players.add(new Player(name.get(0))); - players.add(new Player(name.get(1))); + Players players = Players.from(name); // 딜러 , 사용자 에게 카드 2장씩 분배 dealer.drawCard(2); - for (Participant player : players) { - player.drawCard(2); - } + players.drawAll(2); // 받은 카드 상태 출력 // 사용자 1장씩 뽑기 - for (Participant player : players) { - player.drawCard(1); - } + players.drawAll(1); // 딜러 1장 뽑기 dealer.drawCard(1); diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java new file mode 100644 index 00000000..66c0f8a9 --- /dev/null +++ b/src/main/java/blackjack/domain/Players.java @@ -0,0 +1,23 @@ +package blackjack.domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class Players { + + private final List players; + + private Players(List players) { + this.players = players; + } + + public static Players from(final List names) { + return new Players(names.stream().map(Player::new).collect(Collectors.toList())); + } + + public void drawAll(int number) { + for (Participant player : players) { + player.drawCard(number); + } + } +} From 1d9769b5ce85f3089c2d63c8f16da59de9f7a98d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 17:21:52 +0900 Subject: [PATCH 13/39] =?UTF-8?q?refactor:=20drawAll()=20->=20drawCardAll(?= =?UTF-8?q?)=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Game.java | 4 ++-- src/main/java/blackjack/domain/Players.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/domain/Game.java index d55ec5d6..2c8b378a 100644 --- a/src/main/java/blackjack/domain/Game.java +++ b/src/main/java/blackjack/domain/Game.java @@ -19,12 +19,12 @@ public void start() { // 딜러 , 사용자 에게 카드 2장씩 분배 dealer.drawCard(2); - players.drawAll(2); + players.drawCardAll(2); // 받은 카드 상태 출력 // 사용자 1장씩 뽑기 - players.drawAll(1); + players.drawCardAll(1); // 딜러 1장 뽑기 dealer.drawCard(1); diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 66c0f8a9..9fa35e29 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -15,7 +15,7 @@ public static Players from(final List names) { return new Players(names.stream().map(Player::new).collect(Collectors.toList())); } - public void drawAll(int number) { + public void drawCardAll(int number) { for (Participant player : players) { player.drawCard(number); } From 8edbe2a5ffd9356667e5a51e532550bf7ef323f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 18:08:26 +0900 Subject: [PATCH 14/39] =?UTF-8?q?feat:=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EA=B0=80=EC=A7=80=EA=B3=A0=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=93=A4=EC=9D=84=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=9D=BC=EA=B8=89=EC=BB=AC=EB=A0=89?= =?UTF-8?q?=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Cards.java | 15 +++++++++++++++ src/main/java/blackjack/domain/Participant.java | 12 ++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/main/java/blackjack/domain/Cards.java diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java new file mode 100644 index 00000000..0f734bac --- /dev/null +++ b/src/main/java/blackjack/domain/Cards.java @@ -0,0 +1,15 @@ +package blackjack.domain; + +import java.util.List; + +public class Cards { + private final List cards; + + public Cards(List cards) { + this.cards = cards; + } + + public int sumCardScore() { + return 1; + } +} diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index d40c36f6..7d91a607 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -1,18 +1,22 @@ package blackjack.domain; -import java.util.List; +import java.util.ArrayList; abstract public class Participant { protected final String name; - protected final List cards; + protected final Cards cards; protected final int winCount, loseCount; - public Participant(String name, List cards, int winCount, int loseCount) { + public Participant(String name, Cards cards, int winCount, int loseCount) { this.name = name; this.cards = cards; this.winCount = winCount; this.loseCount = loseCount; } - abstract void drawCard(); + public Participant(String name) { + this(name, new Cards(new ArrayList<>()), 0, 0); + } + + abstract void drawCard(int number); } From b6e6ec9a74c3162db175b0ea56c83a7124aebfb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 18:09:53 +0900 Subject: [PATCH 15/39] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC,=20=ED=94=8C?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Participant 클래스 상속받음 - 카드를 뽑는 메서드 오버라이딩 --- src/main/java/blackjack/domain/Dealer.java | 17 +++++++++++++++++ src/main/java/blackjack/domain/Player.java | 15 +++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/main/java/blackjack/domain/Dealer.java create mode 100644 src/main/java/blackjack/domain/Player.java diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000..ca09ef8d --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,17 @@ +package blackjack.domain; + +public class Dealer extends Participant{ + + public Dealer(String name) { + super(name); + } + + @Override + void drawCard(int number) { + if(cards.sumCardScore() > 17) + return; + + // for문 - number + //this.cards.add(Card.random()); + } +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000..bd86fac6 --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,15 @@ +package blackjack.domain; + +import java.util.List; + +public class Player extends Participant{ + + public Player(String name) { + super(name); + } + + @Override + void drawCard(int number) { + + } +} From 87a763a6be72742f9150238134262ba656ece268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Mon, 14 Feb 2022 18:11:23 +0900 Subject: [PATCH 16/39] update readme.md --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index 36a7f6e8..97ab54b0 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,37 @@ - 개수 : Sonata 2대, Avante 1대, K5 2대 - [x] 주입해야할 연료량을 계산한다. - Car.getChargeQuantity() - [x] 차량 별로 주입해야할 보고서를 생성한다. - RentCompany.generateReport() + + +# 블랙잭 + +## 기능 요구사항 +블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +- [ ] 딜러, 플레이어 (공통) - Participant + - 이름 + - 보유 카드 + - 승, 패 기록 + - 카드를 뽑음 +- [ ] 딜러 - Dealer +- [ ] 플레이어 - Player + +- 카드 - Card + - 종류 : ♦︎다이아, ♥하트, ♠스페이드, ♣클로버 + - 숫자 : 1 ~ 9, A (= 1, 11), K (= 10), Q (= 10), J (= 10) +- 게임 - Game + - 게임 진행 + - 게임 종료 조건 확인 + +- 입력 + - 게임 참여자 입력 (쉼표로 구분) + - 카드를 더 받을지 입력 (y/n) + +- 결과 + - 최종 승패 출력 From 30c85d020df26d4f1620f1bfa14e970e55e13eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Tue, 15 Feb 2022 18:30:15 +0900 Subject: [PATCH 17/39] =?UTF-8?q?refactor:=20Cards=20->=20ParticipantCards?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Participant.java | 6 +++--- .../blackjack/domain/{Cards.java => ParticipantCards.java} | 4 ++-- src/main/java/blackjack/domain/Player.java | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) rename src/main/java/blackjack/domain/{Cards.java => ParticipantCards.java} (69%) diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index 7d91a607..d1ceb06b 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -4,10 +4,10 @@ abstract public class Participant { protected final String name; - protected final Cards cards; + protected final ParticipantCards cards; protected final int winCount, loseCount; - public Participant(String name, Cards cards, int winCount, int loseCount) { + public Participant(String name, ParticipantCards cards, int winCount, int loseCount) { this.name = name; this.cards = cards; this.winCount = winCount; @@ -15,7 +15,7 @@ public Participant(String name, Cards cards, int winCount, int loseCount) { } public Participant(String name) { - this(name, new Cards(new ArrayList<>()), 0, 0); + this(name, new ParticipantCards(new ArrayList<>()), 0, 0); } abstract void drawCard(int number); diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/ParticipantCards.java similarity index 69% rename from src/main/java/blackjack/domain/Cards.java rename to src/main/java/blackjack/domain/ParticipantCards.java index 0f734bac..daf2bd8b 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -2,10 +2,10 @@ import java.util.List; -public class Cards { +public class ParticipantCards { private final List cards; - public Cards(List cards) { + public ParticipantCards(List cards) { this.cards = cards; } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index bd86fac6..97e69f7b 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,6 +1,5 @@ package blackjack.domain; -import java.util.List; public class Player extends Participant{ From f1613adb28d062a3adcb952d5efc9fdeaad1b385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Tue, 15 Feb 2022 18:30:55 +0900 Subject: [PATCH 18/39] =?UTF-8?q?feat:=20Card,=20Deck=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카드 1장에 대한 정보를 관리하는 Card 클래스 - 모든 카드 묶음을 관리하는 Deck 클래스 --- src/main/java/blackjack/domain/Card.java | 46 ++++++++++++++++++++++++ src/main/java/blackjack/domain/Deck.java | 25 +++++++++++++ src/main/java/blackjack/domain/Game.java | 13 +++++++ 3 files changed, 84 insertions(+) create mode 100644 src/main/java/blackjack/domain/Card.java create mode 100644 src/main/java/blackjack/domain/Deck.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 00000000..fc924293 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,46 @@ +package blackjack.domain; + +public class Card { + + private final CardType cardType; + private final CardValue cardValue; + + Card(CardType cardType, CardValue cardValue) { + this.cardType = cardType; + this.cardValue = cardValue; + } + + enum CardType { + SPADE, + CLOVER, + HEART, + DIAMOND + } + + enum CardValue { + ACE("A", -1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + QUEEN("Q", 10), + JACK("J", 10), + KING("K", 10); + + private final String number; + private final int score; + + CardValue(String number, int score) { + this.number = number; + this.score = score; + } + } +} + + + diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 00000000..00b7fa8d --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,25 @@ +package blackjack.domain; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.List; +import java.util.Stack; + +public class Deck { + private final Stack deck = new Stack<>(); + + public Deck(List cardTypes, List cardValues) { + for(CardType cardType : cardTypes){ + for(CardValue cardValue : cardValues){ + deck.add(new Card(cardType, cardValue)); + } + } + } + + public Card draw() { + if(deck.size() == 0) { + throw new IllegalStateException("패가 더이상 존재하지 않습니다."); + } + return deck.pop(); + } +} diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/domain/Game.java index 2c8b378a..784cfa3f 100644 --- a/src/main/java/blackjack/domain/Game.java +++ b/src/main/java/blackjack/domain/Game.java @@ -1,11 +1,24 @@ package blackjack.domain; +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; public class Game { public void start() { + // 덱만들기 + List types = Arrays.asList(CardType.values()); + Collections.shuffle(types); + + List values = Arrays.asList(CardValue.values()); + Collections.shuffle(values); + + Deck deck = new Deck(types, values); + // 사용자 입력 List name = new ArrayList<>(); name.add("pobi"); From d51dafff4f685f543b8ea3149d161ae1de081b1c Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Wed, 16 Feb 2022 17:00:44 +0900 Subject: [PATCH 19/39] =?UTF-8?q?feat:=20deck=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - src/main/java/blackjack/domain/Dealer.java | 5 +++-- src/main/java/blackjack/domain/Deck.java | 21 ++++++++++++++----- src/main/java/blackjack/domain/Game.java | 8 +++---- .../java/blackjack/domain/Participant.java | 2 +- src/main/java/blackjack/domain/Player.java | 4 ++-- src/main/java/blackjack/domain/Players.java | 4 ++-- 7 files changed, 28 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 97ab54b0..c22c3af4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ - [x] 주입해야할 연료량을 계산한다. - Car.getChargeQuantity() - [x] 차량 별로 주입해야할 보고서를 생성한다. - RentCompany.generateReport() - # 블랙잭 ## 기능 요구사항 diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index ca09ef8d..faf2e306 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -7,11 +7,12 @@ public Dealer(String name) { } @Override - void drawCard(int number) { + public Card drawCardMultiple(Deck deck, int number) { if(cards.sumCardScore() > 17) - return; + return null; // for문 - number //this.cards.add(Card.random()); + return null; } } diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 00b7fa8d..ff34eda8 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -2,22 +2,33 @@ import blackjack.domain.Card.CardType; import blackjack.domain.Card.CardValue; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; import java.util.List; -import java.util.Stack; public class Deck { - private final Stack deck = new Stack<>(); + + private final Deque deck = new ArrayDeque<>(); public Deck(List cardTypes, List cardValues) { - for(CardType cardType : cardTypes){ - for(CardValue cardValue : cardValues){ + for (CardType cardType : cardTypes) { + for (CardValue cardValue : cardValues) { deck.add(new Card(cardType, cardValue)); } } } + public List drawMultiple(int num) { + List cards = new ArrayList<>(); + for (int i = 0; i < num; i++) { + cards.add(draw()); + } + return cards; + } + public Card draw() { - if(deck.size() == 0) { + if (deck.size() == 0) { throw new IllegalStateException("패가 더이상 존재하지 않습니다."); } return deck.pop(); diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/domain/Game.java index 784cfa3f..d71d741f 100644 --- a/src/main/java/blackjack/domain/Game.java +++ b/src/main/java/blackjack/domain/Game.java @@ -31,16 +31,16 @@ public void start() { Players players = Players.from(name); // 딜러 , 사용자 에게 카드 2장씩 분배 - dealer.drawCard(2); - players.drawCardAll(2); + dealer.drawCardMultiple(deck, 2); + players.drawCardMultiple(deck, 2); // 받은 카드 상태 출력 // 사용자 1장씩 뽑기 - players.drawCardAll(1); + players.drawCardMultiple(deck, 1); // 딜러 1장 뽑기 - dealer.drawCard(1); + dealer.drawCardMultiple(deck, 1); // 사용자별 카드 최종 상태 출력 diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index d1ceb06b..c44b8ec8 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -18,5 +18,5 @@ public Participant(String name) { this(name, new ParticipantCards(new ArrayList<>()), 0, 0); } - abstract void drawCard(int number); + public abstract Card drawCardMultiple(Deck deck, int number); } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 97e69f7b..da675587 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -8,7 +8,7 @@ public Player(String name) { } @Override - void drawCard(int number) { - + public Card drawCardMultiple(Deck deck, int number) { + return null; } } diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 9fa35e29..ca5b98a4 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -15,9 +15,9 @@ public static Players from(final List names) { return new Players(names.stream().map(Player::new).collect(Collectors.toList())); } - public void drawCardAll(int number) { + public void drawCardMultiple(Deck deck, int number) { for (Participant player : players) { - player.drawCard(number); + player.drawCardMultiple(deck, number); } } } From 8ef92126fb37b9aef5063194ed4dc98954a1d06b Mon Sep 17 00:00:00 2001 From: hscom96 Date: Wed, 16 Feb 2022 17:07:29 +0900 Subject: [PATCH 20/39] =?UTF-8?q?refactor:=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=96=B4=20deck=EC=97=90=EC=84=9C=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=BD=91=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Dealer.java | 12 +++++------- src/main/java/blackjack/domain/Participant.java | 2 +- src/main/java/blackjack/domain/ParticipantCards.java | 4 ++++ src/main/java/blackjack/domain/Player.java | 4 ++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index faf2e306..89478064 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -7,12 +7,10 @@ public Dealer(String name) { } @Override - public Card drawCardMultiple(Deck deck, int number) { - if(cards.sumCardScore() > 17) - return null; - - // for문 - number - //this.cards.add(Card.random()); - return null; + public void drawCardMultiple(Deck deck, int number) { + if(cards.sumCardScore() > 17) { + return; + } + cards.addCards(deck.drawMultiple(number)); } } diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index c44b8ec8..af91d752 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -18,5 +18,5 @@ public Participant(String name) { this(name, new ParticipantCards(new ArrayList<>()), 0, 0); } - public abstract Card drawCardMultiple(Deck deck, int number); + public abstract void drawCardMultiple(Deck deck, int number); } diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java index daf2bd8b..f18896f7 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -9,6 +9,10 @@ public ParticipantCards(List cards) { this.cards = cards; } + public void addCards(List drawCards) { + cards.addAll(drawCards); + } + public int sumCardScore() { return 1; } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index da675587..bd2fd246 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -8,7 +8,7 @@ public Player(String name) { } @Override - public Card drawCardMultiple(Deck deck, int number) { - return null; + public void drawCardMultiple(Deck deck, int number) { + cards.addCards(deck.drawMultiple(number)); } } From e30e64a70c4814f50f8eb4afec516ccf6484bc66 Mon Sep 17 00:00:00 2001 From: hscom96 Date: Wed, 16 Feb 2022 17:30:37 +0900 Subject: [PATCH 21/39] =?UTF-8?q?feat:=20Card=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20getScore=20=EA=B3=84=EC=82=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 38 +++++++++++-------- src/main/java/blackjack/domain/Game.java | 5 ++- .../blackjack/domain/ParticipantCards.java | 8 ++++ .../blackjack/service/WinnerJudgement.java | 10 +++++ 4 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 src/main/java/blackjack/service/WinnerJudgement.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index fc924293..6623bb59 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -1,5 +1,7 @@ package blackjack.domain; +import java.util.function.IntUnaryOperator; + public class Card { private final CardType cardType; @@ -10,6 +12,10 @@ public class Card { this.cardValue = cardValue; } + public int getScore(int currentScore) { + return this.cardValue.intUnaryOperator.applyAsInt(currentScore); + } + enum CardType { SPADE, CLOVER, @@ -18,26 +24,26 @@ enum CardType { } enum CardValue { - ACE("A", -1), - TWO("2", 2), - THREE("3", 3), - FOUR("4", 4), - FIVE("5", 5), - SIX("6", 6), - SEVEN("7", 7), - EIGHT("8", 8), - NINE("9", 9), - TEN("10", 10), - QUEEN("Q", 10), - JACK("J", 10), - KING("K", 10); + ACE("A", currentScore -> currentScore < 15 ? 11 : 1), + TWO("2", currentScore -> 2), + THREE("3", currentScore -> 3), + FOUR("4", currentScore -> 4), + FIVE("5", currentScore -> 5), + SIX("6", currentScore -> 6), + SEVEN("7", currentScore -> 7), + EIGHT("8", currentScore -> 8), + NINE("9", currentScore -> 9), + TEN("10", currentScore -> 10), + QUEEN("Q", currentScore -> 10), + JACK("J", currentScore -> 10), + KING("K", currentScore -> 10); private final String number; - private final int score; + private final IntUnaryOperator intUnaryOperator; - CardValue(String number, int score) { + CardValue(String number, IntUnaryOperator intUnaryOperator) { this.number = number; - this.score = score; + this.intUnaryOperator = intUnaryOperator; } } } diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/domain/Game.java index d71d741f..b4d8edcb 100644 --- a/src/main/java/blackjack/domain/Game.java +++ b/src/main/java/blackjack/domain/Game.java @@ -9,7 +9,7 @@ public class Game { - public void start() { + public Participant start() { // 덱만들기 List types = Arrays.asList(CardType.values()); Collections.shuffle(types); @@ -45,5 +45,8 @@ public void start() { // 사용자별 카드 최종 상태 출력 // 최종 승패 + + // 승자 반환 + return null; } } diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java index f18896f7..ea0dd0ef 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -14,6 +14,14 @@ public void addCards(List drawCards) { } public int sumCardScore() { + + + int score = 0; + + for(Card card : cards){ + + } + return 1; } } diff --git a/src/main/java/blackjack/service/WinnerJudgement.java b/src/main/java/blackjack/service/WinnerJudgement.java new file mode 100644 index 00000000..e3d135ed --- /dev/null +++ b/src/main/java/blackjack/service/WinnerJudgement.java @@ -0,0 +1,10 @@ +package blackjack.service; + +import blackjack.domain.Participant; + +public class WinnerJudgement { + + public Participant judgementWInner(){ + return null; + } +} From 1cc037808be9fdfeb4c4e56e46d96aa74b690352 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Wed, 16 Feb 2022 18:16:18 +0900 Subject: [PATCH 22/39] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=B4=9D?= =?UTF-8?q?=ED=95=A9=20=EA=B5=AC=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 8 +++ .../blackjack/domain/ParticipantCards.java | 17 ++++-- .../domain/ParticipantCardsTest.java | 54 +++++++++++++++++++ 3 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/test/java/blackjack/domain/ParticipantCardsTest.java diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 6623bb59..9987b97e 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -16,6 +16,10 @@ public int getScore(int currentScore) { return this.cardValue.intUnaryOperator.applyAsInt(currentScore); } + public CardValue getCardValue() { + return cardValue; + } + enum CardType { SPADE, CLOVER, @@ -45,6 +49,10 @@ enum CardValue { this.number = number; this.intUnaryOperator = intUnaryOperator; } + + public boolean isEqualCardValue(Card card){ + return this.equals(card.getCardValue()); + } } } diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java index ea0dd0ef..52e93ffa 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -1,8 +1,11 @@ package blackjack.domain; +import blackjack.domain.Card.CardValue; import java.util.List; +import java.util.stream.Collectors; public class ParticipantCards { + private final List cards; public ParticipantCards(List cards) { @@ -14,14 +17,20 @@ public void addCards(List drawCards) { } public int sumCardScore() { - - int score = 0; - for(Card card : cards){ + score += cards.stream() + .filter(card -> !CardValue.ACE.isEqualCardValue(card)) + .reduce(0, (x, y) -> x + y.getScore(x), Integer::sum); + + List aceCards = cards.stream() + .filter(CardValue.ACE::isEqualCardValue) + .collect(Collectors.toList()); + for (Card card : aceCards) { + score += card.getScore(score); } - return 1; + return score; } } diff --git a/src/test/java/blackjack/domain/ParticipantCardsTest.java b/src/test/java/blackjack/domain/ParticipantCardsTest.java new file mode 100644 index 00000000..a2f35bf3 --- /dev/null +++ b/src/test/java/blackjack/domain/ParticipantCardsTest.java @@ -0,0 +1,54 @@ +package blackjack.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class ParticipantCardsTest { + @Test + void 카드총합_구하기(){ + // given + List cards = new ArrayList<>(); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.ACE)); + cards.add(new Card(CardType.CLOVER, CardValue.TWO)); + ParticipantCards participantCards = new ParticipantCards(cards); + + int score = participantCards.sumCardScore(); + + assertThat(score).isEqualTo(18); + } + + @Test + void 카드총합_구하기2(){ + // given + List cards = new ArrayList<>(); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.TWO)); + ParticipantCards participantCards = new ParticipantCards(cards); + + int score = participantCards.sumCardScore(); + + assertThat(score).isEqualTo(7); + } + + @Test + void 카드총합_구하기3(){ + // given + List cards = new ArrayList<>(); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.NINE)); + cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); + cards.add(new Card(CardType.CLOVER, CardValue.ACE)); + cards.add(new Card(CardType.CLOVER, CardValue.TWO)); + ParticipantCards participantCards = new ParticipantCards(cards); + + int score = participantCards.sumCardScore(); + + assertThat(score).isEqualTo(22); + } +} From 23a96d6dbc2ce2cec847b62d29b7f5401d27c78f Mon Sep 17 00:00:00 2001 From: hscom96 Date: Wed, 16 Feb 2022 18:26:26 +0900 Subject: [PATCH 23/39] =?UTF-8?q?feat:=20=EC=8A=B9=EC=9E=90=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0=EC=97=90=EC=84=9C=20max=20=EC=A0=90=EC=88=98?= =?UTF-8?q?=20=EA=B5=AC=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Participant.java | 5 +++++ src/main/java/blackjack/service/WinnerJudgement.java | 10 +++++++++- .../java/blackjack/domain/ParticipantCardsTest.java | 7 ++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index af91d752..fe7a5334 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -3,6 +3,7 @@ import java.util.ArrayList; abstract public class Participant { + protected final String name; protected final ParticipantCards cards; protected final int winCount, loseCount; @@ -18,5 +19,9 @@ public Participant(String name) { this(name, new ParticipantCards(new ArrayList<>()), 0, 0); } + public final int sumCardScore() { + return cards.sumCardScore(); + } + public abstract void drawCardMultiple(Deck deck, int number); } diff --git a/src/main/java/blackjack/service/WinnerJudgement.java b/src/main/java/blackjack/service/WinnerJudgement.java index e3d135ed..98d8ddc2 100644 --- a/src/main/java/blackjack/service/WinnerJudgement.java +++ b/src/main/java/blackjack/service/WinnerJudgement.java @@ -1,10 +1,18 @@ package blackjack.service; import blackjack.domain.Participant; +import java.util.List; public class WinnerJudgement { - public Participant judgementWInner(){ + public List judgementWInner(List participants) { + int max = participants.stream() + .mapToInt(participant -> participant.sumCardScore()) + .max() + .orElseThrow(() -> { + throw new IllegalStateException("최대값을 구할 수 없습니다."); + }); + return null; } } diff --git a/src/test/java/blackjack/domain/ParticipantCardsTest.java b/src/test/java/blackjack/domain/ParticipantCardsTest.java index a2f35bf3..d3f0d195 100644 --- a/src/test/java/blackjack/domain/ParticipantCardsTest.java +++ b/src/test/java/blackjack/domain/ParticipantCardsTest.java @@ -9,8 +9,9 @@ import org.junit.jupiter.api.Test; class ParticipantCardsTest { + @Test - void 카드총합_구하기(){ + void 카드총합_구하기() { // given List cards = new ArrayList<>(); cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); @@ -24,7 +25,7 @@ class ParticipantCardsTest { } @Test - void 카드총합_구하기2(){ + void 카드총합_구하기2() { // given List cards = new ArrayList<>(); cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); @@ -37,7 +38,7 @@ class ParticipantCardsTest { } @Test - void 카드총합_구하기3(){ + void 카드총합_구하기3() { // given List cards = new ArrayList<>(); cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); From bccb7a712725851e91e5ec2a0eb4013e0f5887a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 17:30:01 +0900 Subject: [PATCH 24/39] =?UTF-8?q?feat:=20controller=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Game 클래스를 controller 패키지로 이동 --- .../{domain/Game.java => controller/GameController.java} | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) rename src/main/java/blackjack/{domain/Game.java => controller/GameController.java} (86%) diff --git a/src/main/java/blackjack/domain/Game.java b/src/main/java/blackjack/controller/GameController.java similarity index 86% rename from src/main/java/blackjack/domain/Game.java rename to src/main/java/blackjack/controller/GameController.java index b4d8edcb..e292c9b3 100644 --- a/src/main/java/blackjack/domain/Game.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -1,13 +1,17 @@ -package blackjack.domain; +package blackjack.controller; import blackjack.domain.Card.CardType; import blackjack.domain.Card.CardValue; +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Participant; +import blackjack.domain.Players; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -public class Game { +public class GameController { public Participant start() { // 덱만들기 From f9c848f503f56a0026116b48b481fc4540ea172b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:33:00 +0900 Subject: [PATCH 25/39] =?UTF-8?q?feat:=20enum=20=EC=9D=84=20public=20?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 4 ++-- .../domain/{Players.java => Participants.java} | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) rename src/main/java/blackjack/domain/{Players.java => Participants.java} (57%) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 9987b97e..cd5940c3 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -20,14 +20,14 @@ public CardValue getCardValue() { return cardValue; } - enum CardType { + public enum CardType { SPADE, CLOVER, HEART, DIAMOND } - enum CardValue { + public enum CardValue { ACE("A", currentScore -> currentScore < 15 ? 11 : 1), TWO("2", currentScore -> 2), THREE("3", currentScore -> 3), diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Participants.java similarity index 57% rename from src/main/java/blackjack/domain/Players.java rename to src/main/java/blackjack/domain/Participants.java index ca5b98a4..97d7a7ee 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Participants.java @@ -1,5 +1,7 @@ package blackjack.domain; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -8,11 +10,13 @@ public class Players { private final List players; private Players(List players) { - this.players = players; + this.players = new ArrayList<>(players); } public static Players from(final List names) { - return new Players(names.stream().map(Player::new).collect(Collectors.toList())); + return new Players(names.stream() + .map(Player::new) + .collect(Collectors.toList())); } public void drawCardMultiple(Deck deck, int number) { @@ -20,4 +24,8 @@ public void drawCardMultiple(Deck deck, int number) { player.drawCardMultiple(deck, number); } } + + public List getPlayers() { + return Collections.unmodifiableList(players); + } } From 75d1d93eaa0d261d9f166922c8757bd1402c6120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:33:54 +0900 Subject: [PATCH 26/39] =?UTF-8?q?feat:=20Deck=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 덱을 미리 섞어서 반환 --- src/main/java/blackjack/domain/Deck.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index ff34eda8..def4c8e1 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -4,6 +4,8 @@ import blackjack.domain.Card.CardValue; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.Deque; import java.util.List; @@ -19,6 +21,16 @@ public Deck(List cardTypes, List cardValues) { } } + public static Deck create() { + List types = Arrays.asList(CardType.values()); + Collections.shuffle(types); + + List values = Arrays.asList(CardValue.values()); + Collections.shuffle(values); + + return new Deck(types, values); + } + public List drawMultiple(int num) { List cards = new ArrayList<>(); for (int i = 0; i < num; i++) { From 412aa73313c2f91134436af89ff17a0ba94644c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:34:48 +0900 Subject: [PATCH 27/39] =?UTF-8?q?feat:=20=EC=8A=B9,=20=ED=8C=A8=20?= =?UTF-8?q?=EC=A0=90=EC=88=98=20=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Participant.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index fe7a5334..f3634c3c 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -6,19 +6,27 @@ abstract public class Participant { protected final String name; protected final ParticipantCards cards; - protected final int winCount, loseCount; + protected int winScore, loseScore; public Participant(String name, ParticipantCards cards, int winCount, int loseCount) { this.name = name; this.cards = cards; - this.winCount = winCount; - this.loseCount = loseCount; + this.winScore = winCount; + this.loseScore = loseCount; } public Participant(String name) { this(name, new ParticipantCards(new ArrayList<>()), 0, 0); } + public final void judgeScore(int maxScore) { + if(sumCardScore() == maxScore){ + winScore++; + return; + } + loseScore++; + } + public final int sumCardScore() { return cards.sumCardScore(); } From fd874ab6bacc99f0840fa6ae0e47727fd82b662a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:36:27 +0900 Subject: [PATCH 28/39] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20=EC=A0=90=EC=88=98=EA=B3=84=EC=82=B0=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카드 안전하게 반환 - 점수계산 메서드 리펙터링 --- .../blackjack/domain/ParticipantCards.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java index 52e93ffa..c5d42a9d 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -1,15 +1,15 @@ package blackjack.domain; -import blackjack.domain.Card.CardValue; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; public class ParticipantCards { private final List cards; public ParticipantCards(List cards) { - this.cards = cards; + this.cards = new ArrayList<>(cards); } public void addCards(List drawCards) { @@ -17,20 +17,11 @@ public void addCards(List drawCards) { } public int sumCardScore() { - int score = 0; - - score += cards.stream() - .filter(card -> !CardValue.ACE.isEqualCardValue(card)) + return cards.stream() .reduce(0, (x, y) -> x + y.getScore(x), Integer::sum); + } - List aceCards = cards.stream() - .filter(CardValue.ACE::isEqualCardValue) - .collect(Collectors.toList()); - - for (Card card : aceCards) { - score += card.getScore(score); - } - - return score; + public List getCards() { + return Collections.unmodifiableList(cards); } } From 9458008fb049d84792a0245f1d14b17780b33cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:39:18 +0900 Subject: [PATCH 29/39] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC,=20=EC=B0=B8?= =?UTF-8?q?=EA=B0=80=EC=9E=90=20=EB=AA=A8=EB=91=90=EB=A5=BC=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 덱 생성 - 참가자 초기화 - 현재 참가자 상태 저장 --- .../java/blackjack/domain/Participants.java | 65 +++++++++++++++---- .../blackjack/service/WinnerJudgement.java | 18 ----- 2 files changed, 51 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/blackjack/service/WinnerJudgement.java diff --git a/src/main/java/blackjack/domain/Participants.java b/src/main/java/blackjack/domain/Participants.java index 97d7a7ee..c6f2a4ef 100644 --- a/src/main/java/blackjack/domain/Participants.java +++ b/src/main/java/blackjack/domain/Participants.java @@ -3,29 +3,66 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; -public class Players { +public class Participants { - private final List players; + private final List participants; + private final Deck deck; + private int targetIndex; - private Players(List players) { - this.players = new ArrayList<>(players); + private Participants(List participants) { + this.deck = Deck.create(); + this.participants = new ArrayList<>(participants); + this.targetIndex = 0; } - public static Players from(final List names) { - return new Players(names.stream() - .map(Player::new) - .collect(Collectors.toList())); + public static Participants from(Players players, Dealer dealer) { + List participants = new ArrayList<>(players.getPlayers()); + participants.add(dealer); + return new Participants(participants); } - public void drawCardMultiple(Deck deck, int number) { - for (Participant player : players) { - player.drawCardMultiple(deck, number); + public void drawCardMultiple(int number) { + for (Participant participant : participants) { + participant.drawCardMultiple(deck, number); } } - public List getPlayers() { - return Collections.unmodifiableList(players); + public void drawCard(Participant participant) { + + } + + public void judgeScore(){ + int maxScore = calculateMaxScore(); + for(Participant participant : participants){ + participant.judgeScore(maxScore); + } + } + + private int calculateMaxScore(){ + return participants.stream() + .mapToInt(participant -> participant.sumCardScore()) + .max() + .orElseThrow(() -> { + throw new IllegalStateException("최대값을 구할 수 없습니다."); + }); + } + + public boolean isNext(){ + return targetIndex > participants.size(); + } + + public void nextTarget(){ + if(!isNext()) + return; + targetIndex ++; + } + + public Participant getTarget() { + return participants.get(targetIndex); + } + + public List getParticipants() { + return Collections.unmodifiableList(participants); } } diff --git a/src/main/java/blackjack/service/WinnerJudgement.java b/src/main/java/blackjack/service/WinnerJudgement.java deleted file mode 100644 index 98d8ddc2..00000000 --- a/src/main/java/blackjack/service/WinnerJudgement.java +++ /dev/null @@ -1,18 +0,0 @@ -package blackjack.service; - -import blackjack.domain.Participant; -import java.util.List; - -public class WinnerJudgement { - - public List judgementWInner(List participants) { - int max = participants.stream() - .mapToInt(participant -> participant.sumCardScore()) - .max() - .orElseThrow(() -> { - throw new IllegalStateException("최대값을 구할 수 없습니다."); - }); - - return null; - } -} From 44e3e299d26372c1ab35dec37c1504698ef2bb6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:40:29 +0900 Subject: [PATCH 30/39] =?UTF-8?q?feat:=20GameController=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 변경된 클래스에 맞게 코드 수정 --- .../blackjack/controller/GameController.java | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index e292c9b3..feb12a37 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -1,56 +1,40 @@ package blackjack.controller; -import blackjack.domain.Card.CardType; -import blackjack.domain.Card.CardValue; import blackjack.domain.Dealer; -import blackjack.domain.Deck; import blackjack.domain.Participant; +import blackjack.domain.Participants; import blackjack.domain.Players; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; import java.util.List; public class GameController { public Participant start() { - // 덱만들기 - List types = Arrays.asList(CardType.values()); - Collections.shuffle(types); - - List values = Arrays.asList(CardValue.values()); - Collections.shuffle(values); - - Deck deck = new Deck(types, values); - // 사용자 입력 List name = new ArrayList<>(); name.add("pobi"); name.add("jason"); + // Players 생성 + Players players = Players.from(name); + // 딜러 추가 - Participant dealer = new Dealer("dealer"); + Dealer dealer = new Dealer("dealer"); // 사용자 추가 - Players players = Players.from(name); + Participants participants = Participants.from(players, dealer); // 딜러 , 사용자 에게 카드 2장씩 분배 - dealer.drawCardMultiple(deck, 2); - players.drawCardMultiple(deck, 2); - - // 받은 카드 상태 출력 + participants.drawCardMultiple(2); // 사용자 1장씩 뽑기 - players.drawCardMultiple(deck, 1); - - // 딜러 1장 뽑기 - dealer.drawCardMultiple(deck, 1); + participants.drawCardMultiple(1); // 사용자별 카드 최종 상태 출력 - // 최종 승패 + participants.judgeScore(); + // 최종 승패 출력 - // 승자 반환 return null; } } From cb376236f9e1a86f1f8f18be6120a493db12191a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:40:58 +0900 Subject: [PATCH 31/39] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/ui/BlackjackInput.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/blackjack/ui/BlackjackInput.java diff --git a/src/main/java/blackjack/ui/BlackjackInput.java b/src/main/java/blackjack/ui/BlackjackInput.java new file mode 100644 index 00000000..9a5e553e --- /dev/null +++ b/src/main/java/blackjack/ui/BlackjackInput.java @@ -0,0 +1,5 @@ +package blackjack.ui; + +public class BlackjackInput { + +} From e6fd564c3a345b4aa487d89544e7f7e889ca9ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:42:10 +0900 Subject: [PATCH 32/39] =?UTF-8?q?feat:=20Test=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/CardTest.java | 68 +++++++++++++++++++ .../java/blackjack/domain/DealerTest.java | 53 +++++++++++++++ src/test/java/blackjack/domain/DeckTest.java | 60 ++++++++++++++++ .../java/blackjack/domain/PlayerTest.java | 53 +++++++++++++++ 4 files changed, 234 insertions(+) create mode 100644 src/test/java/blackjack/domain/CardTest.java create mode 100644 src/test/java/blackjack/domain/DealerTest.java create mode 100644 src/test/java/blackjack/domain/DeckTest.java create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java new file mode 100644 index 00000000..44feda9d --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,68 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class CardTest { + + @DisplayName("cardValue 가 같은지 확인") + @Test + void cardValueEqual() { + // given + Card card1 = new Card(CardType.SPADE, CardValue.KING); + Card card2 = new Card(CardType.CLOVER, CardValue.KING); + + // when + boolean result = card1.getCardValue().isEqualCardValue(card2); + + // then + assertThat(result).isEqualTo(true); + } + + @DisplayName("일반카드 점수 확인") + @Test + void normalCardScore() { + // given + Card card = new Card(CardType.SPADE, CardValue.KING); + + // when + int result = card.getScore(0); + + // then + assertThat(result).isEqualTo(10); + } + + @DisplayName("에이스 점수가 1이 되는 경우") + @ValueSource(ints = {15, 18, 20}) + @ParameterizedTest + void aceCardScoreIsOne(final int currentScore) { + // given + Card card = new Card(CardType.SPADE, CardValue.ACE); + + // when + int result = card.getScore(currentScore); + + // then + assertThat(result).isEqualTo(1); + } + + @DisplayName("에이스 점수가 1이 되는 경우") + @ValueSource(ints = {0, 5, 14}) + @ParameterizedTest + void aceCardScoreIsEleven(final int currentScore) { + // given + Card card = new Card(CardType.SPADE, CardValue.ACE); + + // when + int result = card.getScore(currentScore); + + // then + assertThat(result).isEqualTo(11); + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 00000000..35f335ba --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,53 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class DealerTest { + + @DisplayName("현재 딜러의 카드 점수가 17 을 넘을 때 카드 뽑기") + @Test + void dealerDrawCardWhenSumCardScoreOver17() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.KING, CardValue.KING, CardValue.KING); + Deck deck = new Deck(types, values); + + Participant dealer = new Dealer("dealer"); + dealer.drawCardMultiple(deck, 1); + dealer.drawCardMultiple(deck, 1); + dealer.drawCardMultiple(deck, 1); + + // when + int result = dealer.sumCardScore(); + + // then + assertThat(result).isEqualTo(20); + } + + @DisplayName("현재 딜러의 카드 점수가 17 이하 일 때 카드 뽑기") + @Test + void dealerDrawCardWhenSumCardScoreUnder17() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.THREE, CardValue.FOUR, CardValue.KING); + Deck deck = new Deck(types, values); + + Participant dealer = new Dealer("dealer"); + dealer.drawCardMultiple(deck, 1); + dealer.drawCardMultiple(deck, 1); + dealer.drawCardMultiple(deck, 1); + + // when + int result = dealer.sumCardScore(); + + // then + assertThat(result).isEqualTo(17); + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java new file mode 100644 index 00000000..bfad91a7 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,60 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayDeque; +import java.util.Deque; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +class DeckTest { + @DisplayName("덱이 생성 됐는지 확인") + @Test + void deckCreated() { + // given + List types = Arrays.asList(CardType.values()); + List values = Arrays.asList(CardValue.values()); + Deck deck = new Deck(types, values); + + // when + Deque deckTmp = new ArrayDeque<>(); + deckTmp.addAll(deck.drawMultiple(52)); + + // then + for(int i = 0; i < deckTmp.size() ; i++) { + CardValue deckCardValue = values.get(i % values.size()); + Card deckTmpCard = deckTmp.pop(); + assertThat(deckCardValue.isEqualCardValue(deckTmpCard)); + } + } + + @DisplayName("덱이 섞였는지 확인") + @Test + void shuffledDeckCreated() { + // given + List types = Arrays.asList(CardType.values()); + Collections.shuffle(types); + + List values = Arrays.asList(CardValue.values()); + Collections.shuffle(values); + + Deck deck = new Deck(types, values); + + // when + Deque deckTmp = new ArrayDeque<>(); + deckTmp.addAll(deck.drawMultiple(52)); + + // then + for(int i = 0; i < deckTmp.size() ; i++) { + CardValue deckCardValue = values.get(i % values.size()); + Card deckTmpCard = deckTmp.pop(); + assertThat(deckCardValue.isEqualCardValue(deckTmpCard)); + } + } +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 00000000..96ab1330 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,53 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Card.CardType; +import blackjack.domain.Card.CardValue; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PlayerTest { + @DisplayName("현재 플레이어 카드 뽑고 점수 더하기 (에이스 없음)") + @Test + void playerDrawCardWithoutAce() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.TWO, CardValue.THREE, CardValue.KING); + Deck deck = new Deck(types, values); + + Participant player = new Player("player"); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + + // when + int result = player.sumCardScore(); + + // then + assertThat(result).isEqualTo(15); + } + + @DisplayName("현재 플레이어 카드 뽑고 점수 더하기 (에이스 있음)") + @Test + void playerDrawCardWithAce() { + // given + List types = Arrays.asList(CardType.CLOVER); + List values = Arrays.asList(CardValue.TWO, CardValue.THREE, CardValue.ACE, CardValue.ACE); + Deck deck = new Deck(types, values); + + Participant player = new Player("player"); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + player.drawCardMultiple(deck, 1); + + // when + int result = player.sumCardScore(); + + // then + assertThat(result).isEqualTo(17); + } +} \ No newline at end of file From 4a89e460d29c815f808f1b7b39cc7876b15c7f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:42:27 +0900 Subject: [PATCH 33/39] =?UTF-8?q?feat:=20=EB=94=9C=EB=9F=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=99=B8=ED=95=9C=20=EC=B0=B8=EA=B0=80=EC=9E=90?= =?UTF-8?q?=EB=93=A4=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 25 +++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/blackjack/domain/Players.java diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java new file mode 100644 index 00000000..0dc94018 --- /dev/null +++ b/src/main/java/blackjack/domain/Players.java @@ -0,0 +1,25 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Players { + + private final List players; + + private Players(List players) { + this.players = new ArrayList<>(players); + } + + public static Players from(final List names) { + return new Players(names.stream() + .map(Player::new) + .collect(Collectors.toList())); + } + + public List getPlayers() { + return Collections.unmodifiableList(players); + } +} From d175ab616d961d636232164f0e92ac299392f796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=95=9C=EC=8A=B9=EC=A7=84?= Date: Thu, 17 Feb 2022 18:42:50 +0900 Subject: [PATCH 34/39] =?UTF-8?q?feat:=20=EC=9A=B0=EC=8A=B9=EC=9E=90=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Winners.java | 44 +++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/blackjack/domain/Winners.java diff --git a/src/main/java/blackjack/domain/Winners.java b/src/main/java/blackjack/domain/Winners.java new file mode 100644 index 00000000..3573cb56 --- /dev/null +++ b/src/main/java/blackjack/domain/Winners.java @@ -0,0 +1,44 @@ +package blackjack.domain; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class Winners { + + private final List winners; + + private Winners(List participants) { + List winners = filterWinner(participants); + this.winners = new ArrayList<>(participants); + } + + public static Winners of(Dealer dealer, Participants players) { + List participants = new ArrayList<>(); + participants.add(dealer); + participants.addAll(players.getParticipants()); + return new Winners(participants); + } + + private List filterWinner(List participants) { + final int maxScore = calculateMaxScore(participants); + + return participants.stream() + .filter(participant -> participant.sumCardScore() == maxScore) + .collect(Collectors.toList()); + } + + private int calculateMaxScore(List participants){ + return participants.stream() + .mapToInt(participant -> participant.sumCardScore()) + .max() + .orElseThrow(() -> { + throw new IllegalStateException("최대값을 구할 수 없습니다."); + }); + } + + public List getWinners() { + return Collections.unmodifiableList(winners); + } +} From fedd5d8d85dbf3d8e008fe3041a7c1abbad45574 Mon Sep 17 00:00:00 2001 From: hscom96 Date: Fri, 18 Feb 2022 03:03:27 +0900 Subject: [PATCH 35/39] =?UTF-8?q?feat:=20GameController=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/Application.java | 11 ++++ .../blackjack/controller/GameController.java | 60 ++++++++++++------- src/main/java/blackjack/domain/Card.java | 2 +- .../java/blackjack/domain/Participant.java | 17 ++++-- .../blackjack/domain/ParticipantCards.java | 2 +- .../java/blackjack/domain/Participants.java | 20 ------- src/main/java/blackjack/domain/Players.java | 23 +++++++ .../java/blackjack/ui/BlackjackInput.java | 17 ++++++ .../java/blackjack/ui/BlackjackOutput.java | 10 ++++ src/test/java/blackjack/domain/CardTest.java | 8 +-- 10 files changed, 119 insertions(+), 51 deletions(-) create mode 100644 src/main/java/blackjack/Application.java create mode 100644 src/main/java/blackjack/ui/BlackjackOutput.java diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java new file mode 100644 index 00000000..97abce7f --- /dev/null +++ b/src/main/java/blackjack/Application.java @@ -0,0 +1,11 @@ +package blackjack; + +import blackjack.controller.GameController; + +public class Application { + + public static void main(String[] args) { + GameController gameController = new GameController(); + gameController.start(); + } +} diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index feb12a37..a40ec90b 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -1,40 +1,58 @@ package blackjack.controller; import blackjack.domain.Dealer; +import blackjack.domain.Deck; import blackjack.domain.Participant; -import blackjack.domain.Participants; +import blackjack.domain.Player; import blackjack.domain.Players; -import java.util.ArrayList; -import java.util.List; +import blackjack.ui.BlackjackInput; +import blackjack.ui.BlackjackOutput; public class GameController { + private static final String DEALER_NAME = "dealer"; + private static final int PLAYER_DRAW_SIZE = 1; + private static final int DEALER_DRAW_SIZE = 1; + private static final int FIRST_DRAW_SIZE = 2; + public Participant start() { - // 사용자 입력 - List name = new ArrayList<>(); - name.add("pobi"); - name.add("jason"); + Deck deck = Deck.create(); - // Players 생성 - Players players = Players.from(name); + // Players & 딜러 생성 -> 사용자 추가 + Players players = BlackjackInput.inputPlayerName(); + Dealer dealer = new Dealer(DEALER_NAME); - // 딜러 추가 - Dealer dealer = new Dealer("dealer"); + drawCardInit(deck, players, dealer); + drawCardMax(deck, players, dealer); - // 사용자 추가 - Participants participants = Participants.from(players, dealer); + // 사용자별 카드 최종 상태 출력 + // 최종 승패 출력 - // 딜러 , 사용자 에게 카드 2장씩 분배 - participants.drawCardMultiple(2); + return null; + } - // 사용자 1장씩 뽑기 - participants.drawCardMultiple(1); + private void drawCardInit(Deck deck, Players players, Dealer dealer) { + players.drawCardMultiple(deck, FIRST_DRAW_SIZE); + dealer.drawCardMultiple(deck, FIRST_DRAW_SIZE); + } - // 사용자별 카드 최종 상태 출력 + private void drawCardMax(Deck deck, Players players, Dealer dealer) { + drawPlayersCard(deck, players, PLAYER_DRAW_SIZE); + dealer.drawCardMultiple(deck, DEALER_DRAW_SIZE); + } - participants.judgeScore(); - // 최종 승패 출력 + private void drawPlayersCard(Deck deck, Players players, int size) { + if(players.isTargetAvailable()){ + return; + } - return null; + Player player = players.getTarget(); + while (BlackjackInput.inputPlayerDraw()) { + player.drawCardMultiple(deck, size); + BlackjackOutput.printPlayerCard(player); + } + + players.nextTargetIndex(); + drawPlayersCard(deck, players, size); } } diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index cd5940c3..09b67cfa 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -12,7 +12,7 @@ public class Card { this.cardValue = cardValue; } - public int getScore(int currentScore) { + public int calculateScore(int currentScore) { return this.cardValue.intUnaryOperator.applyAsInt(currentScore); } diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index f3634c3c..fe4a9a2e 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -2,20 +2,21 @@ import java.util.ArrayList; -abstract public class Participant { +public abstract class Participant { protected final String name; protected final ParticipantCards cards; - protected int winScore, loseScore; + protected int winScore; + protected int loseScore; - public Participant(String name, ParticipantCards cards, int winCount, int loseCount) { + Participant(String name, ParticipantCards cards, int winCount, int loseCount) { this.name = name; this.cards = cards; this.winScore = winCount; this.loseScore = loseCount; } - public Participant(String name) { + Participant(String name) { this(name, new ParticipantCards(new ArrayList<>()), 0, 0); } @@ -32,4 +33,12 @@ public final int sumCardScore() { } public abstract void drawCardMultiple(Deck deck, int number); + + public final String getName() { + return name; + } + + public final ParticipantCards getCards() { + return cards; + } } diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java index c5d42a9d..a7935e9c 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -18,7 +18,7 @@ public void addCards(List drawCards) { public int sumCardScore() { return cards.stream() - .reduce(0, (x, y) -> x + y.getScore(x), Integer::sum); + .reduce(0, (x, y) -> x + y.calculateScore(x), Integer::sum); } public List getCards() { diff --git a/src/main/java/blackjack/domain/Participants.java b/src/main/java/blackjack/domain/Participants.java index c6f2a4ef..9841cd04 100644 --- a/src/main/java/blackjack/domain/Participants.java +++ b/src/main/java/blackjack/domain/Participants.java @@ -8,12 +8,10 @@ public class Participants { private final List participants; private final Deck deck; - private int targetIndex; private Participants(List participants) { this.deck = Deck.create(); this.participants = new ArrayList<>(participants); - this.targetIndex = 0; } public static Participants from(Players players, Dealer dealer) { @@ -28,10 +26,6 @@ public void drawCardMultiple(int number) { } } - public void drawCard(Participant participant) { - - } - public void judgeScore(){ int maxScore = calculateMaxScore(); for(Participant participant : participants){ @@ -48,20 +42,6 @@ private int calculateMaxScore(){ }); } - public boolean isNext(){ - return targetIndex > participants.size(); - } - - public void nextTarget(){ - if(!isNext()) - return; - targetIndex ++; - } - - public Participant getTarget() { - return participants.get(targetIndex); - } - public List getParticipants() { return Collections.unmodifiableList(participants); } diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 0dc94018..cc7d4b61 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -9,8 +9,11 @@ public class Players { private final List players; + private int targetIndex; + private Players(List players) { this.players = new ArrayList<>(players); + this.targetIndex = 0; } public static Players from(final List names) { @@ -19,6 +22,26 @@ public static Players from(final List names) { .collect(Collectors.toList())); } + public void drawCardMultiple(Deck deck, int number) { + for (Player player : players) { + player.drawCardMultiple(deck, number); + } + } + + public boolean isTargetAvailable(){ + return targetIndex <= players.size() - 1; + } + + public void nextTargetIndex(){ + if(!isTargetAvailable()) + return; + targetIndex ++; + } + + public Player getTarget() { + return players.get(targetIndex); + } + public List getPlayers() { return Collections.unmodifiableList(players); } diff --git a/src/main/java/blackjack/ui/BlackjackInput.java b/src/main/java/blackjack/ui/BlackjackInput.java index 9a5e553e..1c4d01ea 100644 --- a/src/main/java/blackjack/ui/BlackjackInput.java +++ b/src/main/java/blackjack/ui/BlackjackInput.java @@ -1,5 +1,22 @@ package blackjack.ui; +import blackjack.domain.Players; +import java.util.Arrays; +import java.util.Scanner; + public class BlackjackInput { + private static final Scanner SCANNER = new Scanner(System.in); + + public static boolean inputPlayerDraw(){ + System.out.println("한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"); + String input = SCANNER.next(); + return input.equals("y"); + } + + public static Players inputPlayerName(){ + System.out.println("게임에 참여할 사람의 이름을 입력하세요. (쉼표 기준으로 분리)"); + String input = SCANNER.next(); + return Players.from(Arrays.asList(input.split(","))); + } } diff --git a/src/main/java/blackjack/ui/BlackjackOutput.java b/src/main/java/blackjack/ui/BlackjackOutput.java new file mode 100644 index 00000000..6f375ab5 --- /dev/null +++ b/src/main/java/blackjack/ui/BlackjackOutput.java @@ -0,0 +1,10 @@ +package blackjack.ui; + +import blackjack.domain.Player; + +public class BlackjackOutput { + + public static void printPlayerCard(Player player){ + System.out.println(player.getName() + "카드: "); + } +} diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index 44feda9d..91f74159 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -32,7 +32,7 @@ void normalCardScore() { Card card = new Card(CardType.SPADE, CardValue.KING); // when - int result = card.getScore(0); + int result = card.calculateScore(0); // then assertThat(result).isEqualTo(10); @@ -46,7 +46,7 @@ void aceCardScoreIsOne(final int currentScore) { Card card = new Card(CardType.SPADE, CardValue.ACE); // when - int result = card.getScore(currentScore); + int result = card.calculateScore(currentScore); // then assertThat(result).isEqualTo(1); @@ -60,9 +60,9 @@ void aceCardScoreIsEleven(final int currentScore) { Card card = new Card(CardType.SPADE, CardValue.ACE); // when - int result = card.getScore(currentScore); + int result = card.calculateScore(currentScore); // then assertThat(result).isEqualTo(11); } -} \ No newline at end of file +} From 35608f329a860c13be867104a2f525c3db3b3c05 Mon Sep 17 00:00:00 2001 From: hscom96 Date: Fri, 18 Feb 2022 03:43:45 +0900 Subject: [PATCH 36/39] =?UTF-8?q?feat:=20GameController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EB=B3=84=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/controller/GameController.java | 22 ++++---- src/main/java/blackjack/domain/Card.java | 22 ++++++-- .../{ParticipantCards.java => Cards.java} | 4 +- .../{Participants.java => GameResult.java} | 28 ++++------ .../java/blackjack/domain/Participant.java | 16 ++++-- src/main/java/blackjack/domain/Winners.java | 44 --------------- .../java/blackjack/ui/BlackjackOutput.java | 55 ++++++++++++++++++- .../domain/ParticipantCardsTest.java | 6 +- 8 files changed, 111 insertions(+), 86 deletions(-) rename src/main/java/blackjack/domain/{ParticipantCards.java => Cards.java} (86%) rename src/main/java/blackjack/domain/{Participants.java => GameResult.java} (50%) delete mode 100644 src/main/java/blackjack/domain/Winners.java diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index a40ec90b..927bb358 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -2,7 +2,7 @@ import blackjack.domain.Dealer; import blackjack.domain.Deck; -import blackjack.domain.Participant; +import blackjack.domain.GameResult; import blackjack.domain.Player; import blackjack.domain.Players; import blackjack.ui.BlackjackInput; @@ -15,41 +15,43 @@ public class GameController { private static final int DEALER_DRAW_SIZE = 1; private static final int FIRST_DRAW_SIZE = 2; - public Participant start() { + public void start() { Deck deck = Deck.create(); - // Players & 딜러 생성 -> 사용자 추가 Players players = BlackjackInput.inputPlayerName(); Dealer dealer = new Dealer(DEALER_NAME); drawCardInit(deck, players, dealer); - drawCardMax(deck, players, dealer); - // 사용자별 카드 최종 상태 출력 - // 최종 승패 출력 + drawCardFinal(deck, players, dealer); - return null; + BlackjackOutput.printFinalResult(GameResult.of(dealer, players)); } private void drawCardInit(Deck deck, Players players, Dealer dealer) { + BlackjackOutput.printDrawCard(players); players.drawCardMultiple(deck, FIRST_DRAW_SIZE); dealer.drawCardMultiple(deck, FIRST_DRAW_SIZE); + BlackjackOutput.printAllCard(players, dealer); + } - private void drawCardMax(Deck deck, Players players, Dealer dealer) { + private void drawCardFinal(Deck deck, Players players, Dealer dealer) { drawPlayersCard(deck, players, PLAYER_DRAW_SIZE); dealer.drawCardMultiple(deck, DEALER_DRAW_SIZE); + + BlackjackOutput.printAllCard(players, dealer); } private void drawPlayersCard(Deck deck, Players players, int size) { - if(players.isTargetAvailable()){ + if (players.isTargetAvailable()) { return; } Player player = players.getTarget(); while (BlackjackInput.inputPlayerDraw()) { player.drawCardMultiple(deck, size); - BlackjackOutput.printPlayerCard(player); + BlackjackOutput.printParticipantCard(player); } players.nextTargetIndex(); diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 09b67cfa..f3eaef4e 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -20,11 +20,25 @@ public CardValue getCardValue() { return cardValue; } + public String getCardTypeName() { + return cardType.name; + } + + public String getNumber(){ + return cardValue.number; + } + public enum CardType { - SPADE, - CLOVER, - HEART, - DIAMOND + SPADE("스페이드"), + CLOVER("클로버"), + HEART("하트"), + DIAMOND("다이아몬드"); + + private final String name; + + CardType(String name) { + this.name = name; + } } public enum CardValue { diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/Cards.java similarity index 86% rename from src/main/java/blackjack/domain/ParticipantCards.java rename to src/main/java/blackjack/domain/Cards.java index a7935e9c..323238fb 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -4,11 +4,11 @@ import java.util.Collections; import java.util.List; -public class ParticipantCards { +public class Cards { private final List cards; - public ParticipantCards(List cards) { + public Cards(List cards) { this.cards = new ArrayList<>(cards); } diff --git a/src/main/java/blackjack/domain/Participants.java b/src/main/java/blackjack/domain/GameResult.java similarity index 50% rename from src/main/java/blackjack/domain/Participants.java rename to src/main/java/blackjack/domain/GameResult.java index 9841cd04..64a48e97 100644 --- a/src/main/java/blackjack/domain/Participants.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -4,36 +4,30 @@ import java.util.Collections; import java.util.List; -public class Participants { +public class GameResult { private final List participants; - private final Deck deck; - private Participants(List participants) { - this.deck = Deck.create(); + private GameResult(List participants) { + calculateGameResult(participants); this.participants = new ArrayList<>(participants); } - public static Participants from(Players players, Dealer dealer) { - List participants = new ArrayList<>(players.getPlayers()); + public static GameResult of(Dealer dealer, Players players) { + List participants = new ArrayList<>(); participants.add(dealer); - return new Participants(participants); + participants.addAll(players.getPlayers()); + return new GameResult(participants); } - public void drawCardMultiple(int number) { - for (Participant participant : participants) { - participant.drawCardMultiple(deck, number); - } - } - - public void judgeScore(){ - int maxScore = calculateMaxScore(); - for(Participant participant : participants){ + private void calculateGameResult(List participants) { + int maxScore = calculateMaxScore(participants); + for(Participant participant: participants){ participant.judgeScore(maxScore); } } - private int calculateMaxScore(){ + private int calculateMaxScore(List participants){ return participants.stream() .mapToInt(participant -> participant.sumCardScore()) .max() diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index fe4a9a2e..392adf67 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -5,11 +5,11 @@ public abstract class Participant { protected final String name; - protected final ParticipantCards cards; + protected final Cards cards; protected int winScore; protected int loseScore; - Participant(String name, ParticipantCards cards, int winCount, int loseCount) { + Participant(String name, Cards cards, int winCount, int loseCount) { this.name = name; this.cards = cards; this.winScore = winCount; @@ -17,7 +17,7 @@ public abstract class Participant { } Participant(String name) { - this(name, new ParticipantCards(new ArrayList<>()), 0, 0); + this(name, new Cards(new ArrayList<>()), 0, 0); } public final void judgeScore(int maxScore) { @@ -38,7 +38,15 @@ public final String getName() { return name; } - public final ParticipantCards getCards() { + public final Cards getCards() { return cards; } + + public int getWinScore() { + return winScore; + } + + public int getLoseScore() { + return loseScore; + } } diff --git a/src/main/java/blackjack/domain/Winners.java b/src/main/java/blackjack/domain/Winners.java deleted file mode 100644 index 3573cb56..00000000 --- a/src/main/java/blackjack/domain/Winners.java +++ /dev/null @@ -1,44 +0,0 @@ -package blackjack.domain; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -public class Winners { - - private final List winners; - - private Winners(List participants) { - List winners = filterWinner(participants); - this.winners = new ArrayList<>(participants); - } - - public static Winners of(Dealer dealer, Participants players) { - List participants = new ArrayList<>(); - participants.add(dealer); - participants.addAll(players.getParticipants()); - return new Winners(participants); - } - - private List filterWinner(List participants) { - final int maxScore = calculateMaxScore(participants); - - return participants.stream() - .filter(participant -> participant.sumCardScore() == maxScore) - .collect(Collectors.toList()); - } - - private int calculateMaxScore(List participants){ - return participants.stream() - .mapToInt(participant -> participant.sumCardScore()) - .max() - .orElseThrow(() -> { - throw new IllegalStateException("최대값을 구할 수 없습니다."); - }); - } - - public List getWinners() { - return Collections.unmodifiableList(winners); - } -} diff --git a/src/main/java/blackjack/ui/BlackjackOutput.java b/src/main/java/blackjack/ui/BlackjackOutput.java index 6f375ab5..fa028fe6 100644 --- a/src/main/java/blackjack/ui/BlackjackOutput.java +++ b/src/main/java/blackjack/ui/BlackjackOutput.java @@ -1,10 +1,61 @@ package blackjack.ui; +import blackjack.domain.Dealer; +import blackjack.domain.GameResult; +import blackjack.domain.Participant; import blackjack.domain.Player; +import blackjack.domain.Players; +import java.util.stream.Collectors; public class BlackjackOutput { - public static void printPlayerCard(Player player){ - System.out.println(player.getName() + "카드: "); + private static final String COMMA = ", "; + private static final String DEALER_NAME = "딜러와 "; + private static final String ENTER = "\n"; + + public static void printDrawCard(Players players) { + String playerName = players.getPlayers().stream() + .map(Player::getName) + .collect(Collectors.joining(COMMA)); + + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder + .append(DEALER_NAME) + .append(playerName) + .append("에게 2장을 나누었습니다."); + System.out.println(stringBuilder); + } + + public static void printAllCard(Players players, Dealer dealer){ + players.getPlayers().stream() + .forEach(BlackjackOutput::printParticipantCard); + printParticipantCard(dealer); + System.out.println(ENTER); + } + + public static void printParticipantCard(Participant player) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder + .append(player.getName()) + .append("카드: ") + .append(getCardStatus(player)); + System.out.println(stringBuilder); + } + + private static String getCardStatus(Participant player){ + return player + .getCards() + .getCards() + .stream() + .map(card -> card.getNumber() + card.getCardTypeName()) + .collect(Collectors.joining(COMMA)); + } + + public static void printFinalResult(GameResult gameResult){ + System.out.println("## 최종승패"); + String result = gameResult.getParticipants().stream() + .map(participant -> participant.getName()+": "+participant.getWinScore()+"승 "+participant.getLoseScore()+"패") + .collect(Collectors.joining(ENTER)); + System.out.println(result); } } diff --git a/src/test/java/blackjack/domain/ParticipantCardsTest.java b/src/test/java/blackjack/domain/ParticipantCardsTest.java index d3f0d195..3aeda681 100644 --- a/src/test/java/blackjack/domain/ParticipantCardsTest.java +++ b/src/test/java/blackjack/domain/ParticipantCardsTest.java @@ -17,7 +17,7 @@ class ParticipantCardsTest { cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); cards.add(new Card(CardType.CLOVER, CardValue.ACE)); cards.add(new Card(CardType.CLOVER, CardValue.TWO)); - ParticipantCards participantCards = new ParticipantCards(cards); + Cards participantCards = new Cards(cards); int score = participantCards.sumCardScore(); @@ -30,7 +30,7 @@ class ParticipantCardsTest { List cards = new ArrayList<>(); cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); cards.add(new Card(CardType.CLOVER, CardValue.TWO)); - ParticipantCards participantCards = new ParticipantCards(cards); + Cards participantCards = new Cards(cards); int score = participantCards.sumCardScore(); @@ -46,7 +46,7 @@ class ParticipantCardsTest { cards.add(new Card(CardType.CLOVER, CardValue.FIVE)); cards.add(new Card(CardType.CLOVER, CardValue.ACE)); cards.add(new Card(CardType.CLOVER, CardValue.TWO)); - ParticipantCards participantCards = new ParticipantCards(cards); + Cards participantCards = new Cards(cards); int score = participantCards.sumCardScore(); From d6f71b8f069ce77045ab0896a97e62fe6e3b54da Mon Sep 17 00:00:00 2001 From: hscom96 Date: Fri, 18 Feb 2022 09:36:00 +0900 Subject: [PATCH 37/39] =?UTF-8?q?fix:=20=EC=B6=94=EA=B0=80=20=EB=BD=91?= =?UTF-8?q?=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/controller/GameController.java | 4 ++-- src/main/java/blackjack/ui/BlackjackInput.java | 5 +++-- src/main/java/blackjack/ui/BlackjackOutput.java | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index 927bb358..94624cb1 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -44,12 +44,12 @@ private void drawCardFinal(Deck deck, Players players, Dealer dealer) { } private void drawPlayersCard(Deck deck, Players players, int size) { - if (players.isTargetAvailable()) { + if (!players.isTargetAvailable()) { return; } Player player = players.getTarget(); - while (BlackjackInput.inputPlayerDraw()) { + while (BlackjackInput.inputPlayerDraw(player)) { player.drawCardMultiple(deck, size); BlackjackOutput.printParticipantCard(player); } diff --git a/src/main/java/blackjack/ui/BlackjackInput.java b/src/main/java/blackjack/ui/BlackjackInput.java index 1c4d01ea..d79e7298 100644 --- a/src/main/java/blackjack/ui/BlackjackInput.java +++ b/src/main/java/blackjack/ui/BlackjackInput.java @@ -1,5 +1,6 @@ package blackjack.ui; +import blackjack.domain.Participant; import blackjack.domain.Players; import java.util.Arrays; import java.util.Scanner; @@ -8,8 +9,8 @@ public class BlackjackInput { private static final Scanner SCANNER = new Scanner(System.in); - public static boolean inputPlayerDraw(){ - System.out.println("한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"); + public static boolean inputPlayerDraw(Participant participant){ + System.out.println(participant.getName() + "는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"); String input = SCANNER.next(); return input.equals("y"); } diff --git a/src/main/java/blackjack/ui/BlackjackOutput.java b/src/main/java/blackjack/ui/BlackjackOutput.java index fa028fe6..4661aecd 100644 --- a/src/main/java/blackjack/ui/BlackjackOutput.java +++ b/src/main/java/blackjack/ui/BlackjackOutput.java @@ -51,6 +51,7 @@ private static String getCardStatus(Participant player){ .collect(Collectors.joining(COMMA)); } + public static void printFinalResult(GameResult gameResult){ System.out.println("## 최종승패"); String result = gameResult.getParticipants().stream() From 18eaeaf6430004ef2c212f8b73680c1765fd6cbd Mon Sep 17 00:00:00 2001 From: hscom96 Date: Fri, 18 Feb 2022 18:29:10 +0900 Subject: [PATCH 38/39] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=B4=9D?= =?UTF-8?q?=ED=95=A9=20=EC=B6=9C=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/controller/GameController.java | 7 ++++-- src/main/java/blackjack/domain/Dealer.java | 5 +++-- .../java/blackjack/domain/GameResult.java | 2 +- .../java/blackjack/domain/Participant.java | 2 +- src/main/java/blackjack/domain/Player.java | 3 ++- .../java/blackjack/ui/BlackjackOutput.java | 22 +++++++++++++++++++ 6 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index 94624cb1..6672720a 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -38,9 +38,12 @@ private void drawCardInit(Deck deck, Players players, Dealer dealer) { private void drawCardFinal(Deck deck, Players players, Dealer dealer) { drawPlayersCard(deck, players, PLAYER_DRAW_SIZE); - dealer.drawCardMultiple(deck, DEALER_DRAW_SIZE); + boolean isDraw = dealer.drawCardMultiple(deck, DEALER_DRAW_SIZE); + if(isDraw){ + BlackjackOutput.printDealerDraw(); + } - BlackjackOutput.printAllCard(players, dealer); + BlackjackOutput.printAllCardWithSum(players, dealer); } private void drawPlayersCard(Deck deck, Players players, int size) { diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 89478064..763bc9a7 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -7,10 +7,11 @@ public Dealer(String name) { } @Override - public void drawCardMultiple(Deck deck, int number) { + public boolean drawCardMultiple(Deck deck, int number) { if(cards.sumCardScore() > 17) { - return; + return false; } cards.addCards(deck.drawMultiple(number)); + return true; } } diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java index 64a48e97..f4048259 100644 --- a/src/main/java/blackjack/domain/GameResult.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -29,7 +29,7 @@ private void calculateGameResult(List participants) { private int calculateMaxScore(List participants){ return participants.stream() - .mapToInt(participant -> participant.sumCardScore()) + .mapToInt(Participant::sumCardScore) .max() .orElseThrow(() -> { throw new IllegalStateException("최대값을 구할 수 없습니다."); diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index 392adf67..9701cd2d 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -32,7 +32,7 @@ public final int sumCardScore() { return cards.sumCardScore(); } - public abstract void drawCardMultiple(Deck deck, int number); + public abstract boolean drawCardMultiple(Deck deck, int number); public final String getName() { return name; diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index bd2fd246..04dee1fc 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -8,7 +8,8 @@ public Player(String name) { } @Override - public void drawCardMultiple(Deck deck, int number) { + public boolean drawCardMultiple(Deck deck, int number) { cards.addCards(deck.drawMultiple(number)); + return true; } } diff --git a/src/main/java/blackjack/ui/BlackjackOutput.java b/src/main/java/blackjack/ui/BlackjackOutput.java index 4661aecd..45cf34d2 100644 --- a/src/main/java/blackjack/ui/BlackjackOutput.java +++ b/src/main/java/blackjack/ui/BlackjackOutput.java @@ -12,6 +12,7 @@ public class BlackjackOutput { private static final String COMMA = ", "; private static final String DEALER_NAME = "딜러와 "; private static final String ENTER = "\n"; + private static final String DEALER_DRAW = "딜러는 16이하라 한장의 카드를 더 받았습니다."; public static void printDrawCard(Players players) { String playerName = players.getPlayers().stream() @@ -42,6 +43,24 @@ public static void printParticipantCard(Participant player) { System.out.println(stringBuilder); } + public static void printAllCardWithSum(Players players, Dealer dealer){ + players.getPlayers().stream() + .forEach(BlackjackOutput::printParticipantCardWithSum); + printParticipantCardWithSum(dealer); + System.out.println(ENTER); + } + + public static void printParticipantCardWithSum(Participant player) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder + .append(player.getName()) + .append("카드: ") + .append(getCardStatus(player)) + .append(" - 결과: ") + .append(player.sumCardScore()); + System.out.println(stringBuilder); + } + private static String getCardStatus(Participant player){ return player .getCards() @@ -51,6 +70,9 @@ private static String getCardStatus(Participant player){ .collect(Collectors.joining(COMMA)); } + public static void printDealerDraw() { + System.out.println(DEALER_DRAW + ENTER); + } public static void printFinalResult(GameResult gameResult){ System.out.println("## 최종승패"); From 56cc1e7a17ca274d584db375216a1f28e5f563cd Mon Sep 17 00:00:00 2001 From: hscom96 Date: Sun, 20 Feb 2022 02:29:01 +0900 Subject: [PATCH 39/39] =?UTF-8?q?fix:=20=EA=B2=8C=EC=9E=84=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B3=84=EC=82=B0=EB=A1=9C=EC=A7=81=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/GameResult.java | 13 ++++++++----- src/main/java/blackjack/domain/Participant.java | 7 +++++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java index f4048259..101a87aa 100644 --- a/src/main/java/blackjack/domain/GameResult.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -6,11 +6,13 @@ public class GameResult { + private static final int SCORE_CRITERIA = 21; + private final List participants; private GameResult(List participants) { - calculateGameResult(participants); this.participants = new ArrayList<>(participants); + calculateGameResult(this.participants); } public static GameResult of(Dealer dealer, Players players) { @@ -21,16 +23,17 @@ public static GameResult of(Dealer dealer, Players players) { } private void calculateGameResult(List participants) { - int maxScore = calculateMaxScore(participants); + int criteria = calculateCriteria(participants); for(Participant participant: participants){ - participant.judgeScore(maxScore); + participant.judgeScore(criteria); } } - private int calculateMaxScore(List participants){ + private int calculateCriteria(List participants){ return participants.stream() .mapToInt(Participant::sumCardScore) - .max() + .map(score-> Math.abs(score - SCORE_CRITERIA)) + .min() .orElseThrow(() -> { throw new IllegalStateException("최대값을 구할 수 없습니다."); }); diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index 9701cd2d..de29f01d 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -4,6 +4,8 @@ public abstract class Participant { + private static final int SCORE_CRITERIA = 21; + protected final String name; protected final Cards cards; protected int winScore; @@ -20,8 +22,9 @@ public abstract class Participant { this(name, new Cards(new ArrayList<>()), 0, 0); } - public final void judgeScore(int maxScore) { - if(sumCardScore() == maxScore){ + public final void judgeScore(int crieriaScore) { + int userScore = sumCardScore() - SCORE_CRITERIA; + if (userScore == crieriaScore) { winScore++; return; }