From b9c43d87ddc39c40202b7c7fa31712ce40244d51 Mon Sep 17 00:00:00 2001 From: hyeonsu Date: Fri, 11 Feb 2022 16:07:30 +0900 Subject: [PATCH 01/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] 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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] 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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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/42] =?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 23ebdc649df8206222ca7d2371d0ea2a52e11d8c 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 22:26:16 +0900 Subject: [PATCH 35/42] =?UTF-8?q?feat:=20Card=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CardType enum에 이름 설정 - Card 정보를 반환하는 toString() 메서드 구현 --- src/main/java/blackjack/domain/Card.java | 20 ++++++--- src/main/java/blackjack/domain/Winners.java | 44 ------------------- .../InputView.java} | 0 3 files changed, 15 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/blackjack/domain/Winners.java rename src/main/java/blackjack/{ui/BlackjackInput.java => view/InputView.java} (100%) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index cd5940c3..d8edb292 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -20,11 +20,21 @@ public CardValue getCardValue() { return cardValue; } + public String toString() { + return cardValue.number + cardType.name; + } + public enum CardType { - SPADE, - CLOVER, - HEART, - DIAMOND + SPADE("스페이드"), + CLOVER("클로버"), + HEART("하트"), + DIAMOND("다이아몬드"); + + private final String name; + + CardType(String name) { + this.name = name; + } } public enum CardValue { @@ -50,7 +60,7 @@ public enum CardValue { this.intUnaryOperator = intUnaryOperator; } - public boolean isEqualCardValue(Card card){ + public boolean isEqualCardValue(Card card) { return this.equals(card.getCardValue()); } } 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/BlackjackInput.java b/src/main/java/blackjack/view/InputView.java similarity index 100% rename from src/main/java/blackjack/ui/BlackjackInput.java rename to src/main/java/blackjack/view/InputView.java From 37ccf9cdfceffb07233f90b352a5c60e304b533c 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 22:28:29 +0900 Subject: [PATCH 36/42] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=B0=B8?= =?UTF-8?q?=EA=B0=80=EC=9E=90=20=EA=B4=80=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 처음 2장씩뽑는경우, 1장씩 뽑는경우 나눠서 메서드 구현 - 정보를 반환하는 메서드 구현 - 승점을 계산하는 메서드 구현 --- src/main/java/blackjack/domain/Dealer.java | 17 ++++++-- .../java/blackjack/domain/Participant.java | 16 ++++++- .../blackjack/domain/ParticipantCards.java | 15 +++++++ .../java/blackjack/domain/Participants.java | 42 ++++++++++--------- src/main/java/blackjack/domain/Player.java | 21 +++++++++- 5 files changed, 86 insertions(+), 25 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 89478064..8e5aa70c 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,6 +1,6 @@ package blackjack.domain; -public class Dealer extends Participant{ +public class Dealer extends Participant { public Dealer(String name) { super(name); @@ -8,9 +8,20 @@ public Dealer(String name) { @Override public void drawCardMultiple(Deck deck, int number) { - if(cards.sumCardScore() > 17) { + cards.addCards(deck.drawMultiple(number)); + } + + @Override + public void drawCardContinue(Deck deck) { + if (cards.sumCardScore() > 17) { return; } - cards.addCards(deck.drawMultiple(number)); + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + cards.addCards(deck.drawMultiple(1)); + } + + @Override + public String scoreResult() { + return name + " : " + winScore + "승" + loseScore + "패"; } } diff --git a/src/main/java/blackjack/domain/Participant.java b/src/main/java/blackjack/domain/Participant.java index f3634c3c..8d6efe00 100644 --- a/src/main/java/blackjack/domain/Participant.java +++ b/src/main/java/blackjack/domain/Participant.java @@ -4,6 +4,8 @@ abstract public class Participant { + private static final String COLON = " : "; + protected final String name; protected final ParticipantCards cards; protected int winScore, loseScore; @@ -20,16 +22,28 @@ public Participant(String name) { } public final void judgeScore(int maxScore) { - if(sumCardScore() == maxScore){ + if (sumCardScore() == maxScore) { winScore++; return; } loseScore++; } + public final String getName() { + return name; + } + + public final String holdingInfo() { + return name + COLON + cards.toString(); + } + public final int sumCardScore() { return cards.sumCardScore(); } public abstract void drawCardMultiple(Deck deck, int number); + + public abstract void drawCardContinue(Deck deck); + + public abstract String scoreResult(); } diff --git a/src/main/java/blackjack/domain/ParticipantCards.java b/src/main/java/blackjack/domain/ParticipantCards.java index c5d42a9d..7b9b984c 100644 --- a/src/main/java/blackjack/domain/ParticipantCards.java +++ b/src/main/java/blackjack/domain/ParticipantCards.java @@ -6,6 +6,8 @@ public class ParticipantCards { + private static final String COMMA = ", "; + private final List cards; public ParticipantCards(List cards) { @@ -24,4 +26,17 @@ public int sumCardScore() { public List getCards() { return Collections.unmodifiableList(cards); } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < cards.size(); i++) { + sb.append(cards.get(i).toString()); + if (i != cards.size() - 1) { + sb.append(COMMA); + } + } + + return sb.toString(); + } } diff --git a/src/main/java/blackjack/domain/Participants.java b/src/main/java/blackjack/domain/Participants.java index c6f2a4ef..9c743383 100644 --- a/src/main/java/blackjack/domain/Participants.java +++ b/src/main/java/blackjack/domain/Participants.java @@ -6,19 +6,20 @@ public class Participants { + private static final String COMMA = ", "; + 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) { - List participants = new ArrayList<>(players.getPlayers()); + List participants = new ArrayList<>(); participants.add(dealer); + participants.addAll(players.getPlayers()); return new Participants(participants); } @@ -28,18 +29,20 @@ public void drawCardMultiple(int number) { } } - public void drawCard(Participant participant) { - + public void drawCardContinue(int number) { + for (Participant participant : participants) { + participant.drawCardContinue(deck); + } } - public void judgeScore(){ + public void judgeScore() { int maxScore = calculateMaxScore(); - for(Participant participant : participants){ + for (Participant participant : participants) { participant.judgeScore(maxScore); } } - private int calculateMaxScore(){ + private int calculateMaxScore() { return participants.stream() .mapToInt(participant -> participant.sumCardScore()) .max() @@ -48,21 +51,20 @@ private int calculateMaxScore(){ }); } - public boolean isNext(){ - return targetIndex > participants.size(); + public List getParticipants() { + return Collections.unmodifiableList(participants); } - public void nextTarget(){ - if(!isNext()) - return; - targetIndex ++; - } + public String participantsNames() { + StringBuilder sb = new StringBuilder(); - public Participant getTarget() { - return participants.get(targetIndex); - } + for (int i = 0; i < participants.size(); i++) { + sb.append(participants.get(i).getName()); + if (i != participants.size() - 1) { + sb.append(COMMA); + } + } - public List getParticipants() { - return Collections.unmodifiableList(participants); + return sb.toString(); } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index bd2fd246..1aa78f66 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,7 +1,8 @@ package blackjack.domain; +import blackjack.view.InputView; -public class Player extends Participant{ +public class Player extends Participant { public Player(String name) { super(name); @@ -11,4 +12,22 @@ public Player(String name) { public void drawCardMultiple(Deck deck, int number) { cards.addCards(deck.drawMultiple(number)); } + + @Override + public void drawCardContinue(Deck deck) { + System.out.println(name + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + if (InputView.isContinue()) { + cards.addCards(deck.drawMultiple(1)); + System.out.println(holdingInfo()); + drawCardContinue(deck); + } + } + + @Override + public String scoreResult() { + if (winScore > 0) { + return name + " : " + "승"; + } + return name + " : " + "패"; + } } From da2f55434388b967142ec7cdcb49db216872463f 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 22:29:45 +0900 Subject: [PATCH 37/42] =?UTF-8?q?feat:=20InputView=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/view/InputView.java | 41 ++++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 9a5e553e..d3475278 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,5 +1,42 @@ -package blackjack.ui; +package blackjack.view; -public class BlackjackInput { +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; +public class InputView { + + private static final String YES = "y"; + private static final String DELIMITER_COMMA = ","; + + public static List inputNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + return splitNames(input()); + } + + public static boolean isContinue() { + return input().equals(YES); + } + + private static String input() { + final Scanner sc = new Scanner(System.in); + final String input = sc.nextLine().trim(); + validateBlank(input); + + return input; + } + + private static List splitNames(String input) { + String[] split = input.split(DELIMITER_COMMA); + + return Arrays.stream(split) + .collect(Collectors.toList()); + } + + private static void validateBlank(final String input) { + if (input.isEmpty()) { + throw new IllegalArgumentException("입력은 공백일 수 없습니다."); + } + } } From a6159fb08d000a5c61c28c58ee737004f68f0150 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 22:30:09 +0900 Subject: [PATCH 38/42] =?UTF-8?q?feat:=20PrintView=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/view/PrintView.java | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/java/blackjack/view/PrintView.java diff --git a/src/main/java/blackjack/view/PrintView.java b/src/main/java/blackjack/view/PrintView.java new file mode 100644 index 00000000..c8ff5401 --- /dev/null +++ b/src/main/java/blackjack/view/PrintView.java @@ -0,0 +1,29 @@ +package blackjack.view; + +import blackjack.domain.Participant; +import blackjack.domain.Participants; +import java.util.List; + +public class PrintView { + + public static void printFirstDrawCards(Participants participants) { + System.out.println(participants.participantsNames() + "에게 2장의 카드를 나누었습니다."); + + List participantList = participants.getParticipants(); + participantList.stream() + .forEach(participant -> System.out.println(participant.holdingInfo())); + } + + public static void printGameResult(Participants participants) { + List participantList = participants.getParticipants(); + participantList.stream() + .forEach(participant -> System.out.println( + participant.holdingInfo() + "- 결과 : " + participant.sumCardScore())); + } + + public static void printWinLose(Participants participants) { + List participantList = participants.getParticipants(); + participantList.stream() + .forEach(participant -> System.out.println(participant.scoreResult())); + } +} From 3a04921b3df94e8d9d6bf17980535bb092e41da5 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 22:30:56 +0900 Subject: [PATCH 39/42] =?UTF-8?q?feat:=20=EA=B2=8C=EC=9E=84=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=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 | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index feb12a37..ac7aac2a 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -1,40 +1,28 @@ package blackjack.controller; import blackjack.domain.Dealer; -import blackjack.domain.Participant; import blackjack.domain.Participants; import blackjack.domain.Players; -import java.util.ArrayList; +import blackjack.view.InputView; +import blackjack.view.PrintView; import java.util.List; public class GameController { - public Participant start() { - // 사용자 입력 - List name = new ArrayList<>(); - name.add("pobi"); - name.add("jason"); + public static void start() { + List name = InputView.inputNames(); - // Players 생성 Players players = Players.from(name); - - // 딜러 추가 - Dealer dealer = new Dealer("dealer"); - - // 사용자 추가 + Dealer dealer = new Dealer("딜러"); Participants participants = Participants.from(players, dealer); - // 딜러 , 사용자 에게 카드 2장씩 분배 participants.drawCardMultiple(2); + PrintView.printFirstDrawCards(participants); - // 사용자 1장씩 뽑기 - participants.drawCardMultiple(1); - - // 사용자별 카드 최종 상태 출력 + participants.drawCardContinue(1); + PrintView.printGameResult(participants); participants.judgeScore(); - // 최종 승패 출력 - - return null; + PrintView.printWinLose(participants); } } From 37712190bab8f709dc07586ef3fb8107140e9383 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 22:31:18 +0900 Subject: [PATCH 40/42] =?UTF-8?q?feat:=20main=20=ED=95=A8=EC=88=98=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/BlackjackApplication.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/blackjack/BlackjackApplication.java diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java new file mode 100644 index 00000000..8980a8b4 --- /dev/null +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -0,0 +1,10 @@ +package blackjack; + +import blackjack.controller.GameController; + +public class BlackjackApplication { + + public static void main(String[] args) { + GameController.start(); + } +} From 3ed43ac7e1de480273b83ab10d2228609de49359 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 22:37:58 +0900 Subject: [PATCH 41/42] =?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 | 13 +++++++++++++ src/test/java/blackjack/domain/DealerTest.java | 12 ++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index 44feda9d..9eacd9bf 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -65,4 +65,17 @@ void aceCardScoreIsEleven(final int currentScore) { // then assertThat(result).isEqualTo(11); } + + @DisplayName("카드 정보 확인") + @Test + void cardInfo() { + // given + Card card = new Card(CardType.SPADE, CardValue.KING); + + // when + String result = card.toString(); + + // then + assertThat(result).isEqualTo("K스페이드"); + } } \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 35f335ba..838b7c56 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -20,9 +20,9 @@ void dealerDrawCardWhenSumCardScoreOver17() { Deck deck = new Deck(types, values); Participant dealer = new Dealer("dealer"); - dealer.drawCardMultiple(deck, 1); - dealer.drawCardMultiple(deck, 1); - dealer.drawCardMultiple(deck, 1); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); // when int result = dealer.sumCardScore(); @@ -40,9 +40,9 @@ void dealerDrawCardWhenSumCardScoreUnder17() { Deck deck = new Deck(types, values); Participant dealer = new Dealer("dealer"); - dealer.drawCardMultiple(deck, 1); - dealer.drawCardMultiple(deck, 1); - dealer.drawCardMultiple(deck, 1); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); + dealer.drawCardContinue(deck); // when int result = dealer.sumCardScore(); From 63bcf1c6c6a436b7f863a567b6a8e711cc51941f Mon Sep 17 00:00:00 2001 From: hsj-96 <55642464+hsj-96@users.noreply.github.com> Date: Fri, 18 Feb 2022 09:42:37 +0900 Subject: [PATCH 42/42] docs: update readme.md --- README.md | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c22c3af4..f9c4c67c 100644 --- a/README.md +++ b/README.md @@ -26,25 +26,45 @@ 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. 게임을 완료한 후 각 플레이어별로 승패를 출력한다. -- [ ] 딜러, 플레이어 (공통) - Participant +- [X] 딜러, 플레이어 (공통) - Participant - 이름 - 보유 카드 - 승, 패 기록 - - 카드를 뽑음 -- [ ] 딜러 - Dealer -- [ ] 플레이어 - Player + - 첫번째 2장의 카드를 뽑음 + - 이후 1장씩 카드를 뽑음 + - 점수를 계산 + - 보유하고 있는 카드 정보 반환 +- [X] 딜러 - Dealer + - 딜러는 카드 점수가 16 이하이면 카드를 1장 더 받음 +- [X] 플레이어 - Player + - 플레이어는 카드를 1장 더 받을지 안받을지 입력을 받아서 카드를 받음 -- 카드 - Card +- [X] 카드 - Card - 종류 : ♦︎다이아, ♥하트, ♠스페이드, ♣클로버 - 숫자 : 1 ~ 9, A (= 1, 11), K (= 10), Q (= 10), J (= 10) + - 에이스 카드일 경우, 점수가 15 미만이면 에이스카드점수는 11점이 되고, 16이상이면 점수가 1점이 됨 + - 카드 정보를 반환 + +- [X] 덱 - Deck + - 카드 52장을 생성하고 관리 + - 생성시 미리 덱을 섞어서 반환 + - 카드를 여러장 뽑음 + - 카드를 한장 뽑음 + +- [X] 사용자가 가지고 있는 카드 묶음 - ParticipantsCards + - 가지고 있는 카드를 추가 + - 카드의 점수를 계산 + - 가지고 있는 카드의 정보를 반환 -- 게임 - Game +- [X] 게임 - GameController - 게임 진행 - - 게임 종료 조건 확인 -- 입력 +- [X] 입력 - InputView - 게임 참여자 입력 (쉼표로 구분) - 카드를 더 받을지 입력 (y/n) + - 빈 입력을 허용하지 않음 -- 결과 +- [X] 출력 - PrintView + - 뽑은 카드 결과 출력 + - 게임 결과 출력 - 최종 승패 출력