From 3b755f33f0302ff1048cfa08459f459489a15c7c Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 16:15:41 +0900 Subject: [PATCH 01/43] docs: Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 연료 주입 미션 요구 사항 정리 - 기능 요구 사항 - 프로그래밍 요구 사항 - 기능 구현 사항 리스트 정리 --- README.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03ba7ed3..28148399 100644 --- a/README.md +++ b/README.md @@ -1 +1,44 @@ -# java-blackjack \ No newline at end of file +# java-blackjack + +# 📌 연료 주입 +## 기능 요구 사항 + +우리 회사는 렌터카를 운영하고 있다. + +현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. + +고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. + +이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. + +``` +* Sonata : 10km/리터 +* Avante : 15km/리터 +* K5 : 13km/리터 +``` + +## 프로그래밍 요구 사항 + +- 상속과 추상 메서드를 활용한다. +- 위 요구사항을 `if/else` 절을 쓰지 않고 구현해야 한다. + +## 기능 구현 사항 + +- [ ] `Car` 클래스 추상화 (`Car`) + - [ ] 주입해야할 연료량 계산 (`Car.getChargeQuantity()`) +- [ ] 파생 클래스 구현 + + - [ ] `Sonata` 클래스 구현 (`Sonata`) + - [ ] 리터당 이동 거리 계산 (`Sonata.getDistancePerLiter()`) + - [ ] 여행하려는 거리 반환 (`Sonata.getTripDistance()`) + - [ ] 차종의 이름 반환 (`Sonata.getName()`) + + - [ ] `Avante` 클래스 구현 (`Avante`) + - [ ] 리터당 이동 거리 계산 (`Avante.getDistancePerLiter()`) + - [ ] 여행하려는 거리 반환 (`Avante.getTripDistance()`) + - [ ] 차종의 이름 반환 (`Avante.getName()`) + + - [ ] `K5` 클래스 구현 (`K5`) + - [ ] 리터당 이동 거리 계산 (`K5.getDistancePerLiter()`) + - [ ] 여행하려는 거리 반환 (`K5.getTripDistance()`) + - [ ] 차종의 이름 반환 (`K5.getName()`) From ff92f1c6209aa9928db2d9ebeeae78a7d9c277cb Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 16:25:04 +0900 Subject: [PATCH 02/43] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EC=84=B1=20=ED=8C=8C=EC=9D=BC=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 Classes - Car - RentCompany --- src/main/java/empty.txt | 0 src/main/java/rentCompany/domain/Car.java | 5 +++++ src/main/java/rentCompany/domain/RentCompany.java | 5 +++++ src/test/java/empty.txt | 0 src/test/java/rentCompany/domain/CarTest.java | 7 +++++++ src/test/java/rentCompany/domain/RentCompanyTest.java | 7 +++++++ 6 files changed, 24 insertions(+) delete mode 100644 src/main/java/empty.txt create mode 100644 src/main/java/rentCompany/domain/Car.java create mode 100644 src/main/java/rentCompany/domain/RentCompany.java delete mode 100644 src/test/java/empty.txt create mode 100644 src/test/java/rentCompany/domain/CarTest.java create mode 100644 src/test/java/rentCompany/domain/RentCompanyTest.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/rentCompany/domain/Car.java b/src/main/java/rentCompany/domain/Car.java new file mode 100644 index 00000000..c8fb06f6 --- /dev/null +++ b/src/main/java/rentCompany/domain/Car.java @@ -0,0 +1,5 @@ +package rentCompany.domain; + +public class Car { + +} diff --git a/src/main/java/rentCompany/domain/RentCompany.java b/src/main/java/rentCompany/domain/RentCompany.java new file mode 100644 index 00000000..cb9d73d4 --- /dev/null +++ b/src/main/java/rentCompany/domain/RentCompany.java @@ -0,0 +1,5 @@ +package rentCompany.domain; + +public class RentCompany { + +} diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/src/test/java/rentCompany/domain/CarTest.java b/src/test/java/rentCompany/domain/CarTest.java new file mode 100644 index 00000000..7ff54102 --- /dev/null +++ b/src/test/java/rentCompany/domain/CarTest.java @@ -0,0 +1,7 @@ +package rentCompany.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class CarTest { + +} \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/RentCompanyTest.java b/src/test/java/rentCompany/domain/RentCompanyTest.java new file mode 100644 index 00000000..e45cfa7f --- /dev/null +++ b/src/test/java/rentCompany/domain/RentCompanyTest.java @@ -0,0 +1,7 @@ +package rentCompany.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class RentCompanyTest { + +} \ No newline at end of file From 7ab8c030b8a49f94183b186b2cceaa9857250db3 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 16:32:00 +0900 Subject: [PATCH 03/43] =?UTF-8?q?feat:=20=EC=9A=94=EA=B5=AC=20class=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A0=9C=EA=B3=B5=EB=90=9C=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Avante, K5, Sonata 클래스 생성 - 제공된 테스트 코드 추가 --- src/main/java/rentCompany/domain/Avante.java | 5 ++++ src/main/java/rentCompany/domain/Car.java | 25 +++++++++++++++++-- src/main/java/rentCompany/domain/K5.java | 5 ++++ src/main/java/rentCompany/domain/Sonata.java | 5 ++++ .../java/rentCompany/domain/AvanteTest.java | 7 ++++++ src/test/java/rentCompany/domain/K5Test.java | 7 ++++++ .../rentCompany/domain/RentCompanyTest.java | 24 +++++++++++++++++- .../java/rentCompany/domain/SonataTest.java | 7 ++++++ 8 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 src/main/java/rentCompany/domain/Avante.java create mode 100644 src/main/java/rentCompany/domain/K5.java create mode 100644 src/main/java/rentCompany/domain/Sonata.java create mode 100644 src/test/java/rentCompany/domain/AvanteTest.java create mode 100644 src/test/java/rentCompany/domain/K5Test.java create mode 100644 src/test/java/rentCompany/domain/SonataTest.java diff --git a/src/main/java/rentCompany/domain/Avante.java b/src/main/java/rentCompany/domain/Avante.java new file mode 100644 index 00000000..e96ed9b1 --- /dev/null +++ b/src/main/java/rentCompany/domain/Avante.java @@ -0,0 +1,5 @@ +package rentCompany.domain; + +public class Avante { + +} diff --git a/src/main/java/rentCompany/domain/Car.java b/src/main/java/rentCompany/domain/Car.java index c8fb06f6..001cf781 100644 --- a/src/main/java/rentCompany/domain/Car.java +++ b/src/main/java/rentCompany/domain/Car.java @@ -1,5 +1,26 @@ package rentCompany.domain; -public class Car { +public abstract class Car { -} + /** + * 리터당 이동 거리. 즉, 연비 + */ + abstract double getDistancePerLiter(); + + /** + * 여행하려는 거리 + */ + abstract double getTripDistance(); + + /** + * 차종의 이름 + */ + abstract String getName(); + + /** + * 주입해야할 연료량을 구한다. + */ + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} \ No newline at end of file diff --git a/src/main/java/rentCompany/domain/K5.java b/src/main/java/rentCompany/domain/K5.java new file mode 100644 index 00000000..1b01ed4a --- /dev/null +++ b/src/main/java/rentCompany/domain/K5.java @@ -0,0 +1,5 @@ +package rentCompany.domain; + +public class K5 { + +} diff --git a/src/main/java/rentCompany/domain/Sonata.java b/src/main/java/rentCompany/domain/Sonata.java new file mode 100644 index 00000000..b81df625 --- /dev/null +++ b/src/main/java/rentCompany/domain/Sonata.java @@ -0,0 +1,5 @@ +package rentCompany.domain; + +public class Sonata { + +} diff --git a/src/test/java/rentCompany/domain/AvanteTest.java b/src/test/java/rentCompany/domain/AvanteTest.java new file mode 100644 index 00000000..aeb0fc60 --- /dev/null +++ b/src/test/java/rentCompany/domain/AvanteTest.java @@ -0,0 +1,7 @@ +package rentCompany.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class AvanteTest { + +} \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/K5Test.java b/src/test/java/rentCompany/domain/K5Test.java new file mode 100644 index 00000000..da0fe812 --- /dev/null +++ b/src/test/java/rentCompany/domain/K5Test.java @@ -0,0 +1,7 @@ +package rentCompany.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class K5Test { + +} \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/RentCompanyTest.java b/src/test/java/rentCompany/domain/RentCompanyTest.java index e45cfa7f..4274ab68 100644 --- a/src/test/java/rentCompany/domain/RentCompanyTest.java +++ b/src/test/java/rentCompany/domain/RentCompanyTest.java @@ -1,7 +1,29 @@ package rentCompany.domain; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; class RentCompanyTest { + private static final String NEWLINE = System.getProperty("line.separator"); + + @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 diff --git a/src/test/java/rentCompany/domain/SonataTest.java b/src/test/java/rentCompany/domain/SonataTest.java new file mode 100644 index 00000000..e20fd68d --- /dev/null +++ b/src/test/java/rentCompany/domain/SonataTest.java @@ -0,0 +1,7 @@ +package rentCompany.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class SonataTest { + +} \ No newline at end of file From 95fbf47854197e292b82d12558f5cebd1c03ba2b Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 16:42:05 +0900 Subject: [PATCH 04/43] =?UTF-8?q?feat:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=8B=9C=EA=B7=B8?= =?UTF-8?q?=EB=8B=88=EC=B2=98=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - constructor - getDistancePerLiter() - getTripDistance() - getName() --- src/main/java/rentCompany/domain/Avante.java | 20 ++++++++++++++++++- src/main/java/rentCompany/domain/K5.java | 20 ++++++++++++++++++- .../java/rentCompany/domain/RentCompany.java | 14 +++++++++++++ src/main/java/rentCompany/domain/Sonata.java | 20 ++++++++++++++++++- 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/src/main/java/rentCompany/domain/Avante.java b/src/main/java/rentCompany/domain/Avante.java index e96ed9b1..d4597eb9 100644 --- a/src/main/java/rentCompany/domain/Avante.java +++ b/src/main/java/rentCompany/domain/Avante.java @@ -1,5 +1,23 @@ package rentCompany.domain; -public class Avante { +public class Avante extends Car { + public Avante(int distance) { + super(); + } + + @Override + double getDistancePerLiter() { + return 0; + } + + @Override + double getTripDistance() { + return 0; + } + + @Override + String getName() { + return null; + } } diff --git a/src/main/java/rentCompany/domain/K5.java b/src/main/java/rentCompany/domain/K5.java index 1b01ed4a..5bf56c85 100644 --- a/src/main/java/rentCompany/domain/K5.java +++ b/src/main/java/rentCompany/domain/K5.java @@ -1,5 +1,23 @@ package rentCompany.domain; -public class K5 { +public class K5 extends Car { + public K5(int distance) { + super(); + } + + @Override + double getDistancePerLiter() { + return 0; + } + + @Override + double getTripDistance() { + return 0; + } + + @Override + String getName() { + return null; + } } diff --git a/src/main/java/rentCompany/domain/RentCompany.java b/src/main/java/rentCompany/domain/RentCompany.java index cb9d73d4..816ce875 100644 --- a/src/main/java/rentCompany/domain/RentCompany.java +++ b/src/main/java/rentCompany/domain/RentCompany.java @@ -2,4 +2,18 @@ public class RentCompany { + public static RentCompany create() { + + return null; + } + + public String generateReport() { + + return ""; + } + + public void addCar(Car car) { + + } + } diff --git a/src/main/java/rentCompany/domain/Sonata.java b/src/main/java/rentCompany/domain/Sonata.java index b81df625..decbeba3 100644 --- a/src/main/java/rentCompany/domain/Sonata.java +++ b/src/main/java/rentCompany/domain/Sonata.java @@ -1,5 +1,23 @@ package rentCompany.domain; -public class Sonata { +public class Sonata extends Car { + public Sonata(int distance) { + super(); + } + + @Override + double getDistancePerLiter() { + return 0; + } + + @Override + double getTripDistance() { + return 0; + } + + @Override + String getName() { + return null; + } } From b2c29207ca70edad5f955deef4e64f4d4587567d Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 18:06:30 +0900 Subject: [PATCH 05/43] =?UTF-8?q?feat:=20Car=EC=9D=98=20=ED=8C=8C=EC=83=9D?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4(Sonata,=20Avante,=20K5)=20=EC=98=A4?= =?UTF-8?q?=EB=B2=84=EB=9D=BC=EC=9D=B4=EB=94=A9=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=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/rentCompany/domain/Avante.java | 12 ++++--- src/main/java/rentCompany/domain/Car.java | 7 ++++ src/main/java/rentCompany/domain/K5.java | 12 ++++--- .../java/rentCompany/domain/RentCompany.java | 13 ++++++-- src/main/java/rentCompany/domain/Sonata.java | 12 ++++--- .../java/rentCompany/domain/AvanteTest.java | 32 +++++++++++++++++++ src/test/java/rentCompany/domain/CarTest.java | 7 ---- src/test/java/rentCompany/domain/K5Test.java | 32 +++++++++++++++++++ .../java/rentCompany/domain/SonataTest.java | 32 +++++++++++++++++++ 9 files changed, 135 insertions(+), 24 deletions(-) delete mode 100644 src/test/java/rentCompany/domain/CarTest.java diff --git a/src/main/java/rentCompany/domain/Avante.java b/src/main/java/rentCompany/domain/Avante.java index d4597eb9..8e1f7e49 100644 --- a/src/main/java/rentCompany/domain/Avante.java +++ b/src/main/java/rentCompany/domain/Avante.java @@ -2,22 +2,24 @@ public class Avante extends Car { - public Avante(int distance) { - super(); + private static final double FUEL_EFFICIENCY = 15; + + public Avante(int tripDistance) { + super("Avante", tripDistance); } @Override double getDistancePerLiter() { - return 0; + return tripDistance / FUEL_EFFICIENCY; } @Override double getTripDistance() { - return 0; + return tripDistance; } @Override String getName() { - return null; + return name; } } diff --git a/src/main/java/rentCompany/domain/Car.java b/src/main/java/rentCompany/domain/Car.java index 001cf781..ab9c406a 100644 --- a/src/main/java/rentCompany/domain/Car.java +++ b/src/main/java/rentCompany/domain/Car.java @@ -1,6 +1,13 @@ package rentCompany.domain; public abstract class Car { + protected String name; + protected double tripDistance; + + protected Car(String name, int distance) { + this.name = name; + this.tripDistance = distance; + } /** * 리터당 이동 거리. 즉, 연비 diff --git a/src/main/java/rentCompany/domain/K5.java b/src/main/java/rentCompany/domain/K5.java index 5bf56c85..294c712a 100644 --- a/src/main/java/rentCompany/domain/K5.java +++ b/src/main/java/rentCompany/domain/K5.java @@ -2,22 +2,24 @@ public class K5 extends Car { - public K5(int distance) { - super(); + private static final double FUEL_EFFICIENCY = 13; + + public K5(int tripDistance) { + super("K5", tripDistance); } @Override double getDistancePerLiter() { - return 0; + return tripDistance / FUEL_EFFICIENCY; } @Override double getTripDistance() { - return 0; + return tripDistance; } @Override String getName() { - return null; + return name; } } diff --git a/src/main/java/rentCompany/domain/RentCompany.java b/src/main/java/rentCompany/domain/RentCompany.java index 816ce875..fd8d9d10 100644 --- a/src/main/java/rentCompany/domain/RentCompany.java +++ b/src/main/java/rentCompany/domain/RentCompany.java @@ -1,10 +1,19 @@ package rentCompany.domain; +import java.util.ArrayList; +import java.util.List; + public class RentCompany { + private static List cars; + + private RentCompany() { + cars = new ArrayList<>(); + } + public static RentCompany create() { - return null; + return new RentCompany(); } public String generateReport() { @@ -13,7 +22,7 @@ public String generateReport() { } public void addCar(Car car) { - + cars.add(car); } } diff --git a/src/main/java/rentCompany/domain/Sonata.java b/src/main/java/rentCompany/domain/Sonata.java index decbeba3..57df2743 100644 --- a/src/main/java/rentCompany/domain/Sonata.java +++ b/src/main/java/rentCompany/domain/Sonata.java @@ -2,22 +2,24 @@ public class Sonata extends Car { - public Sonata(int distance) { - super(); + private static final double FUEL_EFFICIENCY = 10; + + public Sonata(int tripDistance) { + super("Sonata", tripDistance); } @Override double getDistancePerLiter() { - return 0; + return tripDistance / FUEL_EFFICIENCY; } @Override double getTripDistance() { - return 0; + return tripDistance; } @Override String getName() { - return null; + return name; } } diff --git a/src/test/java/rentCompany/domain/AvanteTest.java b/src/test/java/rentCompany/domain/AvanteTest.java index aeb0fc60..851cfa16 100644 --- a/src/test/java/rentCompany/domain/AvanteTest.java +++ b/src/test/java/rentCompany/domain/AvanteTest.java @@ -1,7 +1,39 @@ package rentCompany.domain; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + class AvanteTest { + static Car avante; + + @BeforeAll + static void setup() { + avante = new Avante(150); + } + + @DisplayName("리터당 이동 거리(연비)를 가져온다.") + @Test + void testGetDistancePerLiter() { + double given = avante.getDistancePerLiter(); + assertThat(given).isEqualTo(10); + } + + @DisplayName("여행하려는 거리를 가져온다.") + @Test + void testGetTripDistance() { + double given = avante.getTripDistance(); + assertThat(given).isEqualTo(150); + } + + @DisplayName("차종의 이름을 가져온다.") + @Test + void testGetName() { + String given = avante.getName(); + assertThat(given).isEqualTo("Avante"); + } } \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/CarTest.java b/src/test/java/rentCompany/domain/CarTest.java deleted file mode 100644 index 7ff54102..00000000 --- a/src/test/java/rentCompany/domain/CarTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package rentCompany.domain; - -import static org.junit.jupiter.api.Assertions.*; - -class CarTest { - -} \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/K5Test.java b/src/test/java/rentCompany/domain/K5Test.java index da0fe812..8bc52833 100644 --- a/src/test/java/rentCompany/domain/K5Test.java +++ b/src/test/java/rentCompany/domain/K5Test.java @@ -1,7 +1,39 @@ package rentCompany.domain; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + class K5Test { + static Car K5; + + @BeforeAll + static void setup() { + K5= new K5(260); + } + + @DisplayName("리터당 이동 거리(연비)를 가져온다.") + @Test + void testGetDistancePerLiter() { + double given = K5.getDistancePerLiter(); + assertThat(given).isEqualTo(20); + } + + @DisplayName("여행하려는 거리를 가져온다.") + @Test + void testGetTripDistance() { + double given = K5.getTripDistance(); + assertThat(given).isEqualTo(260); + } + + @DisplayName("차종의 이름을 가져온다.") + @Test + void testGetName() { + String given = K5.getName(); + assertThat(given).isEqualTo("K5"); + } } \ No newline at end of file diff --git a/src/test/java/rentCompany/domain/SonataTest.java b/src/test/java/rentCompany/domain/SonataTest.java index e20fd68d..df00ee3e 100644 --- a/src/test/java/rentCompany/domain/SonataTest.java +++ b/src/test/java/rentCompany/domain/SonataTest.java @@ -1,7 +1,39 @@ package rentCompany.domain; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + class SonataTest { + static Car sonata; + + @BeforeAll + static void setup() { + sonata = new Sonata(150); + } + + @DisplayName("리터당 이동 거리(연비)를 가져온다.") + @Test + void testGetDistancePerLiter() { + double given = sonata.getDistancePerLiter(); + assertThat(given).isEqualTo(15); + } + + @DisplayName("여행하려는 거리를 가져온다.") + @Test + void testGetTripDistance() { + double given = sonata.getTripDistance(); + assertThat(given).isEqualTo(150); + } + + @DisplayName("차종의 이름을 가져온다.") + @Test + void testGetName() { + String given = sonata.getName(); + assertThat(given).isEqualTo("Sonata"); + } } \ No newline at end of file From 679cd139b7449fa8ebc4ce3fc911071397164027 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 18:21:26 +0900 Subject: [PATCH 06/43] =?UTF-8?q?feat:=20RentCompany.generateReport=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=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/rentCompany/domain/Car.java | 1 + src/main/java/rentCompany/domain/RentCompany.java | 12 ++++++++++-- src/test/java/rentCompany/domain/K5Test.java | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/rentCompany/domain/Car.java b/src/main/java/rentCompany/domain/Car.java index ab9c406a..7866836d 100644 --- a/src/main/java/rentCompany/domain/Car.java +++ b/src/main/java/rentCompany/domain/Car.java @@ -1,6 +1,7 @@ package rentCompany.domain; public abstract class Car { + protected String name; protected double tripDistance; diff --git a/src/main/java/rentCompany/domain/RentCompany.java b/src/main/java/rentCompany/domain/RentCompany.java index fd8d9d10..9ee7d3ca 100644 --- a/src/main/java/rentCompany/domain/RentCompany.java +++ b/src/main/java/rentCompany/domain/RentCompany.java @@ -4,6 +4,8 @@ import java.util.List; public class RentCompany { + private static final String COLON = " : "; + private static final String LITTER="리터\n"; private static List cars; @@ -17,8 +19,14 @@ public static RentCompany create() { } public String generateReport() { - - return ""; + StringBuilder report = new StringBuilder(); + for (Car car : cars) { + report.append(car.getName()); + report.append(COLON); + report.append((int) (car.getDistancePerLiter())); + report.append(LITTER); + } + return report.toString(); } public void addCar(Car car) { diff --git a/src/test/java/rentCompany/domain/K5Test.java b/src/test/java/rentCompany/domain/K5Test.java index 8bc52833..741023cc 100644 --- a/src/test/java/rentCompany/domain/K5Test.java +++ b/src/test/java/rentCompany/domain/K5Test.java @@ -13,7 +13,7 @@ class K5Test { @BeforeAll static void setup() { - K5= new K5(260); + K5 = new K5(260); } @DisplayName("리터당 이동 거리(연비)를 가져온다.") From 1501e4f4b2d30653f61fcbfcbafa608b69071917 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 18:23:21 +0900 Subject: [PATCH 07/43] =?UTF-8?q?refactor:=20=ED=8C=8C=EC=83=9D=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20car=20name=20=EC=83=81=EC=88=98?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentCompany/domain/Avante.java | 3 ++- src/main/java/rentCompany/domain/K5.java | 3 ++- src/main/java/rentCompany/domain/Sonata.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/rentCompany/domain/Avante.java b/src/main/java/rentCompany/domain/Avante.java index 8e1f7e49..ad148097 100644 --- a/src/main/java/rentCompany/domain/Avante.java +++ b/src/main/java/rentCompany/domain/Avante.java @@ -2,10 +2,11 @@ public class Avante extends Car { + private static final String CAR_NAME = "Avante"; private static final double FUEL_EFFICIENCY = 15; public Avante(int tripDistance) { - super("Avante", tripDistance); + super(CAR_NAME, tripDistance); } @Override diff --git a/src/main/java/rentCompany/domain/K5.java b/src/main/java/rentCompany/domain/K5.java index 294c712a..c17bbe43 100644 --- a/src/main/java/rentCompany/domain/K5.java +++ b/src/main/java/rentCompany/domain/K5.java @@ -2,10 +2,11 @@ public class K5 extends Car { + private static final String CAR_NAME = "K5"; private static final double FUEL_EFFICIENCY = 13; public K5(int tripDistance) { - super("K5", tripDistance); + super(CAR_NAME, tripDistance); } @Override diff --git a/src/main/java/rentCompany/domain/Sonata.java b/src/main/java/rentCompany/domain/Sonata.java index 57df2743..e216030a 100644 --- a/src/main/java/rentCompany/domain/Sonata.java +++ b/src/main/java/rentCompany/domain/Sonata.java @@ -2,10 +2,11 @@ public class Sonata extends Car { + private static final String CAR_NAME = "Sonata"; private static final double FUEL_EFFICIENCY = 10; public Sonata(int tripDistance) { - super("Sonata", tripDistance); + super(CAR_NAME, tripDistance); } @Override From eab1872d2ea450d0997b3838f8af583aef3596ce Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 18:25:05 +0900 Subject: [PATCH 08/43] docs: Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기능 구현 사항 리스트 완료 처리 --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 28148399..52dd8d60 100644 --- a/README.md +++ b/README.md @@ -24,21 +24,21 @@ ## 기능 구현 사항 -- [ ] `Car` 클래스 추상화 (`Car`) - - [ ] 주입해야할 연료량 계산 (`Car.getChargeQuantity()`) -- [ ] 파생 클래스 구현 - - - [ ] `Sonata` 클래스 구현 (`Sonata`) - - [ ] 리터당 이동 거리 계산 (`Sonata.getDistancePerLiter()`) - - [ ] 여행하려는 거리 반환 (`Sonata.getTripDistance()`) - - [ ] 차종의 이름 반환 (`Sonata.getName()`) +- [x] `Car` 클래스 추상화 (`Car`) + - [x] 주입해야할 연료량 계산 (`Car.getChargeQuantity()`) +- [x] 파생 클래스 구현 + + - [x] `Sonata` 클래스 구현 (`Sonata`) + - [x] 리터당 이동 거리 계산 (`Sonata.getDistancePerLiter()`) + - [x] 여행하려는 거리 반환 (`Sonata.getTripDistance()`) + - [x] 차종의 이름 반환 (`Sonata.getName()`) - - [ ] `Avante` 클래스 구현 (`Avante`) - - [ ] 리터당 이동 거리 계산 (`Avante.getDistancePerLiter()`) - - [ ] 여행하려는 거리 반환 (`Avante.getTripDistance()`) - - [ ] 차종의 이름 반환 (`Avante.getName()`) + - [x] `Avante` 클래스 구현 (`Avante`) + - [x] 리터당 이동 거리 계산 (`Avante.getDistancePerLiter()`) + - [x] 여행하려는 거리 반환 (`Avante.getTripDistance()`) + - [x] 차종의 이름 반환 (`Avante.getName()`) - - [ ] `K5` 클래스 구현 (`K5`) - - [ ] 리터당 이동 거리 계산 (`K5.getDistancePerLiter()`) - - [ ] 여행하려는 거리 반환 (`K5.getTripDistance()`) - - [ ] 차종의 이름 반환 (`K5.getName()`) + - [x] `K5` 클래스 구현 (`K5`) + - [x] 리터당 이동 거리 계산 (`K5.getDistancePerLiter()`) + - [x] 여행하려는 거리 반환 (`K5.getTripDistance()`) + - [x] 차종의 이름 반환 (`K5.getName()`) From eb94b7d8966ef864e6b0380054871b3209ccecc9 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Fri, 11 Feb 2022 18:27:06 +0900 Subject: [PATCH 09/43] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentCompany/domain/RentCompany.java | 1 - src/test/java/rentCompany/domain/AvanteTest.java | 1 - src/test/java/rentCompany/domain/K5Test.java | 1 - src/test/java/rentCompany/domain/SonataTest.java | 1 - 4 files changed, 4 deletions(-) diff --git a/src/main/java/rentCompany/domain/RentCompany.java b/src/main/java/rentCompany/domain/RentCompany.java index 9ee7d3ca..3d852c0f 100644 --- a/src/main/java/rentCompany/domain/RentCompany.java +++ b/src/main/java/rentCompany/domain/RentCompany.java @@ -14,7 +14,6 @@ private RentCompany() { } public static RentCompany create() { - return new RentCompany(); } diff --git a/src/test/java/rentCompany/domain/AvanteTest.java b/src/test/java/rentCompany/domain/AvanteTest.java index 851cfa16..6ccea1c5 100644 --- a/src/test/java/rentCompany/domain/AvanteTest.java +++ b/src/test/java/rentCompany/domain/AvanteTest.java @@ -1,7 +1,6 @@ package rentCompany.domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/rentCompany/domain/K5Test.java b/src/test/java/rentCompany/domain/K5Test.java index 741023cc..1b51456b 100644 --- a/src/test/java/rentCompany/domain/K5Test.java +++ b/src/test/java/rentCompany/domain/K5Test.java @@ -1,7 +1,6 @@ package rentCompany.domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/rentCompany/domain/SonataTest.java b/src/test/java/rentCompany/domain/SonataTest.java index df00ee3e..6b55e8e4 100644 --- a/src/test/java/rentCompany/domain/SonataTest.java +++ b/src/test/java/rentCompany/domain/SonataTest.java @@ -1,7 +1,6 @@ package rentCompany.domain; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; From f7ee342ec518f687c84147deabc04dc3d7c9c2e4 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 17:46:43 +0900 Subject: [PATCH 10/43] docs: update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 블랙잭 게임 기능 구현 사항 작성 --- README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/README.md b/README.md index 52dd8d60..32554995 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,39 @@ - [x] 리터당 이동 거리 계산 (`K5.getDistancePerLiter()`) - [x] 여행하려는 거리 반환 (`K5.getTripDistance()`) - [x] 차종의 이름 반환 (`K5.getName()`) + +--- + +# 📌 블랙잭 + +# 기능 요구 사항 + +블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 + 얼마든지 카드를 계속 뽑을 수 있다. +- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +- 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +## 프로그래밍 요구 사항 + +- 모든 엔티티를 작게 유지한다. +- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. +- 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다. + +## 기능 구현 사항 + +- [ ] 사람 이름 입력받기(`Input.getPlayerNames`) +- [ ] 카드는 문양값(`Suit`)과 숫자값(`Denomination`)을 가진다 (Card) + - [ ] 문양값(`Suit`)과 숫자값(`Denomination`)은 `enum`으로 구현한다 +- [ ] 카드리스트를 가진 일급 컬렉션 Deck 구현 + - [ ] 카드를 생성한다 (`Deck.setupCard()`) + - [ ] 카드를 섞는다 (`Deck.shuffle()`) + - [ ] 카드 한 장을 Gambler에게 준다 (`Deck.popCard()`) +- [ ] `Dealer`와 `Player`는 `Gambler` 클래스로부터 상속을 받는다 +- [ ] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) +- [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) +- [ ] 카드 숫자를 계산한다 (`Gambler.calculateScore()`) +- [ ] 우승자를 찾는다 (`Judgement.findWinner()`) +- [ ] 최종 승패 계산하기 (`Judgement.calculateWinningRate()`) From 361bb4ed0244aafa756030cc0479f321daca2f73 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 17:46:50 +0900 Subject: [PATCH 11/43] =?UTF-8?q?=EA=B9=80=EC=A0=95=ED=98=B8=20=EB=8B=98?= =?UTF-8?q?=EC=9D=B4=20=EB=B3=80=EA=B2=BD=ED=95=9C=20=EB=82=B4=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 32554995..4f408e93 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,14 @@ # java-blackjack # 📌 연료 주입 + ## 기능 요구 사항 -우리 회사는 렌터카를 운영하고 있다. +우리 회사는 렌터카를 운영하고 있다. 현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. -고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. +고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. 이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. 차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. @@ -25,23 +26,23 @@ ## 기능 구현 사항 - [x] `Car` 클래스 추상화 (`Car`) - - [x] 주입해야할 연료량 계산 (`Car.getChargeQuantity()`) + - [x] 주입해야할 연료량 계산 (`Car.getChargeQuantity()`) - [x] 파생 클래스 구현 - - [x] `Sonata` 클래스 구현 (`Sonata`) - - [x] 리터당 이동 거리 계산 (`Sonata.getDistancePerLiter()`) - - [x] 여행하려는 거리 반환 (`Sonata.getTripDistance()`) - - [x] 차종의 이름 반환 (`Sonata.getName()`) - - - [x] `Avante` 클래스 구현 (`Avante`) - - [x] 리터당 이동 거리 계산 (`Avante.getDistancePerLiter()`) - - [x] 여행하려는 거리 반환 (`Avante.getTripDistance()`) - - [x] 차종의 이름 반환 (`Avante.getName()`) - - - [x] `K5` 클래스 구현 (`K5`) - - [x] 리터당 이동 거리 계산 (`K5.getDistancePerLiter()`) - - [x] 여행하려는 거리 반환 (`K5.getTripDistance()`) - - [x] 차종의 이름 반환 (`K5.getName()`) + - [x] `Sonata` 클래스 구현 (`Sonata`) + - [x] 리터당 이동 거리 계산 (`Sonata.getDistancePerLiter()`) + - [x] 여행하려는 거리 반환 (`Sonata.getTripDistance()`) + - [x] 차종의 이름 반환 (`Sonata.getName()`) + + - [x] `Avante` 클래스 구현 (`Avante`) + - [x] 리터당 이동 거리 계산 (`Avante.getDistancePerLiter()`) + - [x] 여행하려는 거리 반환 (`Avante.getTripDistance()`) + - [x] 차종의 이름 반환 (`Avante.getName()`) + + - [x] `K5` 클래스 구현 (`K5`) + - [x] 리터당 이동 거리 계산 (`K5.getDistancePerLiter()`) + - [x] 여행하려는 거리 반환 (`K5.getTripDistance()`) + - [x] 차종의 이름 반환 (`K5.getName()`) --- From 3a7fe0c9629911e9a2b176cbe9ad3fb4e255030c Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:00:19 +0900 Subject: [PATCH 12/43] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EC=84=B1=20=ED=8C=8C=EC=9D=BC=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 classes - BlackjackGame - Dealer - Deck - Denomination - Gambler - Judgement - InputView - OutputView - Player - Suit --- src/main/java/blackjack/controller/BlackjackGame.java | 5 +++++ src/main/java/blackjack/domain/Dealer.java | 5 +++++ src/main/java/blackjack/domain/Deck.java | 5 +++++ src/main/java/blackjack/domain/Denomination.java | 4 ++++ src/main/java/blackjack/domain/Gambler.java | 5 +++++ src/main/java/blackjack/domain/Judgement.java | 5 +++++ src/main/java/blackjack/domain/Player.java | 5 +++++ src/main/java/blackjack/domain/Suit.java | 4 ++++ src/main/java/blackjack/view/InputView.java | 5 +++++ src/main/java/blackjack/view/OutputView.java | 5 +++++ 10 files changed, 48 insertions(+) create mode 100644 src/main/java/blackjack/controller/BlackjackGame.java create mode 100644 src/main/java/blackjack/domain/Dealer.java create mode 100644 src/main/java/blackjack/domain/Deck.java create mode 100644 src/main/java/blackjack/domain/Denomination.java create mode 100644 src/main/java/blackjack/domain/Gambler.java create mode 100644 src/main/java/blackjack/domain/Judgement.java create mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/main/java/blackjack/domain/Suit.java create mode 100644 src/main/java/blackjack/view/InputView.java create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/src/main/java/blackjack/controller/BlackjackGame.java b/src/main/java/blackjack/controller/BlackjackGame.java new file mode 100644 index 00000000..95cc043a --- /dev/null +++ b/src/main/java/blackjack/controller/BlackjackGame.java @@ -0,0 +1,5 @@ +package blackjack.controller; + +public class BlackjackGame { + +} diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000..f5917c81 --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Dealer { + +} diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 00000000..1f6951d7 --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Deck { + +} diff --git a/src/main/java/blackjack/domain/Denomination.java b/src/main/java/blackjack/domain/Denomination.java new file mode 100644 index 00000000..576559eb --- /dev/null +++ b/src/main/java/blackjack/domain/Denomination.java @@ -0,0 +1,4 @@ +package blackjack.domain; + +public enum Denomination { +} diff --git a/src/main/java/blackjack/domain/Gambler.java b/src/main/java/blackjack/domain/Gambler.java new file mode 100644 index 00000000..e2367174 --- /dev/null +++ b/src/main/java/blackjack/domain/Gambler.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Gambler { + +} diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java new file mode 100644 index 00000000..2b5b3c41 --- /dev/null +++ b/src/main/java/blackjack/domain/Judgement.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Judgement { + +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000..9802e60c --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Player { + +} diff --git a/src/main/java/blackjack/domain/Suit.java b/src/main/java/blackjack/domain/Suit.java new file mode 100644 index 00000000..b5f8d445 --- /dev/null +++ b/src/main/java/blackjack/domain/Suit.java @@ -0,0 +1,4 @@ +package blackjack.domain; + +public enum Suit { +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..ff86c007 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,5 @@ +package blackjack.view; + +public class InputView { + +} diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 00000000..911eecf5 --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,5 @@ +package blackjack.view; + +public class OutputView { + +} From 648a2dc508a391c44e9af40874d2a9aa81c9b652 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:01:24 +0900 Subject: [PATCH 13/43] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=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 classes - DealerTest - DeckTest - DenominationTest - GamblerTest - JudgementTest - PlayerTest - SuitTest --- src/test/java/blackjack/domain/DealerTest.java | 7 +++++++ src/test/java/blackjack/domain/DeckTest.java | 7 +++++++ src/test/java/blackjack/domain/DenominationTest.java | 7 +++++++ src/test/java/blackjack/domain/GamblerTest.java | 7 +++++++ src/test/java/blackjack/domain/JudgementTest.java | 7 +++++++ src/test/java/blackjack/domain/PlayerTest.java | 7 +++++++ src/test/java/blackjack/domain/SuitTest.java | 7 +++++++ 7 files changed, 49 insertions(+) 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/DenominationTest.java create mode 100644 src/test/java/blackjack/domain/GamblerTest.java create mode 100644 src/test/java/blackjack/domain/JudgementTest.java create mode 100644 src/test/java/blackjack/domain/PlayerTest.java create mode 100644 src/test/java/blackjack/domain/SuitTest.java diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 00000000..eb2feb8d --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class DealerTest { + +} \ 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..310b68f7 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class DeckTest { + +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/DenominationTest.java b/src/test/java/blackjack/domain/DenominationTest.java new file mode 100644 index 00000000..23259599 --- /dev/null +++ b/src/test/java/blackjack/domain/DenominationTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class DenominationTest { + +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/GamblerTest.java b/src/test/java/blackjack/domain/GamblerTest.java new file mode 100644 index 00000000..bc8f5200 --- /dev/null +++ b/src/test/java/blackjack/domain/GamblerTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class GamblerTest { + +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/JudgementTest.java b/src/test/java/blackjack/domain/JudgementTest.java new file mode 100644 index 00000000..a8c81fbe --- /dev/null +++ b/src/test/java/blackjack/domain/JudgementTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class JudgementTest { + +} \ 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..dabfa075 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class PlayerTest { + +} \ No newline at end of file diff --git a/src/test/java/blackjack/domain/SuitTest.java b/src/test/java/blackjack/domain/SuitTest.java new file mode 100644 index 00000000..db663c9b --- /dev/null +++ b/src/test/java/blackjack/domain/SuitTest.java @@ -0,0 +1,7 @@ +package blackjack.domain; + +import static org.junit.jupiter.api.Assertions.*; + +class SuitTest { + +} \ No newline at end of file From 8ac61f166b438c1f959c06f09463dd6eaa179f12 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:19:11 +0900 Subject: [PATCH 14/43] =?UTF-8?q?chore:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=ED=96=89=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EC=84=B1=20=ED=8C=8C=EC=9D=BC=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 classes -Card --- src/main/java/blackjack/domain/Card.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/blackjack/domain/Card.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..c7a20673 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Card { + +} From 2e16386fd0b2d457ed472e50c78a24b729a65683 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:21:34 +0900 Subject: [PATCH 15/43] =?UTF-8?q?feat:=20Dealer=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80=20-=20allocate?= =?UTF-8?q?Card()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Dealer.java | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index f5917c81..6199f07a 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,5 +1,26 @@ package blackjack.domain; -public class Dealer { +import java.util.ArrayList; + +public class Dealer extends Gambler{ + + public Dealer(String name){ + this.name = name; + this.cards=new ArrayList<>(); + } + + @Override + protected int calculateScore() { + return 0; + } + + @Override + protected void receiveCard() { + + } + + public Card allocateCard(){ + return null; + } } From b8bc27f73a1ffe82560cc2445df466205ec1f842 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:22:49 +0900 Subject: [PATCH 16/43] =?UTF-8?q?feat:=20enum=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20-=20Denomination?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/Denomination.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/blackjack/domain/Denomination.java b/src/main/java/blackjack/domain/Denomination.java index 576559eb..1c6cba4f 100644 --- a/src/main/java/blackjack/domain/Denomination.java +++ b/src/main/java/blackjack/domain/Denomination.java @@ -1,4 +1,37 @@ package blackjack.domain; public enum Denomination { + ACE(1, "A"), + 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"), + JACK(10, "J"), + QUEEN(10, "Q"), + KING(10, "K"); + + private final int count; + private final String countString; + + Denomination(final int count, final String countString) { + this.count = count; + this.countString = countString; + } + + public boolean isAce() { + return this == ACE; + } + + public int getCount() { + return count; + } + + public String getCountString() { + return countString; + } } From c808b5f3518242146bc81d0e59f12c73d3ca7422 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:23:29 +0900 Subject: [PATCH 17/43] =?UTF-8?q?feat:=20Gambler=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Gambler.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Gambler.java b/src/main/java/blackjack/domain/Gambler.java index e2367174..a933af03 100644 --- a/src/main/java/blackjack/domain/Gambler.java +++ b/src/main/java/blackjack/domain/Gambler.java @@ -1,5 +1,19 @@ package blackjack.domain; -public class Gambler { +import java.util.List; +public abstract class Gambler { + protected String name; + protected List cards; + + protected abstract int calculateScore(); + protected abstract void receiveCard(); + + public String getName() { + return name; + } + + public List getCards() { + return cards; + } } From faa242df5418c30129f580601a18d8d2b5e72e25 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:24:29 +0900 Subject: [PATCH 18/43] =?UTF-8?q?feat:=20Player=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Player.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 9802e60c..769ea4de 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,5 +1,24 @@ package blackjack.domain; -public class Player { +import java.util.ArrayList; +import java.util.List; + +public class Player extends Gambler { + + public Player(final String name) { + this.name = name; + this.cards = new ArrayList<>(); + } + + @Override + protected int calculateScore() { + return 0; + } + + @Override + protected void receiveCard() { + + } + } From 18e892cdb1641e645675e5d5634bbae6fdabcaa2 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:25:07 +0900 Subject: [PATCH 19/43] docs: Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기능 구현 완료 사항 체크 표시 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4f408e93..0d143d6d 100644 --- a/README.md +++ b/README.md @@ -68,12 +68,12 @@ - [ ] 사람 이름 입력받기(`Input.getPlayerNames`) - [ ] 카드는 문양값(`Suit`)과 숫자값(`Denomination`)을 가진다 (Card) - - [ ] 문양값(`Suit`)과 숫자값(`Denomination`)은 `enum`으로 구현한다 + - [x] 문양값(`Suit`)과 숫자값(`Denomination`)은 `enum`으로 구현한다 - [ ] 카드리스트를 가진 일급 컬렉션 Deck 구현 - [ ] 카드를 생성한다 (`Deck.setupCard()`) - [ ] 카드를 섞는다 (`Deck.shuffle()`) - [ ] 카드 한 장을 Gambler에게 준다 (`Deck.popCard()`) -- [ ] `Dealer`와 `Player`는 `Gambler` 클래스로부터 상속을 받는다 +- [x] `Dealer`와 `Player`는 `Gambler` 클래스로부터 상속을 받는다 - [ ] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) - [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) - [ ] 카드 숫자를 계산한다 (`Gambler.calculateScore()`) From 17e065d6eec11fd86f9401551f641c6a90770215 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Mon, 14 Feb 2022 18:25:33 +0900 Subject: [PATCH 20/43] =?UTF-8?q?feat:=20enum=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=20-Suit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Suit.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/blackjack/domain/Suit.java b/src/main/java/blackjack/domain/Suit.java index b5f8d445..0fd6a20c 100644 --- a/src/main/java/blackjack/domain/Suit.java +++ b/src/main/java/blackjack/domain/Suit.java @@ -1,4 +1,18 @@ package blackjack.domain; public enum Suit { + CLOVERS("클로버"), + DIAMONDS("다이아몬드"), + HEARTS("하트"), + SPADES("스페이드"); + + private final String nameString; + + Suit(final String nameString) { + this.nameString = nameString; + } + + public String getName() { + return nameString; + } } From 6de51e6cf30b46d3402ac6846258aa8048c14c8e Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Tue, 15 Feb 2022 17:03:28 +0900 Subject: [PATCH 21/43] feat: Implement Card class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - enum타입의 suit, denomination값을 가지는 Card class 설계 --- README.md | 2 +- src/main/java/blackjack/domain/Card.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0d143d6d..43cc8e61 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ ## 기능 구현 사항 - [ ] 사람 이름 입력받기(`Input.getPlayerNames`) -- [ ] 카드는 문양값(`Suit`)과 숫자값(`Denomination`)을 가진다 (Card) +- [x] 카드는 문양값(`Suit`)과 숫자값(`Denomination`)을 가진다 (Card) - [x] 문양값(`Suit`)과 숫자값(`Denomination`)은 `enum`으로 구현한다 - [ ] 카드리스트를 가진 일급 컬렉션 Deck 구현 - [ ] 카드를 생성한다 (`Deck.setupCard()`) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index c7a20673..c4182cf6 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -2,4 +2,20 @@ public class Card { + private final Suit suit; + private final Denomination denomination; + + public Card(Suit suit, Denomination denomination) { + this.suit = suit; + this.denomination = denomination; + } + + public Suit getSuit() { + return suit; + } + + public Denomination getDenomination() { + return denomination; + } + } From ebb2b54868ab0f07dee09d04daa2a73d80c8a347 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Tue, 15 Feb 2022 17:55:01 +0900 Subject: [PATCH 22/43] feat: Implement Deck class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - deck class 구현 - field : List card - method: setupCard, setDenomination, shuffle, popCard --- README.md | 8 ++--- src/main/java/blackjack/domain/Deck.java | 36 ++++++++++++++++++++ src/test/java/blackjack/domain/DeckTest.java | 21 +++++++++++- 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 43cc8e61..9c4a360b 100644 --- a/README.md +++ b/README.md @@ -69,10 +69,10 @@ - [ ] 사람 이름 입력받기(`Input.getPlayerNames`) - [x] 카드는 문양값(`Suit`)과 숫자값(`Denomination`)을 가진다 (Card) - [x] 문양값(`Suit`)과 숫자값(`Denomination`)은 `enum`으로 구현한다 -- [ ] 카드리스트를 가진 일급 컬렉션 Deck 구현 - - [ ] 카드를 생성한다 (`Deck.setupCard()`) - - [ ] 카드를 섞는다 (`Deck.shuffle()`) - - [ ] 카드 한 장을 Gambler에게 준다 (`Deck.popCard()`) +- [x] 카드리스트를 가진 일급 컬렉션 Deck 구현 + - [x] 카드를 생성한다 (`Deck.setupCard()`) + - [x] 카드를 섞는다 (`Deck.shuffle()`) + - [x] 카드 한 장을 꺼낸다 (`Deck.popCard()`) - [x] `Dealer`와 `Player`는 `Gambler` 클래스로부터 상속을 받는다 - [ ] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) - [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 1f6951d7..a8b64529 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -1,5 +1,41 @@ package blackjack.domain; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class Deck { + private final List cards; + + public Deck() { + cards = new ArrayList<>(); + setupCard(); + shuffle(); + } + + private void setupCard() { + for (Suit suit : Suit.values()) { + setDenomination(suit); + } + } + + private void setDenomination(Suit suit) { + for (Denomination denomination : Denomination.values()) { + cards.add(new Card(suit, denomination)); + } + } + + private void shuffle() { + Collections.shuffle(cards); + } + + public Card popCard() { + Card popped = cards.remove(0); + return new Card(popped.getSuit(), popped.getDenomination()); + } + + public int getCardsCount() { + return cards.size(); + } } diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java index 310b68f7..043231c5 100644 --- a/src/test/java/blackjack/domain/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -1,7 +1,26 @@ package blackjack.domain; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class DeckTest { + public static final int TOTAL_CARDS_COUNT = 52; + public static final int ONE = 1; + + @DisplayName("덱을 생성하면 52개의 카드를 생성한다") + @Test + void testConstructor() { + Deck deck = new Deck(); + assertThat(deck.getCardsCount()).isEqualTo(TOTAL_CARDS_COUNT); + } + @DisplayName("카드를 한 장씩 꺼낸다") + @Test + void testPopCard() { + Deck deck = new Deck(); + deck.popCard(); + assertThat(deck.getCardsCount()).isEqualTo(TOTAL_CARDS_COUNT - ONE); + } } \ No newline at end of file From 5a6a77f62a8daac861777a0a2a393dd484e7be06 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Tue, 15 Feb 2022 18:28:32 +0900 Subject: [PATCH 23/43] =?UTF-8?q?feat:=20Gambler=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20?= =?UTF-8?q?Player,=20Dealer=20=EC=9E=AC=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 중복 코드 제거를 위함 - Dealer#allocateCard 메서드 구현 --- README.md | 7 ++--- src/main/java/blackjack/domain/Dealer.java | 26 +++++++------------ src/main/java/blackjack/domain/Gambler.java | 19 -------------- src/main/java/blackjack/domain/Player.java | 16 +++++++++--- .../java/blackjack/domain/DealerTest.java | 14 +++++++++- .../java/blackjack/domain/GamblerTest.java | 7 ----- 6 files changed, 38 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/blackjack/domain/Gambler.java delete mode 100644 src/test/java/blackjack/domain/GamblerTest.java diff --git a/README.md b/README.md index 9c4a360b..22c5c0db 100644 --- a/README.md +++ b/README.md @@ -73,9 +73,10 @@ - [x] 카드를 생성한다 (`Deck.setupCard()`) - [x] 카드를 섞는다 (`Deck.shuffle()`) - [x] 카드 한 장을 꺼낸다 (`Deck.popCard()`) -- [x] `Dealer`와 `Player`는 `Gambler` 클래스로부터 상속을 받는다 -- [ ] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) +- [x] `Dealer`는 `Player` 클래스로부터 상속을 받는다 +- [ ] 카드 숫자를 계산한다 (`Player.calculateScore()`) +- [x] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) +- [ ] 딜러의 처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다 (`Dealer.addOneMoreCard`) - [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) -- [ ] 카드 숫자를 계산한다 (`Gambler.calculateScore()`) - [ ] 우승자를 찾는다 (`Judgement.findWinner()`) - [ ] 최종 승패 계산하기 (`Judgement.calculateWinningRate()`) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 6199f07a..7e4b5414 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,26 +1,18 @@ package blackjack.domain; -import java.util.ArrayList; +public class Dealer extends Player { -public class Dealer extends Gambler{ + private static final String DEALER = "딜러"; - public Dealer(String name){ - this.name = name; - this.cards=new ArrayList<>(); + private final Deck deck; + public Dealer() { + super(DEALER); + this.deck= new Deck(); } - @Override - protected int calculateScore() { - return 0; - } - - @Override - protected void receiveCard() { - - } - - public Card allocateCard(){ - return null; + public void allocateCard(Player player) { + Card popped = deck.popCard(); + player.receiveCard (popped); } } diff --git a/src/main/java/blackjack/domain/Gambler.java b/src/main/java/blackjack/domain/Gambler.java deleted file mode 100644 index a933af03..00000000 --- a/src/main/java/blackjack/domain/Gambler.java +++ /dev/null @@ -1,19 +0,0 @@ -package blackjack.domain; - -import java.util.List; - -public abstract class Gambler { - protected String name; - protected List cards; - - protected abstract int calculateScore(); - protected abstract void receiveCard(); - - public String getName() { - return name; - } - - public List getCards() { - return cards; - } -} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 769ea4de..208f292a 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -3,21 +3,29 @@ import java.util.ArrayList; import java.util.List; -public class Player extends Gambler { +public class Player { + + protected String name; + protected List cards; public Player(final String name) { this.name = name; this.cards = new ArrayList<>(); } - @Override protected int calculateScore() { return 0; } + protected void receiveCard(Card card) { + cards.add(card); + } - @Override - protected void receiveCard() { + public String getName() { + return name; + } + public List getCards() { + return cards; } diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index eb2feb8d..14b9cecd 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -1,7 +1,19 @@ package blackjack.domain; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class DealerTest { + public static final int ONE = 1; + @DisplayName("딜러는 카드를 한 장씩 꺼낼 수 있다") + @Test + void testAllocateCard() { + Dealer dealer = new Dealer(); + Player player = new Player("플레이어"); + dealer.allocateCard(player); + assertThat(player.getCards().size()).isEqualTo(ONE); + } } \ No newline at end of file diff --git a/src/test/java/blackjack/domain/GamblerTest.java b/src/test/java/blackjack/domain/GamblerTest.java deleted file mode 100644 index bc8f5200..00000000 --- a/src/test/java/blackjack/domain/GamblerTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package blackjack.domain; - -import static org.junit.jupiter.api.Assertions.*; - -class GamblerTest { - -} \ No newline at end of file From 42c58436a994c35c9b346bb24676818a11ab3af4 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:29:33 +0900 Subject: [PATCH 24/43] =?UTF-8?q?feat:=20Player=20=EC=A0=90=EC=88=98=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20calculateScore=20-=20adjustScore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Player.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 208f292a..94975b7e 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -14,8 +14,21 @@ public Player(final String name) { } protected int calculateScore() { - return 0; + int score = cards.stream().mapToInt(card -> card.getDenomination().getCount()).sum(); + long aceCount = cards.stream().filter(card -> card.getDenomination().isAce()).count(); + for (int i = 0; i < aceCount; i++) { + score = adjustScore(score); + } + return score; } + + private int adjustScore(int score) { + if (score + TEN <= BUST_THRESHOLD) { + score += TEN; + } + return score; + } + protected void receiveCard(Card card) { cards.add(card); } From 1f1471e2d0b13f3eb319710eedefa595ca08f991 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:30:46 +0900 Subject: [PATCH 25/43] =?UTF-8?q?test(PlayerTest)=20:=20Player=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/PlayerTest.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java index dabfa075..fe3c4977 100644 --- a/src/test/java/blackjack/domain/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -1,7 +1,43 @@ package blackjack.domain; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class PlayerTest { + @DisplayName("보유하고 있는 카드의 점수를 모두 계산한다") + @Test + void testCalculateScore() { + Player player = new Player("A"); + player.receiveCard(new Card(Suit.CLOVERS, Denomination.EIGHT)); + player.receiveCard(new Card(Suit.DIAMONDS, Denomination.FIVE)); + int score = player.calculateScore(); + assertThat(score).isEqualTo(13); + } + + @DisplayName("보유하고 있는 카드가 ACE일 경우 21보다 작고, 21에 근접한 결과로 계산한다. 11로 계산할 경우") + @Test + void testCalculateScoreWithAceAsEleven() { + Player player = new Player("A"); + player.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + player.receiveCard(new Card(Suit.CLOVERS, Denomination.FIVE)); + int score = player.calculateScore(); + assertThat(score).isEqualTo(21); + } + + @DisplayName("보유하고 있는 카드가 ACE일 경우 21보다 작고, 21에 근접한 결과로 계산한다. 1로 계산할 경우") + @Test + void testCalculateScoreWithAceAsOne() { + Player player = new Player("A"); + player.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); + player.receiveCard(new Card(Suit.CLOVERS, Denomination.NINE)); + int score = player.calculateScore(); + assertThat(score).isEqualTo(19); + } + + } \ No newline at end of file From 678b79a670d969e715c7fa233425ebef8cd6b072 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:31:30 +0900 Subject: [PATCH 26/43] =?UTF-8?q?feat:=20Player=20=EC=A0=90=EC=88=98=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=86=8C=EB=93=9C=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/Player.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 94975b7e..6ab49d6a 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -5,6 +5,9 @@ public class Player { + private static final int TEN = 10; + private static final int BUST_THRESHOLD = 21; + protected String name; protected List cards; From 24cd7d0747fcde8967dbe0a6176b0726a2996b4f Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:32:20 +0900 Subject: [PATCH 27/43] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22c5c0db..56e02366 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ - [x] 카드를 섞는다 (`Deck.shuffle()`) - [x] 카드 한 장을 꺼낸다 (`Deck.popCard()`) - [x] `Dealer`는 `Player` 클래스로부터 상속을 받는다 -- [ ] 카드 숫자를 계산한다 (`Player.calculateScore()`) +- [x] 카드 숫자를 계산한다 (`Player.calculateScore()`) - [x] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) - [ ] 딜러의 처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다 (`Dealer.addOneMoreCard`) - [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) From c10faf7381e281a58b6ef712357af5c9b9bd4814 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:49:45 +0900 Subject: [PATCH 28/43] =?UTF-8?q?feat:=20Dealer=EC=9D=98=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=A9=EC=9D=B4=2016=EC=9D=B4=ED=95=98=EC=9D=BC?= =?UTF-8?q?=20=EB=95=8C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=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 -addOneMoreCard --- src/main/java/blackjack/domain/Dealer.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 7e4b5414..7907b6ae 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -15,4 +15,12 @@ public void allocateCard(Player player) { player.receiveCard (popped); } + public void addOneMoreCard() { + int score = calculateScore(); + if (score <= SCORE_THRESHOLD) { + cards.add(deck.popCard()); + } + } + + } From 75b59e2311832e39ad475074cd05d60447008487 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:50:08 +0900 Subject: [PATCH 29/43] =?UTF-8?q?feat:=20Dealer=EC=9D=98=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=A9=EC=9D=B4=2016=EC=9D=B4=ED=95=98=EC=9D=BC?= =?UTF-8?q?=20=EB=95=8C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=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 -addOneMoreCard --- src/main/java/blackjack/domain/Dealer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 7907b6ae..835af28b 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -2,17 +2,19 @@ public class Dealer extends Player { + private static final int SCORE_THRESHOLD = 16; private static final String DEALER = "딜러"; private final Deck deck; + public Dealer() { super(DEALER); - this.deck= new Deck(); + this.deck = new Deck(); } public void allocateCard(Player player) { Card popped = deck.popCard(); - player.receiveCard (popped); + player.receiveCard(popped); } public void addOneMoreCard() { From c2e535f83f961927d0dcb997a1e99f0e8ceec27b Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:50:53 +0900 Subject: [PATCH 30/43] =?UTF-8?q?test:=20Dealer=EC=9D=98=20addOneMoreCard?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/DealerTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 14b9cecd..03df5e5c 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -16,4 +16,24 @@ void testAllocateCard() { dealer.allocateCard(player); assertThat(player.getCards().size()).isEqualTo(ONE); } + + @DisplayName("처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다") + @Test + void testAddOneMoreCard() { + Dealer dealer = new Dealer(); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.SIX)); + dealer.addOneMoreCard(); + assertThat(dealer.getCards().size()).isEqualTo(3); + } + + @DisplayName("처음 받은 2장의 카드 합계가 16이상이면 카드 한 장을 추가로 받지 않는다") + @Test + void testAddOneMoreCardFail() { + Dealer dealer = new Dealer(); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.EIGHT)); + dealer.addOneMoreCard(); + assertThat(dealer.getCards().size()).isEqualTo(2); + } } \ No newline at end of file From 7f565e16aa52eacf44c46e5c745b851b2f10524a Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 17:50:57 +0900 Subject: [PATCH 31/43] =?UTF-8?q?feat:=20Dealer=EC=9D=98=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=A9=EC=9D=B4=2016=EC=9D=B4=ED=95=98=EC=9D=BC?= =?UTF-8?q?=20=EB=95=8C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=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 -addOneMoreCard --- src/test/java/blackjack/domain/DealerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java index 03df5e5c..df9a4cd4 100644 --- a/src/test/java/blackjack/domain/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.Test; class DealerTest { + public static final int ONE = 1; @DisplayName("딜러는 카드를 한 장씩 꺼낼 수 있다") From 8441a3003455d2517283ef3a51efde56e856d70c Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 20:20:36 +0900 Subject: [PATCH 32/43] =?UTF-8?q?feat:Judgement=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B0=BE=EA=B8=B0=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20findWinner()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Judgement.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java index 2b5b3c41..fc2146a4 100644 --- a/src/main/java/blackjack/domain/Judgement.java +++ b/src/main/java/blackjack/domain/Judgement.java @@ -1,5 +1,32 @@ package blackjack.domain; +import java.util.List; +import java.util.OptionalInt; +import java.util.stream.Collectors; + public class Judgement { + private static final String ERROR_MESSAGE = "현재 참가자가 없습니다"; + private final List players; + + public Judgement(List players) { + this.players = players; + } + + public List findWinners() { + int max = findMaxScore(); + return players.stream().filter(player -> player.calculateScore() == max) + .map(Player::getName) + .collect(Collectors.toList()); + } + + private int findMaxScore() { + OptionalInt max = players.stream().mapToInt(Player::calculateScore).max(); + if (!max.isPresent()) { + throw new RuntimeException(ERROR_MESSAGE); + } + return max.getAsInt(); + } + + } From 259ea441920deb60d7491ead25153f70da81554b Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 20:21:14 +0900 Subject: [PATCH 33/43] =?UTF-8?q?test:=20Judgement=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B0=BE=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/JudgementTest.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/test/java/blackjack/domain/JudgementTest.java b/src/test/java/blackjack/domain/JudgementTest.java index a8c81fbe..3cd02c01 100644 --- a/src/test/java/blackjack/domain/JudgementTest.java +++ b/src/test/java/blackjack/domain/JudgementTest.java @@ -1,7 +1,31 @@ package blackjack.domain; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class JudgementTest { -} \ No newline at end of file + @DisplayName("플레이어와 딜러의 결과값을 가지고 승자를 찾는다") + @Test + void testFindWinner() { + Player player1 = new Player("a"); + Player player2 = new Player("b"); + Dealer dealer = new Dealer(); + List players = Arrays.asList(player1, player2, dealer); + player1.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player1.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 20 + player2.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + player2.receiveCard(new Card(Suit.CLOVERS, Denomination.SEVEN)); + player2.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 21 + dealer.receiveCard(new Card(Suit.SPADES, Denomination.KING)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.SIX)); // 16 + + Judgement judgement = new Judgement(players); + List winners = judgement.findWinners(); + assertThat(winners).containsExactly("b"); + } +} From e0796042826d0c46559601aec6a3b1efa1ba4d64 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 22:34:48 +0900 Subject: [PATCH 34/43] =?UTF-8?q?feat:Judgement=20=EC=8A=B9=ED=8C=A8=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=8A=B9=ED=8C=A8=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?-=20findWinner()=20-=20checkWinOrLost()=20-=20getDealerResult()?= =?UTF-8?q?=20-=20getCount()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Judgement.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java index fc2146a4..5b27455d 100644 --- a/src/main/java/blackjack/domain/Judgement.java +++ b/src/main/java/blackjack/domain/Judgement.java @@ -1,13 +1,20 @@ package blackjack.domain; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; -import java.util.OptionalInt; -import java.util.stream.Collectors; +import java.util.Map; +import java.util.Objects; public class Judgement { - private static final String ERROR_MESSAGE = "현재 참가자가 없습니다"; - private final List players; + private static final String DEALER = "딜러"; + private static final int THRESHOLD = 21; + private static final String WIN = "승"; + private static final String LOSE = "패"; + + private Map playerScores; + private Map playerResults; public Judgement(List players) { this.players = players; @@ -20,13 +27,14 @@ public List findWinners() { .collect(Collectors.toList()); } - private int findMaxScore() { - OptionalInt max = players.stream().mapToInt(Player::calculateScore).max(); - if (!max.isPresent()) { - throw new RuntimeException(ERROR_MESSAGE); - } - return max.getAsInt(); + private String getDealerResult() { + long winCount = getCount(LOSE); + long loseCount = getCount(WIN); + return winCount + WIN + " " + loseCount + LOSE; } - + private long getCount(String indicator) { + return playerResults.values().stream() + .filter(result -> Objects.equals(result, indicator)).count(); + } } From fa79f669768905565495c08c095a4fbebdd60c77 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 22:34:54 +0900 Subject: [PATCH 35/43] =?UTF-8?q?test:=20Judgement=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B0=BE=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Judgement.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java index 5b27455d..f8fde114 100644 --- a/src/main/java/blackjack/domain/Judgement.java +++ b/src/main/java/blackjack/domain/Judgement.java @@ -17,14 +17,37 @@ public class Judgement { private Map playerResults; public Judgement(List players) { - this.players = players; + this.playerScores = new LinkedHashMap<>(); + this.playerResults = new LinkedHashMap<>(); + updatePlayersMap(players); + + } + + private void updatePlayersMap(List players) { + players.forEach(player -> { + playerScores.put(player.getName(), player.calculateScore()); + }); + } + + public Map findWinners() { + int dealerScore = playerScores.get(DEALER); + playerScores.remove(DEALER); + playerScores.forEach((name, score) -> { + playerResults.put(name, checkWinOrLose(dealerScore, score)); + }); + + playerResults.put(DEALER, getDealerResult()); + return Collections.synchronizedMap(new LinkedHashMap<>(playerResults)); } - public List findWinners() { - int max = findMaxScore(); - return players.stream().filter(player -> player.calculateScore() == max) - .map(Player::getName) - .collect(Collectors.toList()); + private String checkWinOrLose(int dealerScore, Integer score) { + if (score > THRESHOLD) { + return LOSE; + } + if (dealerScore > THRESHOLD || dealerScore <= score) { // 동점이면 플레이어가 이기게 설정 + return WIN; + } + return LOSE; } private String getDealerResult() { From 0b6eb9afb66051f4b20e821b3923e62a7ab4790b Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 22:36:01 +0900 Subject: [PATCH 36/43] =?UTF-8?q?test(JudgementTest):=20JudgeMent=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - testFindWinner --- .../java/blackjack/domain/JudgementTest.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/test/java/blackjack/domain/JudgementTest.java b/src/test/java/blackjack/domain/JudgementTest.java index 3cd02c01..396658db 100644 --- a/src/test/java/blackjack/domain/JudgementTest.java +++ b/src/test/java/blackjack/domain/JudgementTest.java @@ -12,20 +12,9 @@ class JudgementTest { @DisplayName("플레이어와 딜러의 결과값을 가지고 승자를 찾는다") @Test void testFindWinner() { - Player player1 = new Player("a"); - Player player2 = new Player("b"); - Dealer dealer = new Dealer(); - List players = Arrays.asList(player1, player2, dealer); - player1.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); - player1.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 20 - player2.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); - player2.receiveCard(new Card(Suit.CLOVERS, Denomination.SEVEN)); - player2.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 21 - dealer.receiveCard(new Card(Suit.SPADES, Denomination.KING)); - dealer.receiveCard(new Card(Suit.SPADES, Denomination.SIX)); // 16 - - Judgement judgement = new Judgement(players); - List winners = judgement.findWinners(); - assertThat(winners).containsExactly("b"); + Map playerResults = judgement.findWinners(); + assertThat(playerResults.get("a")).isEqualTo("승"); + assertThat(playerResults.get("b")).isEqualTo("승"); + assertThat(playerResults.get("딜러")).isEqualTo("0승 2패"); } } From f2575e4af225eb80cd6dded1a27e819fe0218b2a Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 22:36:05 +0900 Subject: [PATCH 37/43] =?UTF-8?q?test:=20Judgement=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B0=BE=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/JudgementTest.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/java/blackjack/domain/JudgementTest.java b/src/test/java/blackjack/domain/JudgementTest.java index 396658db..1e74ea10 100644 --- a/src/test/java/blackjack/domain/JudgementTest.java +++ b/src/test/java/blackjack/domain/JudgementTest.java @@ -4,12 +4,33 @@ import java.util.Arrays; import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class JudgementTest { - @DisplayName("플레이어와 딜러의 결과값을 가지고 승자를 찾는다") + static List players; + static Judgement judgement; + + @BeforeAll + static void setUp() { + Player player1 = new Player("a"); + Player player2 = new Player("b"); + Dealer dealer = new Dealer(); + players = Arrays.asList(player1, player2, dealer); + player1.receiveCard(new Card(Suit.DIAMONDS, Denomination.ACE)); + player1.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 20 + player2.receiveCard(new Card(Suit.SPADES, Denomination.FIVE)); + player2.receiveCard(new Card(Suit.CLOVERS, Denomination.SEVEN)); + player2.receiveCard(new Card(Suit.SPADES, Denomination.NINE)); // 21 + dealer.receiveCard(new Card(Suit.SPADES, Denomination.KING)); + dealer.receiveCard(new Card(Suit.SPADES, Denomination.SIX)); // 16 + judgement = new Judgement(players); + } + + @DisplayName("플레이어와 딜러의 결과값을 가지고 승패를 찾는다") @Test void testFindWinner() { Map playerResults = judgement.findWinners(); From 3ce951cfd85b16dc26a2005988f05797abdb7c8f Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 22:36:19 +0900 Subject: [PATCH 38/43] =?UTF-8?q?docs(README):=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=ED=91=9C=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 56e02366..9b8344d3 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ - [x] `Dealer`는 `Player` 클래스로부터 상속을 받는다 - [x] 카드 숫자를 계산한다 (`Player.calculateScore()`) - [x] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) -- [ ] 딜러의 처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다 (`Dealer.addOneMoreCard`) +- [x] 딜러의 처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다 (`Dealer.addOneMoreCard`) - [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) - [ ] 우승자를 찾는다 (`Judgement.findWinner()`) - [ ] 최종 승패 계산하기 (`Judgement.calculateWinningRate()`) From 232fc2334188c75dcb47e46475c5bc6e7378c632 Mon Sep 17 00:00:00 2001 From: Jiin Lee Date: Wed, 16 Feb 2022 22:36:22 +0900 Subject: [PATCH 39/43] =?UTF-8?q?test:=20Judgement=20=EC=9A=B0=EC=8A=B9?= =?UTF-8?q?=EC=9E=90=20=EC=B0=BE=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b8344d3..fba2fc86 100644 --- a/README.md +++ b/README.md @@ -78,5 +78,5 @@ - [x] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) - [x] 딜러의 처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다 (`Dealer.addOneMoreCard`) - [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) -- [ ] 우승자를 찾는다 (`Judgement.findWinner()`) -- [ ] 최종 승패 계산하기 (`Judgement.calculateWinningRate()`) +- [x] 우승자를 찾는다 (`Judgement.findWinner()`) +- [x] 최종 승패 계산하기 (`Judgement.judgeResult()`) From 2839a041c8082bf1c6f8d0e16ba8a381fef4809f Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Thu, 17 Feb 2022 18:02:33 +0900 Subject: [PATCH 40/43] feat: Implement InputView and OutputView --- README.md | 4 +- src/main/java/blackjack/domain/Card.java | 8 +++ src/main/java/blackjack/domain/Player.java | 6 +- src/main/java/blackjack/view/InputView.java | 34 ++++++++++++ src/main/java/blackjack/view/OutputView.java | 55 +++++++++++++++++++ .../java/blackjack/view/InputViewTest.java | 42 ++++++++++++++ 6 files changed, 144 insertions(+), 5 deletions(-) create mode 100644 src/test/java/blackjack/view/InputViewTest.java diff --git a/README.md b/README.md index fba2fc86..fd77d495 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ ## 기능 구현 사항 -- [ ] 사람 이름 입력받기(`Input.getPlayerNames`) +- [x] 사람 이름 입력받기(`InputView.getPlayerNames`) - [x] 카드는 문양값(`Suit`)과 숫자값(`Denomination`)을 가진다 (Card) - [x] 문양값(`Suit`)과 숫자값(`Denomination`)은 `enum`으로 구현한다 - [x] 카드리스트를 가진 일급 컬렉션 Deck 구현 @@ -77,6 +77,6 @@ - [x] 카드 숫자를 계산한다 (`Player.calculateScore()`) - [x] 딜러가 플레이어에게 카드 배분한다 (`Dealer.allocateCard()`) - [x] 딜러의 처음 받은 2장의 카드 합계가 16이하라면 카드 한 장을 추가로 받는다 (`Dealer.addOneMoreCard`) -- [ ] 카드 추가 여부 묻기 (`Input.askAddCard()`) +- [x] 카드 추가 여부 묻기 (`InputView.askAddCard()`) - [x] 우승자를 찾는다 (`Judgement.findWinner()`) - [x] 최종 승패 계산하기 (`Judgement.judgeResult()`) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index c4182cf6..25f61531 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -18,4 +18,12 @@ public Denomination getDenomination() { return denomination; } + public String getDenomiationCountstring(){ + return denomination.getCountString(); + } + + public String getSuitName(){ + return suit.getName(); + } + } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 6ab49d6a..f1664df2 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -16,7 +16,7 @@ public Player(final String name) { this.cards = new ArrayList<>(); } - protected int calculateScore() { + public int calculateScore() { int score = cards.stream().mapToInt(card -> card.getDenomination().getCount()).sum(); long aceCount = cards.stream().filter(card -> card.getDenomination().isAce()).count(); for (int i = 0; i < aceCount; i++) { @@ -25,14 +25,14 @@ protected int calculateScore() { return score; } - private int adjustScore(int score) { + public int adjustScore(int score) { if (score + TEN <= BUST_THRESHOLD) { score += TEN; } return score; } - protected void receiveCard(Card card) { + public void receiveCard(Card card) { cards.add(card); } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index ff86c007..2fe43c67 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,5 +1,39 @@ package blackjack.view; +import blackjack.domain.Player; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; +import java.util.stream.Stream; + public class InputView { + private static String GET_USER_NAMES_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + private static String ASK_PLAYER_TO_ADD_CARD = "은(는) 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"; + private static String YES = "y"; + private static String NO = "n"; + private static String ANSWER_ERROR_MESSAGE = "잘못된 입력입니다. y 또는 n을 입력해 주세요."; + private static final Scanner SCANNER = new Scanner(System.in); + + + public static List getPlayersName() { + System.out.println(GET_USER_NAMES_MESSAGE); + String[] parsedInput = SCANNER.nextLine().split(","); + Stream players = Arrays.stream(parsedInput).map(String::trim); + return players.collect(Collectors.toList()); + } + + public static boolean askAddCard(Player player) { + System.out.println(player.getName() + ASK_PLAYER_TO_ADD_CARD); + String answer = SCANNER.nextLine(); + if (YES.equals(answer)) { + return true; + } + if (NO.equals(answer)) { + return false; + } + throw new RuntimeException(ANSWER_ERROR_MESSAGE); + } + } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 911eecf5..15d223a6 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -1,5 +1,60 @@ package blackjack.view; +import blackjack.domain.Player; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + public class OutputView { + private static final String DEALER_RECEIVED_ONE_MORE_CARD = "딜러는 16이하라 한장의 카드를 더 받았습니다."; + private static final String RESULT_DELIMITER = " - 결과: "; + private static final String FINAL_RESULT = "## 최종 승패"; + private static final String COLON = ": "; + + public static void printInitialCardDistribute(List players) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("딜러와 "); + String playersString = String.join(", ", players); + stringBuilder.append(playersString); + stringBuilder.append("에게 2장의 카드를 나누었습니다."); + + System.out.println(stringBuilder); + } + + public static void printPlayersCard(List players) { + players.forEach(OutputView::printJoinedCardInfo); + printNextLine(); + } + + public static void printNextLine() { + System.out.println(); + } + + public static void printJoinedCardInfo(Player player) { + List cardsInfo = player.getCards().stream() + .map(card -> card.getDenomiationCountstring() + card.getSuitName()) + .collect(Collectors.toList()); + System.out.print(player.getName() + "카드: " + String.join(", ", cardsInfo)); + } + + public static void printDealerReceived() { + System.out.println(DEALER_RECEIVED_ONE_MORE_CARD); + } + + public static void printGameResult(List players) { + players.forEach(player -> { + printJoinedCardInfo(player); + System.out.println(RESULT_DELIMITER + player.calculateScore()); + }); + } + + public static void printFinalResult(Map results) { + System.out.println(FINAL_RESULT); + results.forEach((name, result) -> { + System.out.println(name + COLON + result); + }); + + } + } diff --git a/src/test/java/blackjack/view/InputViewTest.java b/src/test/java/blackjack/view/InputViewTest.java new file mode 100644 index 00000000..75136c0f --- /dev/null +++ b/src/test/java/blackjack/view/InputViewTest.java @@ -0,0 +1,42 @@ +package blackjack.view; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.Player; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class InputViewTest { + + @DisplayName(",로 구분된 이름들의 문자열을 리스트 형태로 반환한다") + @Test + void getPlayersName() { + String userInput = "pobi, jason"; + OutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + InputStream in = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(in); + List players = InputView.getPlayersName(); + + assertThat(players).containsExactly("pobi", "jason"); + } + + @DisplayName("y를 입력하면 true를 반환한다.") + @Test + void testAskAddCard() { + String userInput="y"; + OutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out)); + InputStream in = new ByteArrayInputStream(userInput.getBytes()); + System.setIn(in); + + boolean yesOrNo = InputView.askAddCard(new Player("pobi")); + assertThat(yesOrNo).isTrue(); + } +} \ No newline at end of file From bebd6469895f295ab3a868d355d3dc809b0e5bd5 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Thu, 17 Feb 2022 22:35:06 +0900 Subject: [PATCH 41/43] =?UTF-8?q?fix:=20static=20Scanner=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=8B=A4=ED=8C=A8=20=EC=9D=B4=EC=8A=88=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/view/InputView.java | 4 ++-- .../java/blackjack/view/InputViewTest.java | 18 +++++------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 2fe43c67..9b97df8b 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -14,10 +14,9 @@ public class InputView { private static String YES = "y"; private static String NO = "n"; private static String ANSWER_ERROR_MESSAGE = "잘못된 입력입니다. y 또는 n을 입력해 주세요."; - private static final Scanner SCANNER = new Scanner(System.in); - public static List getPlayersName() { + Scanner SCANNER = new Scanner(System.in); System.out.println(GET_USER_NAMES_MESSAGE); String[] parsedInput = SCANNER.nextLine().split(","); Stream players = Arrays.stream(parsedInput).map(String::trim); @@ -25,6 +24,7 @@ public static List getPlayersName() { } public static boolean askAddCard(Player player) { + Scanner SCANNER = new Scanner(System.in); System.out.println(player.getName() + ASK_PLAYER_TO_ADD_CARD); String answer = SCANNER.nextLine(); if (YES.equals(answer)) { diff --git a/src/test/java/blackjack/view/InputViewTest.java b/src/test/java/blackjack/view/InputViewTest.java index 75136c0f..35a749c7 100644 --- a/src/test/java/blackjack/view/InputViewTest.java +++ b/src/test/java/blackjack/view/InputViewTest.java @@ -4,10 +4,7 @@ import blackjack.domain.Player; import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -17,11 +14,8 @@ class InputViewTest { @DisplayName(",로 구분된 이름들의 문자열을 리스트 형태로 반환한다") @Test void getPlayersName() { - String userInput = "pobi, jason"; - OutputStream out = new ByteArrayOutputStream(); - System.setOut(new PrintStream(out)); - InputStream in = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(in); + InputStream inputStream = new ByteArrayInputStream("pobi,jason".getBytes()); + System.setIn(inputStream); List players = InputView.getPlayersName(); assertThat(players).containsExactly("pobi", "jason"); @@ -30,13 +24,11 @@ void getPlayersName() { @DisplayName("y를 입력하면 true를 반환한다.") @Test void testAskAddCard() { - String userInput="y"; - OutputStream out = new ByteArrayOutputStream(); - System.setOut(new PrintStream(out)); - InputStream in = new ByteArrayInputStream(userInput.getBytes()); - System.setIn(in); + InputStream inputStream = new ByteArrayInputStream("y".getBytes()); + System.setIn(inputStream); boolean yesOrNo = InputView.askAddCard(new Player("pobi")); assertThat(yesOrNo).isTrue(); } + } \ No newline at end of file From e8f4aed48012619540b8e8775e0371ad4f75b739 Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Thu, 17 Feb 2022 22:35:47 +0900 Subject: [PATCH 42/43] =?UTF-8?q?feat:=20Controller=20=EB=B0=8F=20?= =?UTF-8?q?=EB=B8=94=EB=9E=99=EC=9E=AD=20application=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/Application.java | 11 +++ .../blackjack/controller/BlackjackGame.java | 83 +++++++++++++++++++ src/main/java/blackjack/domain/Dealer.java | 13 ++- src/main/java/blackjack/domain/Judgement.java | 2 +- src/main/java/blackjack/view/OutputView.java | 12 ++- 5 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 src/main/java/blackjack/Application.java diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java new file mode 100644 index 00000000..1abf3941 --- /dev/null +++ b/src/main/java/blackjack/Application.java @@ -0,0 +1,11 @@ +package blackjack; + +import blackjack.controller.BlackjackGame; + +public class Application { + + public static void main(String[] args) { + BlackjackGame blackjackGame= new BlackjackGame(); + blackjackGame.play(); + } +} diff --git a/src/main/java/blackjack/controller/BlackjackGame.java b/src/main/java/blackjack/controller/BlackjackGame.java index 95cc043a..bbf19e6c 100644 --- a/src/main/java/blackjack/controller/BlackjackGame.java +++ b/src/main/java/blackjack/controller/BlackjackGame.java @@ -1,5 +1,88 @@ package blackjack.controller; +import blackjack.domain.Dealer; +import blackjack.domain.Judgement; +import blackjack.domain.Player; +import blackjack.view.InputView; +import blackjack.view.OutputView; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + public class BlackjackGame { + private static final int THRESHOLD = 21; + + public void play() { + List playersName = getPlayerName(); + Dealer dealer = new Dealer(); + List players = playersName.stream().map(Player::new) + .collect(Collectors.toList()); + + List allGamblers = getAllGamblers(dealer, players); + allGamblers.forEach(dealer::allocateInitialCards); + OutputView.printPlayersCard(allGamblers); + + betting(dealer, players); + + checkIfDealerGotMoreCard(dealer); + + Judgement judgement = new Judgement(allGamblers); + OutputView.printGameResult(allGamblers, judgement.findWinners()); + } + + private void betting(Dealer dealer, List players) { + List alivePlayers = players; + boolean isPlaying; + do { + isPlaying = isAnyOneGettingMoreCard(dealer, alivePlayers); + alivePlayers = filterBustedPlayer(alivePlayers); + } + while (isPlaying); + } + + private List filterBustedPlayer(List alive) { + return alive.stream().filter(player -> player.calculateScore() <= THRESHOLD) + .collect(Collectors.toList()); + } + + private boolean isAnyOneGettingMoreCard(Dealer dealer, List players) { + boolean isPlaying = false; + for (Player player : players) { + isPlaying = isPlayerGettingMoreCard(dealer, player); + } + return isPlaying; + } + + private boolean isPlayerGettingMoreCard(Dealer dealer, Player player) { + boolean answer = InputView.askAddCard(player); + if (answer) { + dealer.allocateCard(player); + OutputView.printJoinedCardInfo(player); + OutputView.printNextLine(); + return true; + } + return false; + } + + private List getPlayerName() { + List playersName = InputView.getPlayersName(); + OutputView.printInitialCardDistribute(playersName); + return playersName; + } + + private void checkIfDealerGotMoreCard(Dealer dealer) { + if (dealer.addOneMoreCard()) { + OutputView.printDealerReceived(); + } + } + + private List getAllGamblers(Dealer dealer, List players) { + List allGamblers = new ArrayList<>(); + allGamblers.add(dealer); + allGamblers.addAll(players); + return allGamblers; + } + + } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 835af28b..d3d1f305 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -4,6 +4,7 @@ public class Dealer extends Player { private static final int SCORE_THRESHOLD = 16; private static final String DEALER = "딜러"; + private static final int TWICE = 2; private final Deck deck; @@ -12,16 +13,24 @@ public Dealer() { this.deck = new Deck(); } + public void allocateInitialCards(Player player) { + for (int i = 0; i < TWICE; i++) { + Card popped = deck.popCard(); + player.receiveCard(popped); + } + } public void allocateCard(Player player) { Card popped = deck.popCard(); player.receiveCard(popped); - } - public void addOneMoreCard() { + } + public boolean addOneMoreCard() { int score = calculateScore(); if (score <= SCORE_THRESHOLD) { cards.add(deck.popCard()); + return true; } + return false; } diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java index f8fde114..3b1a746b 100644 --- a/src/main/java/blackjack/domain/Judgement.java +++ b/src/main/java/blackjack/domain/Judgement.java @@ -32,10 +32,10 @@ private void updatePlayersMap(List players) { public Map findWinners() { int dealerScore = playerScores.get(DEALER); playerScores.remove(DEALER); + playerResults.put(DEALER,""); playerScores.forEach((name, score) -> { playerResults.put(name, checkWinOrLose(dealerScore, score)); }); - playerResults.put(DEALER, getDealerResult()); return Collections.synchronizedMap(new LinkedHashMap<>(playerResults)); } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index 15d223a6..8b4cdaae 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -23,7 +23,10 @@ public static void printInitialCardDistribute(List players) { } public static void printPlayersCard(List players) { - players.forEach(OutputView::printJoinedCardInfo); + players.forEach(player -> { + printJoinedCardInfo(player); + printNextLine(); + }); printNextLine(); } @@ -42,19 +45,20 @@ public static void printDealerReceived() { System.out.println(DEALER_RECEIVED_ONE_MORE_CARD); } - public static void printGameResult(List players) { + public static void printGameResult(List players, Map results) { players.forEach(player -> { printJoinedCardInfo(player); System.out.println(RESULT_DELIMITER + player.calculateScore()); }); + printNextLine(); + printFinalResult(results); } - public static void printFinalResult(Map results) { + private static void printFinalResult(Map results) { System.out.println(FINAL_RESULT); results.forEach((name, result) -> { System.out.println(name + COLON + result); }); - } } From 07c2a2659bf073828aace6530cfc0921afaaebed Mon Sep 17 00:00:00 2001 From: Hoya-kim <1203play@gmail.com> Date: Thu, 17 Feb 2022 22:38:04 +0900 Subject: [PATCH 43/43] =?UTF-8?q?chore:=20google=20convention=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/Application.java | 2 +- src/main/java/blackjack/domain/Card.java | 4 ++-- src/main/java/blackjack/domain/Dealer.java | 2 ++ src/main/java/blackjack/domain/Judgement.java | 2 +- src/main/java/blackjack/domain/Player.java | 1 - 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java index 1abf3941..7498de0a 100644 --- a/src/main/java/blackjack/Application.java +++ b/src/main/java/blackjack/Application.java @@ -5,7 +5,7 @@ public class Application { public static void main(String[] args) { - BlackjackGame blackjackGame= new BlackjackGame(); + BlackjackGame blackjackGame = new BlackjackGame(); blackjackGame.play(); } } diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 25f61531..6586c641 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -18,11 +18,11 @@ public Denomination getDenomination() { return denomination; } - public String getDenomiationCountstring(){ + public String getDenomiationCountstring() { return denomination.getCountString(); } - public String getSuitName(){ + public String getSuitName() { return suit.getName(); } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index d3d1f305..7203d004 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -19,11 +19,13 @@ public void allocateInitialCards(Player player) { player.receiveCard(popped); } } + public void allocateCard(Player player) { Card popped = deck.popCard(); player.receiveCard(popped); } + public boolean addOneMoreCard() { int score = calculateScore(); if (score <= SCORE_THRESHOLD) { diff --git a/src/main/java/blackjack/domain/Judgement.java b/src/main/java/blackjack/domain/Judgement.java index 3b1a746b..d0d3912c 100644 --- a/src/main/java/blackjack/domain/Judgement.java +++ b/src/main/java/blackjack/domain/Judgement.java @@ -32,7 +32,7 @@ private void updatePlayersMap(List players) { public Map findWinners() { int dealerScore = playerScores.get(DEALER); playerScores.remove(DEALER); - playerResults.put(DEALER,""); + playerResults.put(DEALER, ""); playerScores.forEach((name, score) -> { playerResults.put(name, checkWinOrLose(dealerScore, score)); }); diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index f1664df2..ce5f6f7e 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -44,5 +44,4 @@ public List getCards() { return cards; } - }