From 2923419d386eb5f263fb094e32bcce5b613a3297 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 15:56:19 +0900 Subject: [PATCH 01/75] docs: Update README.md add requirements --- README.md | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03ba7ed3..dad56af3 100644 --- a/README.md +++ b/README.md @@ -1 +1,37 @@ -# java-blackjack \ No newline at end of file +# 연료 주입 + +## 기능 목록 + +- [ ] 이동거리 입력 받기 + +- [ ] 차량 별 주입 연료 필요량 구하기 + +- [ ] 보고서 생성 + +## 기능 요구 사항 + +우리 회사는 렌터카를 운영하고 있다. + +현재 보유하고 있는 차량은 Sonata 2대, Avante 1대, K5 2대로 총 5대의 차량을 보유하고 있다. + +고객이 인터넷으로부터 예약할 때 여행할 목적지의 대략적인 이동거리를 입력 받는다. + +이 이동거리를 활용해 차량 별로 필요한 연료를 주입한다. + +차량 별로 주입해야 할 연료량을 확인할 수 있는 보고서를 생성해야 한다. + +각 차량별 연비는 다음과 같다. + +* Sonata : 10km/리터 + +* Avante : 15km/리터 + +* K5 : 13km/리터 + +## 프로그래밍 요구 사항 + +* 상속과 추상 메서드를 활용한다. + +* 위 요구사항을 if/else 절을 쓰지 않고 구현해야 한다. + +* 인터페이스를 적용해 구현한다. \ No newline at end of file From a84e84ba153e713b65b5788175c89d30434cd43f Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:09:12 +0900 Subject: [PATCH 02/75] =?UTF-8?q?feat(Car):=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20=EA=B8=B0=EB=B3=B8=20=EC=B6=94=EC=83=81=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=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/empty.txt | 0 src/main/java/rentcar/domain/Car.java | 25 +++++++++++++++++++++++++ src/test/java/empty.txt | 0 3 files changed, 25 insertions(+) delete mode 100644 src/main/java/empty.txt create mode 100644 src/main/java/rentcar/domain/Car.java delete mode 100644 src/test/java/empty.txt 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/rentcar/domain/Car.java b/src/main/java/rentcar/domain/Car.java new file mode 100644 index 00000000..3ff8eb98 --- /dev/null +++ b/src/main/java/rentcar/domain/Car.java @@ -0,0 +1,25 @@ +package rentcar.domain; + +public abstract class Car { + /** + * 리터당 이동 거리. 즉, 연비 + */ + abstract double getDistancePerLiter(); + + /** + * 여행하려는 거리 + */ + abstract double getTripDistance(); + + /** + * 차종의 이름 + */ + abstract String getName(); + + /** + * 주입해야할 연료량을 구한다. + */ + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} diff --git a/src/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29b..00000000 From 8149941a93352a138cafd4ef9ff2ac76d8714bc6 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:10:10 +0900 Subject: [PATCH 03/75] =?UTF-8?q?feat(Cars):=20=EC=9E=90=EB=8F=99=EC=B0=A8?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=EC=B2=B4(=EC=86=8C=EB=82=98=ED=83=80,=20K?= =?UTF-8?q?5,=20=EC=95=84=EB=B0=98=ED=85=8C)=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/rentcar/domain/Avante.java | 36 ++++++++++++++++++++++++ src/main/java/rentcar/domain/K5.java | 36 ++++++++++++++++++++++++ src/main/java/rentcar/domain/Sonata.java | 36 ++++++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 src/main/java/rentcar/domain/Avante.java create mode 100644 src/main/java/rentcar/domain/K5.java create mode 100644 src/main/java/rentcar/domain/Sonata.java diff --git a/src/main/java/rentcar/domain/Avante.java b/src/main/java/rentcar/domain/Avante.java new file mode 100644 index 00000000..117e3a8a --- /dev/null +++ b/src/main/java/rentcar/domain/Avante.java @@ -0,0 +1,36 @@ +package rentcar.domain; + +public class Avante extends Car { + + private static final String NAME = "Avante"; + private static final double DISTANCE_PER_LITER = 15; + private static final String VALIDATE_TRIP_DISTANCE_MESSAGE = "[ERROR] 여행거리는 0 이상입니다."; + + private double tripDistance; + + public Avante(double tripDistance) { + validateTripDistance(tripDistance); + this.tripDistance = tripDistance; + } + + private void validateTripDistance(double tripDistance) { + if (tripDistance < 0) { + throw new IllegalArgumentException(VALIDATE_TRIP_DISTANCE_MESSAGE); + } + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/rentcar/domain/K5.java b/src/main/java/rentcar/domain/K5.java new file mode 100644 index 00000000..b7fdfb34 --- /dev/null +++ b/src/main/java/rentcar/domain/K5.java @@ -0,0 +1,36 @@ +package rentcar.domain; + +public class K5 extends Car { + + private static final String NAME = "K5"; + private static final double DISTANCE_PER_LITER = 13; + private static final String VALIDATE_TRIP_DISTANCE_MESSAGE = "[ERROR] 여행거리는 0 이상입니다."; + + private double tripDistance; + + public K5(double tripDistance) { + validateTripDistance(tripDistance); + this.tripDistance = tripDistance; + } + + private void validateTripDistance(double tripDistance) { + if (tripDistance < 0) { + throw new IllegalArgumentException(VALIDATE_TRIP_DISTANCE_MESSAGE); + } + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/rentcar/domain/Sonata.java b/src/main/java/rentcar/domain/Sonata.java new file mode 100644 index 00000000..066d6b90 --- /dev/null +++ b/src/main/java/rentcar/domain/Sonata.java @@ -0,0 +1,36 @@ +package rentcar.domain; + +public class Sonata extends Car { + + private static final String NAME = "Sonata"; + private static final double DISTANCE_PER_LITER = 10; + private static final String VALIDATE_TRIP_DISTANCE_MESSAGE = "[ERROR] 여행거리는 0 이상입니다."; + + private double tripDistance; + + public Sonata(double tripDistance) { + validateTripDistance(tripDistance); + this.tripDistance = tripDistance; + } + + private void validateTripDistance(double tripDistance) { + if (tripDistance < 0) { + throw new IllegalArgumentException(VALIDATE_TRIP_DISTANCE_MESSAGE); + } + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return tripDistance; + } + + @Override + String getName() { + return NAME; + } +} From 14c46a78dd811dda118f077f17a3834c4408f948 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:30:35 +0900 Subject: [PATCH 04/75] =?UTF-8?q?feat(Reportable):=20=EB=A6=AC=ED=8F=AC?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentcar/domain/Reportable.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/rentcar/domain/Reportable.java diff --git a/src/main/java/rentcar/domain/Reportable.java b/src/main/java/rentcar/domain/Reportable.java new file mode 100644 index 00000000..d9f4af2e --- /dev/null +++ b/src/main/java/rentcar/domain/Reportable.java @@ -0,0 +1,7 @@ +package rentcar.domain; + +public interface Reportable { + + String generateReport(); + +} From aab7ec1af61317dc4a6a1057405c82ada1921a79 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:31:21 +0900 Subject: [PATCH 05/75] =?UTF-8?q?feat(Car):=20=EB=A6=AC=ED=8F=AC=ED=8A=B8?= =?UTF-8?q?=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=B4,=20=EB=A6=AC=ED=8F=AC=ED=8A=B8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=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/rentcar/domain/Car.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/rentcar/domain/Car.java b/src/main/java/rentcar/domain/Car.java index 3ff8eb98..5fd55819 100644 --- a/src/main/java/rentcar/domain/Car.java +++ b/src/main/java/rentcar/domain/Car.java @@ -1,6 +1,7 @@ package rentcar.domain; -public abstract class Car { +public abstract class Car implements Reportable { + /** * 리터당 이동 거리. 즉, 연비 */ @@ -22,4 +23,9 @@ public abstract class Car { double getChargeQuantity() { return getTripDistance() / getDistancePerLiter(); } + + @Override + public String generateReport() { + return getName() + " : " + (int) getChargeQuantity() + "리터"; + } } From 2fbfb59dfd2f37b722cf8d04fdc35f4ce2f3f4bf Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:31:55 +0900 Subject: [PATCH 06/75] =?UTF-8?q?feat(RentCompany):=20=EB=A0=8C=ED=84=B0?= =?UTF-8?q?=EC=B9=B4=20=ED=9A=8C=EC=82=AC=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84,=20=EB=A6=AC=ED=8F=AC=ED=8A=B8=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EA=B8=B0=EB=8A=A5=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/rentcar/domain/RentCompany.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/rentcar/domain/RentCompany.java diff --git a/src/main/java/rentcar/domain/RentCompany.java b/src/main/java/rentcar/domain/RentCompany.java new file mode 100644 index 00000000..f2962d4b --- /dev/null +++ b/src/main/java/rentcar/domain/RentCompany.java @@ -0,0 +1,28 @@ +package rentcar.domain; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class RentCompany { + + private final List rentCars; + + private RentCompany() { + this.rentCars = new ArrayList<>(); + } + + public static RentCompany create() { + return new RentCompany(); + } + + public String generateReport() { + return rentCars.stream() + .map(Car::generateReport) + .collect(Collectors.joining("\n")); + } + + public void addCar(Car car) { + rentCars.add(car); + } +} From e019f85b070542f76c2269375f49712fb8943a4c Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:32:30 +0900 Subject: [PATCH 07/75] test(RentCompany): Testing create report --- .../java/rentcar/domain/RentCompanyTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/test/java/rentcar/domain/RentCompanyTest.java diff --git a/src/test/java/rentcar/domain/RentCompanyTest.java b/src/test/java/rentcar/domain/RentCompanyTest.java new file mode 100644 index 00000000..3f7ec6a0 --- /dev/null +++ b/src/test/java/rentcar/domain/RentCompanyTest.java @@ -0,0 +1,29 @@ +package rentcar.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import org.junit.jupiter.api.Test; + +public 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리터" + ); + } +} From 60cf0c15a8e5940ac633c6ce127f6b7d15686ec1 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 16:32:59 +0900 Subject: [PATCH 08/75] docs: Update README.md --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index dad56af3..f296de82 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,9 @@ ## 기능 목록 -- [ ] 이동거리 입력 받기 +- [X] 차량 별 주입 연료 필요량 구하기 -- [ ] 차량 별 주입 연료 필요량 구하기 - -- [ ] 보고서 생성 +- [X] 보고서 생성 ## 기능 요구 사항 From 743bf38c903b49dfa8b0a453034fc1dcab09b317 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 17:01:29 +0900 Subject: [PATCH 09/75] docs(README): Update blackjack step1 requirements --- README.md | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/README.md b/README.md index f296de82..76b7e490 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,68 @@ +# Black-Jack + +## 구현 목록 + +- 덱 + - 카드 52장 정해진 거 +- 카드 + - 무늬 => 한정 => Enum + - 숫자 => 한정 => Enum +- 플레이어 + - 카드 리스트 +- 딜러 + - 카드 리스트 + +## 기능 목록 + +- [ ] 참여할 사람의 이름 입력받기 + +- [ ] 카드 나눠주기 + +- [ ] 카드 수령 여부 + + - [ ] 딜러의 카드 합이 16 이하이면 무조건 1장을 받아야한다. + +- [ ] 결과 판정하기 + +## 기능 요구 사항 +블랙잭 게임을 변형한 프로그램을 구현한다. + +블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. + +카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. + +게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. + +딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. + +게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +## 프로그래밍 요구 사항 + +* 자바 코드 컨벤션을 지키면서 프로그래밍한다. + * 기본적으로 Google Java Style Guide을 원칙으로 한다. + * 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. +* indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다. + * 예를 들어 while문 안에 if문이 있복으면 들여쓰기는 2이다. + * 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. +* 3항 연산자를 쓰지 않는다. +* else 예약어를 쓰지 않는다. + * else 예약어를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. + * 힌트: if문에서 값을 반환하는 방식으로 구현하면 else 예약어를 사용하지 않아도 된다. +* 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외 + * 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다. + * UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다. +* 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다. + * 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라. +* 배열 대신 컬렉션을 사용한다. +* 모든 원시 값과 문자열을 포장한다 +* 줄여 쓰지 않는다(축약 금지). +* 일급 컬렉션을 쓴다. +## 추가된 요구 사항 +* 모든 엔티티를 작게 유지한다. +* 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. +* 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다. + # 연료 주입 ## 기능 목록 From 9adf74fd3b01ec3c08bee710dc1f1f2fb8cafbda Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 17:08:54 +0900 Subject: [PATCH 10/75] feat(Number): Create Number in trump --- .../java/blackjack/domain/card/Number.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Number.java diff --git a/src/main/java/blackjack/domain/card/Number.java b/src/main/java/blackjack/domain/card/Number.java new file mode 100644 index 00000000..000b16be --- /dev/null +++ b/src/main/java/blackjack/domain/card/Number.java @@ -0,0 +1,24 @@ +package blackjack.domain.card; + +public enum Number { + + ACE(1), + TWO(2), + THREE(3), + FOUR(4), + FIVE(5), + SIX(6), + SEVEN(7), + EIGHT(8), + NINE(9), + TEN(10), + JACK(10), + QUEEN(10), + KING(10); + + private final int score; + + Number(int score) { + this.score = score; + } +} From 632c050412506b6252d8924188c2b7d6c9f15ad7 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 17:09:14 +0900 Subject: [PATCH 11/75] feat(Suit): Create Suit in trump --- src/main/java/blackjack/domain/card/Suit.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Suit.java diff --git a/src/main/java/blackjack/domain/card/Suit.java b/src/main/java/blackjack/domain/card/Suit.java new file mode 100644 index 00000000..7a60c531 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Suit.java @@ -0,0 +1,15 @@ +package blackjack.domain.card; + +public enum Suit { + + SPADE("스페이드"), + DIAMOND("다이아몬드"), + HEART("하트"), + CLOVER("클로버"); + + private final String suit; + + Suit(String suit) { + this.suit = suit; + } +} From e8eec27aa78cafe87c2c2d27d3fa5c14ce0a7e2e Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 17:21:01 +0900 Subject: [PATCH 12/75] feat(Card): Create Card with Suit and Number --- src/main/java/blackjack/domain/card/Card.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Card.java diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java new file mode 100644 index 00000000..713efd5e --- /dev/null +++ b/src/main/java/blackjack/domain/card/Card.java @@ -0,0 +1,31 @@ +package blackjack.domain.card; + +import java.util.Objects; + +public class Card { + + private final Suit suit; + private final Number number; + + public Card(Suit suit, Number number) { + this.suit = suit; + this.number = number; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Card card = (Card) o; + return suit == card.suit && number == card.number; + } + + @Override + public int hashCode() { + return Objects.hash(suit, number); + } +} From f1c0a6d09cf5970f10fe61482c6435fec5c32a8e Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 17:22:00 +0900 Subject: [PATCH 13/75] =?UTF-8?q?test(CardBundle):=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?52=EC=9E=A5=EC=9D=84=20=EA=B0=96=EA=B3=A0=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EC=B9=B4=EB=93=9C=EB=B2=88=EB=93=A4=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/card/CardBundle.java | 10 ++++++++++ .../blackjack/domain/card/CardBundleTest.java | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/CardBundle.java create mode 100644 src/test/java/blackjack/domain/card/CardBundleTest.java diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java new file mode 100644 index 00000000..711a49a4 --- /dev/null +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -0,0 +1,10 @@ +package blackjack.domain.card; + +import java.util.List; + +public class CardBundle { + + public List createCards() { + return null; + } +} diff --git a/src/test/java/blackjack/domain/card/CardBundleTest.java b/src/test/java/blackjack/domain/card/CardBundleTest.java new file mode 100644 index 00000000..59ae92f5 --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardBundleTest.java @@ -0,0 +1,20 @@ +package blackjack.domain.card; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class CardBundleTest { + + @Test + void 총_52장의_서로_다른_카드를_생성한다() { + CardBundle cardBundle = new CardBundle(); + List cards = cardBundle.createCards(); + assertThat(cards.size()).isEqualTo(52); + Set removeDuplicates = new HashSet<>(cards); + assertThat(removeDuplicates.size()).isEqualTo(52); + } +} \ No newline at end of file From 4e1ac2b7ddad44ec1b5983b1a4cb6bccc249d60c Mon Sep 17 00:00:00 2001 From: PandaHun Date: Fri, 11 Feb 2022 17:25:35 +0900 Subject: [PATCH 14/75] =?UTF-8?q?feat(CardBundle):=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?52=EC=9E=A5=20=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/CardBundle.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java index 711a49a4..05d52581 100644 --- a/src/main/java/blackjack/domain/card/CardBundle.java +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -1,10 +1,21 @@ package blackjack.domain.card; +import java.util.ArrayList; import java.util.List; public class CardBundle { public List createCards() { - return null; + List cards = new ArrayList<>(); + for (Suit suit : Suit.values()) { + createBySuit(cards, suit); + } + return cards; + } + + private void createBySuit(List cards, Suit suit) { + for (Number number : Number.values()) { + cards.add(new Card(suit, number)); + } } } From a4d432c489b1a0dcb3a3c2f1d8992130ad84fa14 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 16:37:11 +0900 Subject: [PATCH 15/75] =?UTF-8?q?test(Player):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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/user/Player.java | 11 ++++++++ .../blackjack/domain/user/PlayerTest.java | 25 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/main/java/blackjack/domain/user/Player.java create mode 100644 src/test/java/blackjack/domain/user/PlayerTest.java diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java new file mode 100644 index 00000000..ee53262a --- /dev/null +++ b/src/main/java/blackjack/domain/user/Player.java @@ -0,0 +1,11 @@ +package blackjack.domain.user; + +public class Player { + + public Player(String name) { + } + + public String name() { + return null; + } +} diff --git a/src/test/java/blackjack/domain/user/PlayerTest.java b/src/test/java/blackjack/domain/user/PlayerTest.java new file mode 100644 index 00000000..ad8931e7 --- /dev/null +++ b/src/test/java/blackjack/domain/user/PlayerTest.java @@ -0,0 +1,25 @@ +package blackjack.domain.user; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +class PlayerTest { + + @ParameterizedTest + @ValueSource(strings = {"jason", "pobi"}) + void 이름을_가진_플레이어를_생성한다(String name) { + Player player = new Player(name); + assertThat(player.name()).isEqualTo(name); + } + + @Test + void 이름은_공백이_들어올_수_없다() { + assertThatThrownBy(() -> new Player(" ")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("[ERROR]"); + } +} \ No newline at end of file From e90bbd85341b78d74ef7151170f48a055aa11d22 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 16:46:13 +0900 Subject: [PATCH 16/75] feat(Player): Create Constructor and name feature --- src/main/java/blackjack/domain/user/Player.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index ee53262a..f057bd09 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -2,10 +2,20 @@ public class Player { + private final String name; + public Player(String name) { + validateName(name); + this.name = name; + } + + private void validateName(String name) { + if (name == null || name.trim().length() == 0) { + throw new IllegalArgumentException("[ERROR]"); + } } public String name() { - return null; + return name; } } From 19803f28778b78c6a8f591fae5e0fa91d11262ee Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 16:52:38 +0900 Subject: [PATCH 17/75] feat(User): Create abstract user with player, dealer --- src/main/java/blackjack/domain/user/Dealer.java | 8 ++++++++ src/main/java/blackjack/domain/user/Player.java | 3 ++- src/main/java/blackjack/domain/user/User.java | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/blackjack/domain/user/Dealer.java create mode 100644 src/main/java/blackjack/domain/user/User.java diff --git a/src/main/java/blackjack/domain/user/Dealer.java b/src/main/java/blackjack/domain/user/Dealer.java new file mode 100644 index 00000000..68b7ab43 --- /dev/null +++ b/src/main/java/blackjack/domain/user/Dealer.java @@ -0,0 +1,8 @@ +package blackjack.domain.user; + +public class Dealer extends User { + + public Dealer() { + super(); + } +} diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index f057bd09..62e619b3 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -1,10 +1,11 @@ package blackjack.domain.user; -public class Player { +public class Player extends User { private final String name; public Player(String name) { + super(); validateName(name); this.name = name; } diff --git a/src/main/java/blackjack/domain/user/User.java b/src/main/java/blackjack/domain/user/User.java new file mode 100644 index 00000000..9081727b --- /dev/null +++ b/src/main/java/blackjack/domain/user/User.java @@ -0,0 +1,17 @@ +package blackjack.domain.user; + +import blackjack.domain.card.Card; +import java.util.ArrayList; +import java.util.List; + +public abstract class User { + protected final List cards; + + protected User() { + cards = new ArrayList<>(); + } + + public void addCard(Card card) { + this.cards.add(card); + } +} From 0779b13b1cb2f2b233ad7ad457fa1660714ad43d Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 17:03:51 +0900 Subject: [PATCH 18/75] test(Deck): Test constructor and spreadCard --- src/main/java/blackjack/domain/card/Deck.java | 14 +++++++++++ .../java/blackjack/domain/card/DeckTest.java | 24 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/main/java/blackjack/domain/card/Deck.java create mode 100644 src/test/java/blackjack/domain/card/DeckTest.java diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java new file mode 100644 index 00000000..9347a6e9 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -0,0 +1,14 @@ +package blackjack.domain.card; + +import java.util.List; + +public class Deck { + + public List cards() { + return null; + } + + public Card spreadCard() { + return null; + } +} diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java new file mode 100644 index 00000000..5e538bb3 --- /dev/null +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -0,0 +1,24 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import org.junit.jupiter.api.Test; + +class DeckTest { + + @Test + void 카드번들을_제대로_받는지_테스트() { + Deck deck = new Deck(); + List cards = deck.cards(); + assertThat(cards.size()).isEqualTo(52); + } + + @Test + void 카드를_한장_뽑아준다() { + Deck deck = new Deck(); + deck.spreadCard(); + List cards = deck.cards(); + assertThat(cards.size()).isEqualTo(51); + } +} \ No newline at end of file From 1c020de8e39fd560ed73afff68ba9854e0244ad2 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 17:10:34 +0900 Subject: [PATCH 19/75] feat(CardBundle): Add shuffle in createCards --- src/main/java/blackjack/domain/card/CardBundle.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java index 05d52581..84043da9 100644 --- a/src/main/java/blackjack/domain/card/CardBundle.java +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -1,6 +1,7 @@ package blackjack.domain.card; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class CardBundle { @@ -10,6 +11,7 @@ public List createCards() { for (Suit suit : Suit.values()) { createBySuit(cards, suit); } + Collections.shuffle(cards); return cards; } From 13e6a9ddb2a416fa2cfe51d3e906cedfb46bae89 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 17:11:56 +0900 Subject: [PATCH 20/75] feat(Deck): Create Deck constructor and spreadCards, refactor testing --- src/main/java/blackjack/domain/card/Deck.java | 14 ++++++++++++-- src/test/java/blackjack/domain/card/DeckTest.java | 6 ++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index 9347a6e9..e0664823 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,14 +1,24 @@ package blackjack.domain.card; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; public class Deck { + private final Queue deck; + + public Deck(List cards) { + this.deck = new LinkedList<>(cards); + } + public List cards() { - return null; + return Collections.unmodifiableList(new ArrayList<>(deck)); } public Card spreadCard() { - return null; + return deck.poll(); } } diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 5e538bb3..70fcfaac 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -9,14 +9,16 @@ class DeckTest { @Test void 카드번들을_제대로_받는지_테스트() { - Deck deck = new Deck(); + CardBundle cardBundle = new CardBundle(); + Deck deck = new Deck(cardBundle.createCards()); List cards = deck.cards(); assertThat(cards.size()).isEqualTo(52); } @Test void 카드를_한장_뽑아준다() { - Deck deck = new Deck(); + CardBundle cardBundle = new CardBundle(); + Deck deck = new Deck(cardBundle.createCards()); deck.spreadCard(); List cards = deck.cards(); assertThat(cards.size()).isEqualTo(51); From 3b6ecd3f387058245ac625f0399cfacce1d379aa Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 17:13:47 +0900 Subject: [PATCH 21/75] feat(Deck): Create remainCardSize feature --- src/main/java/blackjack/domain/card/Deck.java | 10 ++++------ src/test/java/blackjack/domain/card/DeckTest.java | 7 ++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Deck.java b/src/main/java/blackjack/domain/card/Deck.java index e0664823..5f591d8c 100644 --- a/src/main/java/blackjack/domain/card/Deck.java +++ b/src/main/java/blackjack/domain/card/Deck.java @@ -1,7 +1,5 @@ package blackjack.domain.card; -import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; @@ -14,11 +12,11 @@ public Deck(List cards) { this.deck = new LinkedList<>(cards); } - public List cards() { - return Collections.unmodifiableList(new ArrayList<>(deck)); - } - public Card spreadCard() { return deck.poll(); } + + public int remainCardSize() { + return deck.size(); + } } diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index 70fcfaac..b4f5c14a 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.util.List; import org.junit.jupiter.api.Test; class DeckTest { @@ -11,8 +10,7 @@ class DeckTest { void 카드번들을_제대로_받는지_테스트() { CardBundle cardBundle = new CardBundle(); Deck deck = new Deck(cardBundle.createCards()); - List cards = deck.cards(); - assertThat(cards.size()).isEqualTo(52); + assertThat(deck.remainCardSize()).isEqualTo(52); } @Test @@ -20,7 +18,6 @@ class DeckTest { CardBundle cardBundle = new CardBundle(); Deck deck = new Deck(cardBundle.createCards()); deck.spreadCard(); - List cards = deck.cards(); - assertThat(cards.size()).isEqualTo(51); + assertThat(deck.remainCardSize()).isEqualTo(51); } } \ No newline at end of file From c6d79ebe2cbbc909b6fffb2f842cbcc8b39548ae Mon Sep 17 00:00:00 2001 From: PandaHun Date: Mon, 14 Feb 2022 17:32:58 +0900 Subject: [PATCH 22/75] =?UTF-8?q?refactor(Player):=20User=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=8F=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EA=B3=84?= =?UTF-8?q?=EC=B8=B5=EA=B5=AC=EC=A1=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/user/Dealer.java | 4 ++-- src/main/java/blackjack/domain/user/Player.java | 13 +++++++++++-- .../java/blackjack/domain/user/Players.java | 14 ++++++++++++++ src/main/java/blackjack/domain/user/User.java | 17 ----------------- 4 files changed, 27 insertions(+), 21 deletions(-) create mode 100644 src/main/java/blackjack/domain/user/Players.java delete mode 100644 src/main/java/blackjack/domain/user/User.java diff --git a/src/main/java/blackjack/domain/user/Dealer.java b/src/main/java/blackjack/domain/user/Dealer.java index 68b7ab43..f87b5128 100644 --- a/src/main/java/blackjack/domain/user/Dealer.java +++ b/src/main/java/blackjack/domain/user/Dealer.java @@ -1,8 +1,8 @@ package blackjack.domain.user; -public class Dealer extends User { +public class Dealer extends Player { public Dealer() { - super(); + super("딜러"); } } diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index 62e619b3..526d1067 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -1,12 +1,17 @@ package blackjack.domain.user; -public class Player extends User { +import blackjack.domain.card.Card; +import java.util.ArrayList; +import java.util.List; +public class Player { + + private final List cards; private final String name; public Player(String name) { - super(); validateName(name); + this.cards = new ArrayList<>(); this.name = name; } @@ -16,6 +21,10 @@ private void validateName(String name) { } } + public void addCard(Card card) { + this.cards.add(card); + } + public String name() { return name; } diff --git a/src/main/java/blackjack/domain/user/Players.java b/src/main/java/blackjack/domain/user/Players.java new file mode 100644 index 00000000..3dc4f5d0 --- /dev/null +++ b/src/main/java/blackjack/domain/user/Players.java @@ -0,0 +1,14 @@ +package blackjack.domain.user; + +import java.util.ArrayList; +import java.util.List; + +public class Players { + + private final List players = new ArrayList<>(); + + public Players(Dealer dealer, List players) { + this.players.add(dealer); + this.players.addAll(players); + } +} diff --git a/src/main/java/blackjack/domain/user/User.java b/src/main/java/blackjack/domain/user/User.java deleted file mode 100644 index 9081727b..00000000 --- a/src/main/java/blackjack/domain/user/User.java +++ /dev/null @@ -1,17 +0,0 @@ -package blackjack.domain.user; - -import blackjack.domain.card.Card; -import java.util.ArrayList; -import java.util.List; - -public abstract class User { - protected final List cards; - - protected User() { - cards = new ArrayList<>(); - } - - public void addCard(Card card) { - this.cards.add(card); - } -} From 04a4bae96186342744807030d18b366c72025aac Mon Sep 17 00:00:00 2001 From: PandaHun Date: Tue, 15 Feb 2022 17:38:42 +0900 Subject: [PATCH 23/75] =?UTF-8?q?test(Player):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EB=94=9C=EB=9F=AC=20=EC=97=AC=EB=B6=80,?= =?UTF-8?q?=20=EC=B9=B4=EB=93=9C=20=ED=95=A9,=20burst,=20black=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=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/user/Player.java | 28 +++++++++++++-- .../blackjack/domain/user/PlayerTest.java | 36 +++++++++++++++++++ 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index 526d1067..e0433e4c 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -6,7 +6,7 @@ public class Player { - private final List cards; + protected final List cards; private final String name; public Player(String name) { @@ -21,11 +21,35 @@ private void validateName(String name) { } } - public void addCard(Card card) { + public void drawCard(Card card) { this.cards.add(card); } public String name() { return name; } + + public boolean isPlayer() { + return true; + } + + public boolean isDealer() { + return false; + } + + public int score() { + return 0; + } + + public boolean isDrawable() { + return true; + } + + public boolean isBurst() { + return false; + } + + public boolean isBlackJack() { + return false; + } } diff --git a/src/test/java/blackjack/domain/user/PlayerTest.java b/src/test/java/blackjack/domain/user/PlayerTest.java index ad8931e7..1ad177c8 100644 --- a/src/test/java/blackjack/domain/user/PlayerTest.java +++ b/src/test/java/blackjack/domain/user/PlayerTest.java @@ -3,6 +3,9 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import blackjack.domain.card.Card; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -22,4 +25,37 @@ class PlayerTest { .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("[ERROR]"); } + + @Test + void 해당_플레이어가_딜러인지_확인할_수_있다() { + Player player = new Player("name"); + assertThat(player.isDealer()).isFalse(); + assertThat(player.isPlayer()).isTrue(); + } + + @Test + void 플레이어_카드의_합을_구할_수_있다() { + Player player = new Player("name"); + player.drawCard(new Card(Suit.CLOVER, Number.FIVE)); + player.drawCard(new Card(Suit.CLOVER, Number.SEVEN)); + assertThat(player.score()).isEqualTo(12); + } + + @Test + void 플레이어_카드의_합이_21초과라면_패배한다() { + Player player = new Player("name"); + player.drawCard(new Card(Suit.CLOVER, Number.EIGHT)); + player.drawCard(new Card(Suit.CLOVER, Number.SEVEN)); + player.drawCard(new Card(Suit.CLOVER, Number.NINE)); + assertThat(player.isBurst()).isTrue(); + } + + @Test + void 플레이어_카드의_합이_21이라면_승리한다() { + Player player = new Player("name"); + player.drawCard(new Card(Suit.CLOVER, Number.FIVE)); + player.drawCard(new Card(Suit.CLOVER, Number.SEVEN)); + player.drawCard(new Card(Suit.CLOVER, Number.NINE)); + assertThat(player.isBlackJack()).isTrue(); + } } \ No newline at end of file From 8773ed79aa3498dcf78c354e04bef115c9b8f2e0 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Tue, 15 Feb 2022 17:43:51 +0900 Subject: [PATCH 24/75] =?UTF-8?q?feat(Player):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=20=EC=B9=B4=EB=93=9C=20=ED=95=A9=20=EA=B5=AC?= =?UTF-8?q?=ED=95=98=EA=B8=B0,=20=EB=94=9C=EB=9F=AC=EC=97=AC=EB=B6=80,=20b?= =?UTF-8?q?urst,=20blackjack=20=EC=97=AC=EB=B6=80=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/card/Card.java | 4 ++++ src/main/java/blackjack/domain/card/Number.java | 4 ++++ src/main/java/blackjack/domain/user/Player.java | 14 +++++++++----- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 713efd5e..e7b045d0 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -12,6 +12,10 @@ public Card(Suit suit, Number number) { this.number = number; } + public int value() { + return number.score(); + } + @Override public boolean equals(Object o) { if (this == o) { diff --git a/src/main/java/blackjack/domain/card/Number.java b/src/main/java/blackjack/domain/card/Number.java index 000b16be..fe23149b 100644 --- a/src/main/java/blackjack/domain/card/Number.java +++ b/src/main/java/blackjack/domain/card/Number.java @@ -21,4 +21,8 @@ public enum Number { Number(int score) { this.score = score; } + + public int score() { + return score; + } } diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index e0433e4c..1edcc884 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -6,6 +6,8 @@ public class Player { + private static final int BLACK_JACK_SCORE = 21; + protected final List cards; private final String name; @@ -17,7 +19,7 @@ public Player(String name) { private void validateName(String name) { if (name == null || name.trim().length() == 0) { - throw new IllegalArgumentException("[ERROR]"); + throw new IllegalArgumentException("[ERROR] 올바르지 않은 이름의 입력 값입니다."); } } @@ -38,18 +40,20 @@ public boolean isDealer() { } public int score() { - return 0; + return cards.stream() + .mapToInt(Card::value) + .sum(); } public boolean isDrawable() { - return true; + return !isBurst(); } public boolean isBurst() { - return false; + return score() > BLACK_JACK_SCORE; } public boolean isBlackJack() { - return false; + return score() == BLACK_JACK_SCORE; } } From d8f62554897962ade6ca092db065db6412bf9309 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Tue, 15 Feb 2022 17:45:24 +0900 Subject: [PATCH 25/75] =?UTF-8?q?test(Dealer):=20=EB=94=9C=EB=9F=AC=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80,=20=ED=8C=A8=EC=9D=98=20=ED=95=A9,=20?= =?UTF-8?q?=EC=8A=B9=ED=8C=A8=20=EC=97=AC=EB=B6=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/user/DealerTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/blackjack/domain/user/DealerTest.java diff --git a/src/test/java/blackjack/domain/user/DealerTest.java b/src/test/java/blackjack/domain/user/DealerTest.java new file mode 100644 index 00000000..eb601cba --- /dev/null +++ b/src/test/java/blackjack/domain/user/DealerTest.java @@ -0,0 +1,43 @@ +package blackjack.domain.user; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; +import org.junit.jupiter.api.Test; + +public class DealerTest { + + @Test + void 딜러인지_확인할_수_있다() { + Dealer dealer = new Dealer(); + assertThat(dealer.isDealer()).isTrue(); + assertThat(dealer.isPlayer()).isFalse(); + } + + @Test + void 딜러가_가진_패의_합을_확인_할_수_있다() { + Dealer dealer = new Dealer(); + dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); + dealer.drawCard(new Card(Suit.CLOVER, Number.SIX)); + assertThat(dealer.score()).isEqualTo(11); + } + + @Test + void 딜러가_가진_패의_합이_16이하라면_패를_뽑아야_한다() { + Dealer dealer = new Dealer(); + dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); + dealer.drawCard(new Card(Suit.CLOVER, Number.SIX)); + assertThat(dealer.isDrawable()).isTrue(); + } + + @Test + void 딜러가_가진_패의_합이_21이상이라면_패배한다() { + Dealer dealer = new Dealer(); + dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); + dealer.drawCard(new Card(Suit.CLOVER, Number.SEVEN)); + dealer.drawCard(new Card(Suit.DIAMOND, Number.JACK)); + assertThat(dealer.isBurst()).isTrue(); + } +} From b11b8aa2f4edad6f516496a6d116e29db980022e Mon Sep 17 00:00:00 2001 From: PandaHun Date: Tue, 15 Feb 2022 17:49:37 +0900 Subject: [PATCH 26/75] =?UTF-8?q?feat(Dealer):=20=ED=94=8C=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=96=B4=EC=9D=B8=EC=A7=80=20=EB=94=9C=EB=9F=AC?= =?UTF-8?q?=EC=9D=B8=EC=A7=80=20=EA=B5=AC=EB=B6=84,=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=8D=94=20=EB=B0=9B=EC=95=84=EC=95=BC=ED=95=98?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=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/user/Dealer.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/blackjack/domain/user/Dealer.java b/src/main/java/blackjack/domain/user/Dealer.java index f87b5128..02c782ae 100644 --- a/src/main/java/blackjack/domain/user/Dealer.java +++ b/src/main/java/blackjack/domain/user/Dealer.java @@ -2,7 +2,24 @@ public class Dealer extends Player { + private static final int DEALER_MUST_DRAW_SCORE = 16; + public Dealer() { super("딜러"); } + + @Override + public boolean isPlayer() { + return false; + } + + @Override + public boolean isDealer() { + return true; + } + + @Override + public boolean isDrawable() { + return score() <= DEALER_MUST_DRAW_SCORE; + } } From a3a3858126115ee54d67d0cdd7e861dccc5df401 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Tue, 15 Feb 2022 18:03:17 +0900 Subject: [PATCH 27/75] =?UTF-8?q?test(Players):=20=EC=9D=BC=EA=B8=89?= =?UTF-8?q?=EC=BB=AC=EB=A0=89=EC=85=98=20=EC=83=9D=EC=84=B1,=20=EB=94=9C?= =?UTF-8?q?=EB=9F=AC=20=EB=B0=8F=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EB=B0=98=ED=99=98,=20=EB=B8=94=EB=9E=99=EC=9E=AD=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EB=B0=98=ED=99=98=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/user/Players.java | 12 ++++ .../blackjack/domain/user/PlayersTest.java | 70 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 src/test/java/blackjack/domain/user/PlayersTest.java diff --git a/src/main/java/blackjack/domain/user/Players.java b/src/main/java/blackjack/domain/user/Players.java index 3dc4f5d0..0006a57a 100644 --- a/src/main/java/blackjack/domain/user/Players.java +++ b/src/main/java/blackjack/domain/user/Players.java @@ -11,4 +11,16 @@ public Players(Dealer dealer, List players) { this.players.add(dealer); this.players.addAll(players); } + + public List findOnlyPlayers() { + return null; + } + + public Player findDealer() { + return null; + } + + public boolean hasBlackJack() { + return false; + } } diff --git a/src/test/java/blackjack/domain/user/PlayersTest.java b/src/test/java/blackjack/domain/user/PlayersTest.java new file mode 100644 index 00000000..3e890bac --- /dev/null +++ b/src/test/java/blackjack/domain/user/PlayersTest.java @@ -0,0 +1,70 @@ +package blackjack.domain.user; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class PlayersTest { + + @Test + void 딜러와_플레이어를_이용해_참가자를_구성할_수_있다() { + //given + Dealer dealer =new Dealer(); + List players = new ArrayList<>(); + players.add(new Player("Jason")); + players.add(new Player("Pobi")); + //when + Players createPlayers = new Players(dealer,players); + //then + assertThat(createPlayers).isInstanceOf(Players.class); + } + + @Test + void 참가자들_중_딜러만_반환할_수_있다() { + //given + Dealer dealer =new Dealer(); + List players = new ArrayList<>(); + players.add(new Player("Jason")); + players.add(new Player("Pobi")); + //when + Players createPlayers = new Players(dealer,players); + //then + assertThat(createPlayers.findDealer()).isEqualTo(dealer); + } + + @Test + void 참가자들_중_플레이어들만_반환할_수_있다() { + Dealer dealer =new Dealer(); + List players = new ArrayList<>(); + players.add(new Player("Jason")); + players.add(new Player("Pobi")); + //when + Players createPlayers = new Players(dealer,players); + //then + assertThat(createPlayers.findOnlyPlayers()).isEqualTo(players); + } + + @Test + void 참가자들_중_블랙잭이_있는지_확인할_수_있다() { + //given + Dealer dealer =new Dealer(); + dealer.drawCard(new Card(Suit.CLOVER, Number.ACE)); + dealer.drawCard(new Card(Suit.CLOVER, Number.KING)); + List players = new ArrayList<>(); + Player jason = new Player("jason"); + jason.drawCard(new Card(Suit.DIAMOND, Number.FIVE)); + jason.drawCard(new Card(Suit.DIAMOND, Number.SIX)); + Player pobi = new Player("pobi"); + pobi.drawCard(new Card(Suit.SPADE, Number.EIGHT)); + pobi.drawCard(new Card(Suit.SPADE, Number.NINE)); + //when + Players createPlayers = new Players(dealer,players); + //then + assertThat(createPlayers.hasBlackJack()).isTrue(); + } +} From e0aeab718e97ed488eac3d59f56788391a7ae8bd Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:15:08 +0900 Subject: [PATCH 28/75] refactor(CardFactory): Rename CardBundle to CardFactory, make singleton --- .../blackjack/domain/card/CardFactory.java | 35 +++++++++++++++++++ ...rdBundleTest.java => CardFactoryTest.java} | 6 ++-- 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 src/main/java/blackjack/domain/card/CardFactory.java rename src/test/java/blackjack/domain/card/{CardBundleTest.java => CardFactoryTest.java} (76%) diff --git a/src/main/java/blackjack/domain/card/CardFactory.java b/src/main/java/blackjack/domain/card/CardFactory.java new file mode 100644 index 00000000..247894e5 --- /dev/null +++ b/src/main/java/blackjack/domain/card/CardFactory.java @@ -0,0 +1,35 @@ +package blackjack.domain.card; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CardFactory { + + public static CardFactory INSTANCE; + + private CardFactory() { + } + + public static CardFactory getInstance() { + if (INSTANCE == null) { + INSTANCE = new CardFactory(); + } + return INSTANCE; + } + + public List createCards() { + List cards = new ArrayList<>(); + for (Suit suit : Suit.values()) { + createBySuit(cards, suit); + } + Collections.shuffle(cards); + return cards; + } + + private void createBySuit(List cards, Suit suit) { + for (Number number : Number.values()) { + cards.add(new Card(suit, number)); + } + } +} diff --git a/src/test/java/blackjack/domain/card/CardBundleTest.java b/src/test/java/blackjack/domain/card/CardFactoryTest.java similarity index 76% rename from src/test/java/blackjack/domain/card/CardBundleTest.java rename to src/test/java/blackjack/domain/card/CardFactoryTest.java index 59ae92f5..413f3540 100644 --- a/src/test/java/blackjack/domain/card/CardBundleTest.java +++ b/src/test/java/blackjack/domain/card/CardFactoryTest.java @@ -7,12 +7,12 @@ import static org.assertj.core.api.Assertions.assertThat; -class CardBundleTest { +class CardFactoryTest { @Test void 총_52장의_서로_다른_카드를_생성한다() { - CardBundle cardBundle = new CardBundle(); - List cards = cardBundle.createCards(); + CardFactory cardFactory = CardFactory.getInstance(); + List cards = cardFactory.createCards(); assertThat(cards.size()).isEqualTo(52); Set removeDuplicates = new HashSet<>(cards); assertThat(removeDuplicates.size()).isEqualTo(52); From 3b8a0064c8dac0e8df588906395c3493d8b44481 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:21:02 +0900 Subject: [PATCH 29/75] typo: Apply rename CardBundle to CardFactory --- src/test/java/blackjack/domain/card/DeckTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/blackjack/domain/card/DeckTest.java b/src/test/java/blackjack/domain/card/DeckTest.java index b4f5c14a..22c5f2b3 100644 --- a/src/test/java/blackjack/domain/card/DeckTest.java +++ b/src/test/java/blackjack/domain/card/DeckTest.java @@ -7,16 +7,16 @@ class DeckTest { @Test - void 카드번들을_제대로_받는지_테스트() { - CardBundle cardBundle = new CardBundle(); - Deck deck = new Deck(cardBundle.createCards()); + void 카드뭉치를_제대로_받는지_테스트() { + CardFactory cardFactory = CardFactory.getInstance(); + Deck deck = new Deck(cardFactory.createCards()); assertThat(deck.remainCardSize()).isEqualTo(52); } @Test void 카드를_한장_뽑아준다() { - CardBundle cardBundle = new CardBundle(); - Deck deck = new Deck(cardBundle.createCards()); + CardFactory cardFactory = CardFactory.getInstance(); + Deck deck = new Deck(cardFactory.createCards()); deck.spreadCard(); assertThat(deck.remainCardSize()).isEqualTo(51); } From ea267e28202fd2eb9217397f6dde9ef78eda03c0 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:21:50 +0900 Subject: [PATCH 30/75] test(CardBundle): Testing Cardbundle calculate sum of cards --- .../blackjack/domain/card/CardBundle.java | 26 ++++++++++--------- .../blackjack/domain/card/CardBundleTest.java | 26 +++++++++++++++++++ 2 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 src/test/java/blackjack/domain/card/CardBundleTest.java diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java index 84043da9..4ca736b6 100644 --- a/src/main/java/blackjack/domain/card/CardBundle.java +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -1,23 +1,25 @@ package blackjack.domain.card; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class CardBundle { - public List createCards() { - List cards = new ArrayList<>(); - for (Suit suit : Suit.values()) { - createBySuit(cards, suit); - } - Collections.shuffle(cards); - return cards; + private final List cards; + + private CardBundle() { + this.cards = new ArrayList<>(); + } + + public static CardBundle emptyBundle() { + return null; + } + + public void addCard(Card card) { + cards.add(card); } - private void createBySuit(List cards, Suit suit) { - for (Number number : Number.values()) { - cards.add(new Card(suit, number)); - } + public int calculateScore() { + return 0; } } diff --git a/src/test/java/blackjack/domain/card/CardBundleTest.java b/src/test/java/blackjack/domain/card/CardBundleTest.java new file mode 100644 index 00000000..8781714e --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardBundleTest.java @@ -0,0 +1,26 @@ +package blackjack.domain.card; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class CardBundleTest { + + @Test + void 카드_번들_내_카드_값의_합을_구할_수_있다() { + CardBundle cardBundle = CardBundle.emptyBundle(); + cardBundle.addCard(new Card(Suit.HEART, Number.TWO)); + cardBundle.addCard(new Card(Suit.CLOVER, Number.TWO)); + assertThat(cardBundle.calculateScore()).isEqualTo(4); + cardBundle.addCard(new Card(Suit.DIAMOND, Number.THREE)); + assertThat(cardBundle.calculateScore()).isEqualTo(7); + } + + @Test + void 카드_번들_내_ACE가_존재하고_21점_미만이라면_11로_계산한다() { + CardBundle cardBundle = CardBundle.emptyBundle(); + cardBundle.addCard(new Card(Suit.HEART, Number.ACE)); + cardBundle.addCard(new Card(Suit.CLOVER, Number.TWO)); + assertThat(cardBundle.calculateScore()).isEqualTo(13); + } +} From 2794e2cb96b961ccfeeccfd2f9f47de1fafc4601 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:30:25 +0900 Subject: [PATCH 31/75] test(ScoreStrategy): Testing Score startegy and calculate Score --- .../domain/score/AceScoreStrategy.java | 17 ++++++++ .../domain/score/DefaultScoreStrategy.java | 17 ++++++++ .../blackjack/domain/score/ScoreStrategy.java | 11 +++++ .../domain/score/ScoreStrategyTest.java | 43 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 src/main/java/blackjack/domain/score/AceScoreStrategy.java create mode 100644 src/main/java/blackjack/domain/score/DefaultScoreStrategy.java create mode 100644 src/main/java/blackjack/domain/score/ScoreStrategy.java create mode 100644 src/test/java/blackjack/domain/score/ScoreStrategyTest.java diff --git a/src/main/java/blackjack/domain/score/AceScoreStrategy.java b/src/main/java/blackjack/domain/score/AceScoreStrategy.java new file mode 100644 index 00000000..ed305521 --- /dev/null +++ b/src/main/java/blackjack/domain/score/AceScoreStrategy.java @@ -0,0 +1,17 @@ +package blackjack.domain.score; + +import blackjack.domain.card.Card; +import java.util.List; + +public class AceScoreStrategy implements ScoreStrategy { + + @Override + public boolean isSupportable(List cards) { + return false; + } + + @Override + public int calculateScore(List cards) { + return 0; + } +} diff --git a/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java b/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java new file mode 100644 index 00000000..f9058927 --- /dev/null +++ b/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java @@ -0,0 +1,17 @@ +package blackjack.domain.score; + +import blackjack.domain.card.Card; +import java.util.List; + +public class DefaultScoreStrategy implements ScoreStrategy { + + @Override + public boolean isSupportable(List cards) { + return true; + } + + @Override + public int calculateScore(List cards) { + return 0; + } +} diff --git a/src/main/java/blackjack/domain/score/ScoreStrategy.java b/src/main/java/blackjack/domain/score/ScoreStrategy.java new file mode 100644 index 00000000..6214cbd6 --- /dev/null +++ b/src/main/java/blackjack/domain/score/ScoreStrategy.java @@ -0,0 +1,11 @@ +package blackjack.domain.score; + +import blackjack.domain.card.Card; +import java.util.List; + +public interface ScoreStrategy { + + boolean isSupportable(List cards); + + int calculateScore(List cards); +} diff --git a/src/test/java/blackjack/domain/score/ScoreStrategyTest.java b/src/test/java/blackjack/domain/score/ScoreStrategyTest.java new file mode 100644 index 00000000..bcc4ae1d --- /dev/null +++ b/src/test/java/blackjack/domain/score/ScoreStrategyTest.java @@ -0,0 +1,43 @@ +package blackjack.domain.score; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class ScoreStrategyTest { + + static List aceContains; + static List defaultCards; + + @BeforeAll + static void setUp() { + aceContains = Arrays.asList(new Card(Suit.DIAMOND, Number.ACE), + new Card(Suit.CLOVER, Number.JACK)); + defaultCards = Arrays.asList(new Card(Suit.CLOVER, Number.EIGHT), + new Card(Suit.SPADE, Number.FOUR)); + } + + @Test + void ACE전략으로_ACE를_갖고_있다면_11로_점수를_계산한다() { + ScoreStrategy scoreStrategy = new AceScoreStrategy(); + assertThat(scoreStrategy.isSupportable(aceContains)).isTrue(); + assertThat(scoreStrategy.isSupportable(defaultCards)).isFalse(); + assertThat(scoreStrategy.calculateScore(aceContains)).isEqualTo(21); + assertThat(scoreStrategy.calculateScore(defaultCards)).isEqualTo(12); + } + + @Test + void 기본전략으로_모든_카드의_합을_구할_수_있다() { + ScoreStrategy scoreStrategy = new DefaultScoreStrategy(); + assertThat(scoreStrategy.isSupportable(aceContains)).isTrue(); + assertThat(scoreStrategy.isSupportable(defaultCards)).isTrue(); + assertThat(scoreStrategy.calculateScore(aceContains)).isEqualTo(11); + assertThat(scoreStrategy.calculateScore(defaultCards)).isEqualTo(12); + } +} \ No newline at end of file From ec1ad3fe01aa66ad1f5f0ebe39d0d44cd8eb4f58 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:31:14 +0900 Subject: [PATCH 32/75] feat(DefaultScoreStrategy): Create default calculate feature --- .../java/blackjack/domain/score/DefaultScoreStrategy.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java b/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java index f9058927..8a1d154f 100644 --- a/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java +++ b/src/main/java/blackjack/domain/score/DefaultScoreStrategy.java @@ -12,6 +12,8 @@ public boolean isSupportable(List cards) { @Override public int calculateScore(List cards) { - return 0; + return cards.stream() + .mapToInt(Card::value) + .sum(); } } From 6e1f474a9409ae0bc5152a3645ee75552cfbe573 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:31:41 +0900 Subject: [PATCH 33/75] feat(AceScoreStrategy): Create has ace calculate feature --- .../domain/score/AceScoreStrategy.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/score/AceScoreStrategy.java b/src/main/java/blackjack/domain/score/AceScoreStrategy.java index ed305521..00908a75 100644 --- a/src/main/java/blackjack/domain/score/AceScoreStrategy.java +++ b/src/main/java/blackjack/domain/score/AceScoreStrategy.java @@ -5,13 +5,37 @@ public class AceScoreStrategy implements ScoreStrategy { + private static final int BLACK_JACK_SCORE = 21; + private static final int ACE_WEIGHT_SCORE = 10; + + private int getAceCount(List cards) { + return (int) cards.stream() + .filter(Card::isAce) + .count(); + } + + private int convertScore(Card card) { + if (card.isAce()) { + return card.value() + ACE_WEIGHT_SCORE; + } + return card.value(); + } + @Override public boolean isSupportable(List cards) { - return false; + return getAceCount(cards) > 0; } @Override public int calculateScore(List cards) { - return 0; + int score = cards.stream() + .mapToInt(this::convertScore) + .sum(); + int aceCount = getAceCount(cards); + while (score > BLACK_JACK_SCORE && aceCount > 0) { + score -= ACE_WEIGHT_SCORE; + aceCount--; + } + return score; } } From 6bd8569407fbd720a6771efbf763747337fd92f4 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:36:45 +0900 Subject: [PATCH 34/75] test(ScroeCalculate): Test calculate score and expect strategy using cards --- .../domain/score/ScoreCalculator.java | 22 +++++++++ .../domain/score/ScoreCalculatorTest.java | 47 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/main/java/blackjack/domain/score/ScoreCalculator.java create mode 100644 src/test/java/blackjack/domain/score/ScoreCalculatorTest.java diff --git a/src/main/java/blackjack/domain/score/ScoreCalculator.java b/src/main/java/blackjack/domain/score/ScoreCalculator.java new file mode 100644 index 00000000..70896223 --- /dev/null +++ b/src/main/java/blackjack/domain/score/ScoreCalculator.java @@ -0,0 +1,22 @@ +package blackjack.domain.score; + +import blackjack.domain.card.Card; +import java.util.List; + +public enum ScoreCalculator { + + ACE, + DEFAULT; + + + ScoreCalculator() { + } + + public static ScoreCalculator findByCards(List cards) { + return null; + } + + public int calculateScore(List cards) { + return 0; + } +} diff --git a/src/test/java/blackjack/domain/score/ScoreCalculatorTest.java b/src/test/java/blackjack/domain/score/ScoreCalculatorTest.java new file mode 100644 index 00000000..289bfd8e --- /dev/null +++ b/src/test/java/blackjack/domain/score/ScoreCalculatorTest.java @@ -0,0 +1,47 @@ +package blackjack.domain.score; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class ScoreCalculatorTest { + + static List aceContains; + static List defaultCards; + + @BeforeAll + static void setUp() { + aceContains = Arrays.asList(new Card(Suit.DIAMOND, Number.ACE), + new Card(Suit.CLOVER, Number.JACK)); + defaultCards = Arrays.asList(new Card(Suit.CLOVER, Number.EIGHT), + new Card(Suit.SPADE, Number.FOUR)); + } + + @Test + void ACE_포함시_ACE_전략을_가진_계산기를_반환한다() { + ScoreCalculator scoreCalculator = ScoreCalculator.findByCards(aceContains); + assertThat(scoreCalculator).isEqualTo(ScoreCalculator.ACE); + } + + @Test + void ACE가_없을_시_기본_전략을_가진_계산기를_반환한다() { + ScoreCalculator scoreCalculator = ScoreCalculator.findByCards(defaultCards); + assertThat(scoreCalculator).isEqualTo(ScoreCalculator.DEFAULT); + } + + @Test + void 각_카드에_맞는_전략에_따라_값을_계산할_수_있다() { + int aceScore = ScoreCalculator.findByCards(aceContains) + .calculateScore(aceContains); + int defaultScore = ScoreCalculator.findByCards(defaultCards) + .calculateScore(defaultCards); + assertThat(aceScore).isEqualTo(21); + assertThat(defaultScore).isEqualTo(12); + } +} \ No newline at end of file From 850bb0b1782a01f90ffe348844a12526c916ac69 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:37:46 +0900 Subject: [PATCH 35/75] feat(ScoreCalculate): Create calculate score and expect startegy feature --- .../domain/score/ScoreCalculator.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/score/ScoreCalculator.java b/src/main/java/blackjack/domain/score/ScoreCalculator.java index 70896223..2afd189f 100644 --- a/src/main/java/blackjack/domain/score/ScoreCalculator.java +++ b/src/main/java/blackjack/domain/score/ScoreCalculator.java @@ -1,22 +1,32 @@ package blackjack.domain.score; import blackjack.domain.card.Card; +import java.util.Arrays; import java.util.List; public enum ScoreCalculator { - ACE, - DEFAULT; + ACE(new AceScoreStrategy()), + DEFAULT(new DefaultScoreStrategy()); + ScoreStrategy scoreStrategy; - ScoreCalculator() { + ScoreCalculator(ScoreStrategy scoreStrategy) { + this.scoreStrategy = scoreStrategy; } public static ScoreCalculator findByCards(List cards) { - return null; + return Arrays.stream(values()) + .filter(scoreCalculator -> scoreCalculator.isSupportable(cards)) + .findFirst() + .orElse(DEFAULT); } public int calculateScore(List cards) { - return 0; + return this.scoreStrategy.calculateScore(cards); + } + + private boolean isSupportable(List cards) { + return this.scoreStrategy.isSupportable(cards); } } From bc224bd4f854bd67f0b7b06ca297f76ca1028393 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:38:42 +0900 Subject: [PATCH 36/75] feat(Card): Add card isAce Card feature --- src/main/java/blackjack/domain/card/Card.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index e7b045d0..c00b15fe 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -16,6 +16,10 @@ public int value() { return number.score(); } + public boolean isAce() { + return number == Number.ACE; + } + @Override public boolean equals(Object o) { if (this == o) { From ca15d8b1de526f4446d23e6edec2f41f598cbcbf Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:40:13 +0900 Subject: [PATCH 37/75] feat(CardBundle): Create calcuate score, returning empty instance feature --- src/main/java/blackjack/domain/card/CardBundle.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java index 4ca736b6..0883bb75 100644 --- a/src/main/java/blackjack/domain/card/CardBundle.java +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -1,5 +1,6 @@ package blackjack.domain.card; +import blackjack.domain.score.ScoreCalculator; import java.util.ArrayList; import java.util.List; @@ -12,7 +13,7 @@ private CardBundle() { } public static CardBundle emptyBundle() { - return null; + return new CardBundle(); } public void addCard(Card card) { @@ -20,6 +21,7 @@ public void addCard(Card card) { } public int calculateScore() { - return 0; + return ScoreCalculator.findByCards(cards) + .calculateScore(cards); } } From f99d99e181d639a3c9940a8c01a31ad4b8a505e1 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:42:45 +0900 Subject: [PATCH 38/75] refactor(Player): Using CardBundle instead of List --- src/main/java/blackjack/domain/user/Player.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index 1edcc884..7873767a 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -1,20 +1,19 @@ package blackjack.domain.user; import blackjack.domain.card.Card; -import java.util.ArrayList; -import java.util.List; +import blackjack.domain.card.CardBundle; public class Player { private static final int BLACK_JACK_SCORE = 21; - protected final List cards; + protected final CardBundle cardBundle; private final String name; public Player(String name) { validateName(name); - this.cards = new ArrayList<>(); this.name = name; + this.cardBundle = CardBundle.emptyBundle(); } private void validateName(String name) { @@ -24,7 +23,7 @@ private void validateName(String name) { } public void drawCard(Card card) { - this.cards.add(card); + this.cardBundle.addCard(card); } public String name() { @@ -40,9 +39,7 @@ public boolean isDealer() { } public int score() { - return cards.stream() - .mapToInt(Card::value) - .sum(); + return cardBundle.calculateScore(); } public boolean isDrawable() { From 9ed5b64dbe91ed550b05273a172452b0c9a586a5 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Wed, 16 Feb 2022 17:44:20 +0900 Subject: [PATCH 39/75] feat(Players): Create Player first citizen, find players, dealer and hasBlackjack --- src/main/java/blackjack/domain/user/Players.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/user/Players.java b/src/main/java/blackjack/domain/user/Players.java index 0006a57a..a2707d99 100644 --- a/src/main/java/blackjack/domain/user/Players.java +++ b/src/main/java/blackjack/domain/user/Players.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; public class Players { @@ -13,14 +14,20 @@ public Players(Dealer dealer, List players) { } public List findOnlyPlayers() { - return null; + return players.stream() + .filter(Player::isPlayer) + .collect(Collectors.toList()); } public Player findDealer() { - return null; + return players.stream() + .filter(Player::isDealer) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 딜러가 존재하지 않습니다.")); } public boolean hasBlackJack() { - return false; + return players.stream() + .anyMatch(Player::isBlackJack); } } From f7335375c32509bf9968ecb31ffb56dac27a94cb Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:46:13 +0900 Subject: [PATCH 40/75] feat(Number): Add message for reading number --- .../java/blackjack/domain/card/Number.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Number.java b/src/main/java/blackjack/domain/card/Number.java index fe23149b..8d1e2977 100644 --- a/src/main/java/blackjack/domain/card/Number.java +++ b/src/main/java/blackjack/domain/card/Number.java @@ -2,27 +2,33 @@ public enum Number { - ACE(1), - TWO(2), - THREE(3), - FOUR(4), - FIVE(5), - SIX(6), - SEVEN(7), - EIGHT(8), - NINE(9), - TEN(10), - JACK(10), - QUEEN(10), - KING(10); + 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 score; + private final String message; - Number(int score) { + Number(int score, String message) { this.score = score; + this.message = message; } public int score() { return score; } + + public String message() { + return message; + } } From 57f4cab1b3b3d01feaaf622595f227f0081b6d11 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:46:47 +0900 Subject: [PATCH 41/75] feat(Suit): Add get suit feature --- src/main/java/blackjack/domain/card/Suit.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/blackjack/domain/card/Suit.java b/src/main/java/blackjack/domain/card/Suit.java index 7a60c531..3a16e147 100644 --- a/src/main/java/blackjack/domain/card/Suit.java +++ b/src/main/java/blackjack/domain/card/Suit.java @@ -12,4 +12,8 @@ public enum Suit { Suit(String suit) { this.suit = suit; } + + public String suit() { + return this.suit; + } } From 557cacd6ff99d71ec133b914b197631152bc4849 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:47:58 +0900 Subject: [PATCH 42/75] feat(Card): Add get Suit, Number message and value feature --- src/main/java/blackjack/domain/card/Card.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index c00b15fe..fa1afe43 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -12,14 +12,22 @@ public Card(Suit suit, Number number) { this.number = number; } - public int value() { - return number.score(); - } - public boolean isAce() { return number == Number.ACE; } + public String message() { + return number.message(); + } + + public String suit() { + return suit.suit(); + } + + public int value() { + return number.score(); + } + @Override public boolean equals(Object o) { if (this == o) { From fa2849301e55c8bccc2611164791b755282597d7 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:49:21 +0900 Subject: [PATCH 43/75] feat(CardBundle): Add get Cards using unmodifiable --- src/main/java/blackjack/domain/card/CardBundle.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java index 0883bb75..ffc48a57 100644 --- a/src/main/java/blackjack/domain/card/CardBundle.java +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -2,6 +2,7 @@ import blackjack.domain.score.ScoreCalculator; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class CardBundle { @@ -24,4 +25,8 @@ public int calculateScore() { return ScoreCalculator.findByCards(cards) .calculateScore(cards); } + + public List getCards() { + return Collections.unmodifiableList(cards); + } } From 63a9ede8c0798acbf16851b94df84c749d6481b1 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:55:57 +0900 Subject: [PATCH 44/75] feat(InputView): Create get player names from console --- src/main/java/blackjack/view/InputView.java | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/blackjack/view/InputView.java diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..250ccfb6 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,22 @@ +package blackjack.view; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class InputView { + + private static final Scanner scanner = new Scanner(System.in); + + private InputView() { + } + + public static List getPlayerNames() { + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + String playerNames = scanner.nextLine(); + return Arrays.stream(playerNames.split(",")) + .map(String::trim) + .collect(Collectors.toList()); + } +} From 6660f488a6f35398b5a6cd2a1a1e80d70a80905c Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:56:57 +0900 Subject: [PATCH 45/75] test(BlackJack): Test initialize blackjack with player names --- .../java/blackjack/controller/BlackJack.java | 13 +++++++++++++ .../blackjack/controller/BlackJackTest.java | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 src/main/java/blackjack/controller/BlackJack.java create mode 100644 src/test/java/blackjack/controller/BlackJackTest.java diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java new file mode 100644 index 00000000..97f0bfdd --- /dev/null +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -0,0 +1,13 @@ +package blackjack.controller; + +import java.util.List; + +public class BlackJack { + + private BlackJack() { + } + + public static BlackJack init(List playerNames) { + return null; + } +} diff --git a/src/test/java/blackjack/controller/BlackJackTest.java b/src/test/java/blackjack/controller/BlackJackTest.java new file mode 100644 index 00000000..81dde54d --- /dev/null +++ b/src/test/java/blackjack/controller/BlackJackTest.java @@ -0,0 +1,18 @@ +package blackjack.controller; + + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; + +class BlackJackTest { + + @Test + void 플레이어들의_이름을_입력받아_블랙잭_게임을_생성할_수_있다() { + List playerNames = Arrays.asList("pobi", "jason", "toby"); + BlackJack blackJack = BlackJack.init(playerNames); + assertThat(blackJack).isInstanceOf(BlackJack.class); + } +} \ No newline at end of file From 8eeb9416cee444e152783654eb46a21795887bd5 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:58:19 +0900 Subject: [PATCH 46/75] feat(BlackJack): Create initialize blackjack with player names --- .../java/blackjack/controller/BlackJack.java | 22 +++++++++++++++++-- .../blackjack/controller/BlackJackTest.java | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index 97f0bfdd..d73e393f 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -1,13 +1,31 @@ package blackjack.controller; +import blackjack.domain.card.CardFactory; +import blackjack.domain.card.Deck; +import blackjack.domain.user.Dealer; +import blackjack.domain.user.Player; +import blackjack.domain.user.Players; import java.util.List; +import java.util.stream.Collectors; public class BlackJack { - private BlackJack() { + private final Players players; + private final Deck deck; + + private BlackJack(Players players, Deck deck) { + this.players = players; + this.deck = deck; } public static BlackJack init(List playerNames) { - return null; + Dealer dealer = new Dealer(); + Players candidates = playerNames.stream() + .map(Player::new) + .collect(Collectors.collectingAndThen(Collectors.toList(), + players -> new Players(dealer, players))); + CardFactory cardFactory = CardFactory.getInstance(); + Deck deck = new Deck(cardFactory.createCards()); + return new BlackJack(candidates, deck); } } diff --git a/src/test/java/blackjack/controller/BlackJackTest.java b/src/test/java/blackjack/controller/BlackJackTest.java index 81dde54d..263fe2c6 100644 --- a/src/test/java/blackjack/controller/BlackJackTest.java +++ b/src/test/java/blackjack/controller/BlackJackTest.java @@ -15,4 +15,4 @@ class BlackJackTest { BlackJack blackJack = BlackJack.init(playerNames); assertThat(blackJack).isInstanceOf(BlackJack.class); } -} \ No newline at end of file +} From 6cead3f11a987789cc8f02c77b04ee66e437a1bf Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 16:59:23 +0900 Subject: [PATCH 47/75] feat(Application): Create run blackjack game using application --- src/main/java/blackjack/BlackjackApplication.java | 14 ++++++++++++++ src/main/java/blackjack/controller/BlackJack.java | 4 ++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/blackjack/BlackjackApplication.java diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java new file mode 100644 index 00000000..07e102cc --- /dev/null +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -0,0 +1,14 @@ +package blackjack; + +import blackjack.controller.BlackJack; +import blackjack.view.InputView; +import java.util.List; + +public class BlackjackApplication { + + public static void main(String[] args) { + List playerNames = InputView.getPlayerNames(); + BlackJack blackJack = BlackJack.init(playerNames); + blackJack.runGame(); + } +} diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index d73e393f..a47f399b 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -28,4 +28,8 @@ public static BlackJack init(List playerNames) { Deck deck = new Deck(cardFactory.createCards()); return new BlackJack(candidates, deck); } + + public void runGame() { + + } } From 8a0a4317e0cf6235a2f71cfc79a985953df1899c Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:02:25 +0900 Subject: [PATCH 48/75] feat(BlackJack): Add spread start cards to players, dealer --- src/main/java/blackjack/controller/BlackJack.java | 5 +++++ src/main/java/blackjack/domain/user/Players.java | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index a47f399b..c19e9f26 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -5,6 +5,7 @@ import blackjack.domain.user.Dealer; import blackjack.domain.user.Player; import blackjack.domain.user.Players; +import blackjack.view.OutputView; import java.util.List; import java.util.stream.Collectors; @@ -30,6 +31,10 @@ public static BlackJack init(List playerNames) { } public void runGame() { + spreadStartCards(); + } + private void spreadStartCards() { + players.drawStartCards(deck); } } diff --git a/src/main/java/blackjack/domain/user/Players.java b/src/main/java/blackjack/domain/user/Players.java index a2707d99..0e676dcb 100644 --- a/src/main/java/blackjack/domain/user/Players.java +++ b/src/main/java/blackjack/domain/user/Players.java @@ -1,11 +1,14 @@ package blackjack.domain.user; +import blackjack.domain.card.Deck; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Players { + public static final int START_CARD_INIT_SIZE = 2; + private final List players = new ArrayList<>(); public Players(Dealer dealer, List players) { @@ -30,4 +33,10 @@ public boolean hasBlackJack() { return players.stream() .anyMatch(Player::isBlackJack); } + + public void drawStartCards(Deck deck) { + for (int i = 0; i < START_CARD_INIT_SIZE; i++) { + players.forEach(player -> player.drawCard(deck.spreadCard())); + } + } } From 0c72f30efa5286d0aa253cf43e44df9c3c5acf64 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:03:15 +0900 Subject: [PATCH 49/75] feat(OutputView): Create with show starts cards status with players, dealer --- .../java/blackjack/controller/BlackJack.java | 1 + src/main/java/blackjack/view/OutputView.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/main/java/blackjack/view/OutputView.java diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index c19e9f26..627a222e 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -36,5 +36,6 @@ public void runGame() { private void spreadStartCards() { players.drawStartCards(deck); + OutputView.printAllPlayersCard(players); } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java new file mode 100644 index 00000000..ed3acdd7 --- /dev/null +++ b/src/main/java/blackjack/view/OutputView.java @@ -0,0 +1,51 @@ +package blackjack.view; + +import static blackjack.domain.user.Players.START_CARD_INIT_SIZE; + +import blackjack.domain.card.Card; +import blackjack.domain.user.Player; +import blackjack.domain.user.Players; +import java.util.List; +import java.util.stream.Collectors; + +public class OutputView { + + private OutputView() { + } + + public static void printAllPlayersCard(Players players) { + List candiates = players.findOnlyPlayers(); + Player dealer = players.findDealer(); + System.out.printf("\n딜러와 %s에게 %d장 나누었습니다.\n", collectPlayerNames(candiates), + START_CARD_INIT_SIZE); + System.out.printf("%s : %s\n", dealer.name(), collectDealerCard(dealer)); + candiates.forEach(OutputView::printEachCardInfo); + System.out.println(); + } + + private static String collectPlayerNames(List candiates) { + return candiates.stream() + .map(Player::name) + .collect(Collectors.joining(",")); + } + + private static String collectDealerCard(Player dealer) { + List cards = dealer.getCardBundle(); + return makeCardInfo(cards.get(0)); + } + + private static String makeCardInfo(Card card) { + return String.join("", card.message(), card.suit()); + } + + public static void printEachCardInfo(Player player) { + System.out.printf("%s : %s\n", player.name(), collectPlayerCard(player)); + } + + private static String collectPlayerCard(Player player) { + List cards = player.getCardBundle(); + return cards.stream() + .map(OutputView::makeCardInfo) + .collect(Collectors.joining(", ")); + } +} From 103f96b8ea30949b9a2c542d0eb7dd581db95da1 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:04:12 +0900 Subject: [PATCH 50/75] refactor(Player): Modify isDrawable condition when notBurst and notBlackJack --- src/main/java/blackjack/domain/user/Player.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index 7873767a..e1b615bb 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -2,6 +2,7 @@ import blackjack.domain.card.Card; import blackjack.domain.card.CardBundle; +import java.util.List; public class Player { @@ -43,7 +44,7 @@ public int score() { } public boolean isDrawable() { - return !isBurst(); + return !isBurst() && !isBlackJack(); } public boolean isBurst() { From 32e0ef42dace0fdb2787bcc97f62af6d14acb81b Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:26:31 +0900 Subject: [PATCH 51/75] test(DrawRequest): Test initialize DrawRequest from user command, and drwable --- .../blackjack/domain/request/DrawRequest.java | 15 +++++++ .../domain/request/DrawRequestTest.java | 45 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/main/java/blackjack/domain/request/DrawRequest.java create mode 100644 src/test/java/blackjack/domain/request/DrawRequestTest.java diff --git a/src/main/java/blackjack/domain/request/DrawRequest.java b/src/main/java/blackjack/domain/request/DrawRequest.java new file mode 100644 index 00000000..8b4da15d --- /dev/null +++ b/src/main/java/blackjack/domain/request/DrawRequest.java @@ -0,0 +1,15 @@ +package blackjack.domain.request; + +public class DrawRequest { + + private DrawRequest(boolean request) { + } + + public static DrawRequest valueOf(String command) { + return null; + } + + public boolean isDrawable() { + return true; + } +} diff --git a/src/test/java/blackjack/domain/request/DrawRequestTest.java b/src/test/java/blackjack/domain/request/DrawRequestTest.java new file mode 100644 index 00000000..be308320 --- /dev/null +++ b/src/test/java/blackjack/domain/request/DrawRequestTest.java @@ -0,0 +1,45 @@ +package blackjack.domain.request; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class DrawRequestTest { + + @Test + void 입력받은_요청으로_올바르게_생성자를_생성할_수_있다() { + assertThat(DrawRequest.valueOf("y")).isInstanceOf(DrawRequest.class); + assertThat(DrawRequest.valueOf("n")).isInstanceOf(DrawRequest.class); + } + + @Test + void 올바르지_않은_요청일_경우_예외가_발생한다() { + assertAll( + () -> assertThatThrownBy(() -> DrawRequest.valueOf("no")).isInstanceOf( + IllegalArgumentException.class), + () -> assertThatThrownBy(() -> DrawRequest.valueOf("yes")).isInstanceOf( + IllegalArgumentException.class) + ); + } + + @Test + void 빈_요청일_경우_예외가_발생한다() { + assertAll( + () -> assertThatThrownBy(() -> DrawRequest.valueOf(" ")).isInstanceOf( + IllegalArgumentException.class), + () -> assertThatThrownBy(() -> DrawRequest.valueOf(null)).isInstanceOf( + IllegalArgumentException.class) + ); + } + + @ParameterizedTest + @CsvSource(value = {"y|true", "n|false"}, delimiter = '|') + void 입력받은_요청에_따라_더_뽑을_수_있는지_확인할_수_있다(String request, boolean result) { + DrawRequest drawRequest = DrawRequest.valueOf(request); + assertThat(drawRequest.isDrawable()).isEqualTo(result); + } +} \ No newline at end of file From d81132c1a7fe3d6b86c66d35c406de5043691e03 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:27:24 +0900 Subject: [PATCH 52/75] feat(DrawRequest): Create Initialize using user command, and return is drawable --- .../blackjack/domain/request/DrawRequest.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/request/DrawRequest.java b/src/main/java/blackjack/domain/request/DrawRequest.java index 8b4da15d..1e58e2a3 100644 --- a/src/main/java/blackjack/domain/request/DrawRequest.java +++ b/src/main/java/blackjack/domain/request/DrawRequest.java @@ -2,14 +2,31 @@ public class DrawRequest { + private final boolean request; + private DrawRequest(boolean request) { + this.request = request; } public static DrawRequest valueOf(String command) { - return null; + validateCommand(command); + return new DrawRequest(findByCommand(command)); } public boolean isDrawable() { - return true; + return request; + } + + private static boolean findByCommand(String command) { + return "y".equals(command); + } + + private static void validateCommand(String command) { + if (command == null || command.trim().length() == 0) { + throw new IllegalArgumentException("[ERROR] 아무 요청이 입력되지 않았습니다."); + } + if (!"y".equals(command) && !"n".equals(command)) { + throw new IllegalArgumentException(String.format("[ERROR] %s는 올바른 요청이 아닙니다", command)); + } } } From fef941b50c9f32c6e68191873ab4a3f837c22935 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:28:16 +0900 Subject: [PATCH 53/75] feat(InputView): Add get DrawRequest from console --- src/main/java/blackjack/view/InputView.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 250ccfb6..ab218caf 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,5 +1,6 @@ package blackjack.view; +import blackjack.domain.user.Player; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -19,4 +20,9 @@ public static List getPlayerNames() { .map(String::trim) .collect(Collectors.toList()); } + + public static String getDrawRequest(Player player) { + System.out.printf("%s는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)", player.name()); + return scanner.nextLine(); + } } From 1f4d8c79c74ff13fb8ef02ada088a510bf6a24cf Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:29:06 +0900 Subject: [PATCH 54/75] feat(BlackJack): Add draw each player card from player requests --- .../java/blackjack/controller/BlackJack.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index 627a222e..cf9d0085 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -5,7 +5,9 @@ import blackjack.domain.user.Dealer; import blackjack.domain.user.Player; import blackjack.domain.user.Players; +import blackjack.view.InputView; import blackjack.view.OutputView; +import blackjack.domain.request.DrawRequest; import java.util.List; import java.util.stream.Collectors; @@ -32,10 +34,31 @@ public static BlackJack init(List playerNames) { public void runGame() { spreadStartCards(); + if (!players.hasBlackJack()) { + drawPlayers(); + } } private void spreadStartCards() { players.drawStartCards(deck); OutputView.printAllPlayersCard(players); } + + private void drawPlayers() { + for (Player player : players.findOnlyPlayers()) { + drawEachPlayer(player); + } + } + + private void drawEachPlayer(Player player) { + while (player.isDrawable() && getPlayerRequest(player)) { + player.drawCard(deck.spreadCard()); + } + } + + private boolean getPlayerRequest(Player player) { + String drawRequest = InputView.getDrawRequest(player); + return DrawRequest.valueOf(drawRequest) + .isDrawable(); + } } From 8b2010fc7c3a40a3315c43c373fd39411d0bacd4 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:29:58 +0900 Subject: [PATCH 55/75] refactor(OutputView): modify ordering in convention --- src/main/java/blackjack/view/OutputView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index ed3acdd7..fa3eeada 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -23,6 +23,10 @@ public static void printAllPlayersCard(Players players) { System.out.println(); } + public static void printEachCardInfo(Player player) { + System.out.printf("%s : %s\n", player.name(), collectPlayerCard(player)); + } + private static String collectPlayerNames(List candiates) { return candiates.stream() .map(Player::name) @@ -38,10 +42,6 @@ private static String makeCardInfo(Card card) { return String.join("", card.message(), card.suit()); } - public static void printEachCardInfo(Player player) { - System.out.printf("%s : %s\n", player.name(), collectPlayerCard(player)); - } - private static String collectPlayerCard(Player player) { List cards = player.getCardBundle(); return cards.stream() From a9326d5330cd8d290df04432b10a47845d7e7cf9 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:30:30 +0900 Subject: [PATCH 56/75] feat(BlackJack): Add print each players card information --- src/main/java/blackjack/controller/BlackJack.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index cf9d0085..254d5a16 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -53,6 +53,7 @@ private void drawPlayers() { private void drawEachPlayer(Player player) { while (player.isDrawable() && getPlayerRequest(player)) { player.drawCard(deck.spreadCard()); + OutputView.printEachCardInfo(player); } } From 59c320bae9c58a9032106526564a3cd12ecaafba Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:32:32 +0900 Subject: [PATCH 57/75] refactor(Players): Modify returning dealer instance instead of player --- src/main/java/blackjack/domain/user/Players.java | 4 ++-- .../java/blackjack/domain/user/PlayersTest.java | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/blackjack/domain/user/Players.java b/src/main/java/blackjack/domain/user/Players.java index 0e676dcb..9a0e6361 100644 --- a/src/main/java/blackjack/domain/user/Players.java +++ b/src/main/java/blackjack/domain/user/Players.java @@ -22,8 +22,8 @@ public List findOnlyPlayers() { .collect(Collectors.toList()); } - public Player findDealer() { - return players.stream() + public Dealer findDealer() { + return (Dealer) players.stream() .filter(Player::isDealer) .findFirst() .orElseThrow(() -> new IllegalArgumentException("[ERROR] 딜러가 존재하지 않습니다.")); diff --git a/src/test/java/blackjack/domain/user/PlayersTest.java b/src/test/java/blackjack/domain/user/PlayersTest.java index 3e890bac..0736b9c1 100644 --- a/src/test/java/blackjack/domain/user/PlayersTest.java +++ b/src/test/java/blackjack/domain/user/PlayersTest.java @@ -14,12 +14,12 @@ public class PlayersTest { @Test void 딜러와_플레이어를_이용해_참가자를_구성할_수_있다() { //given - Dealer dealer =new Dealer(); + Dealer dealer = new Dealer(); List players = new ArrayList<>(); players.add(new Player("Jason")); players.add(new Player("Pobi")); //when - Players createPlayers = new Players(dealer,players); + Players createPlayers = new Players(dealer, players); //then assertThat(createPlayers).isInstanceOf(Players.class); } @@ -27,24 +27,24 @@ public class PlayersTest { @Test void 참가자들_중_딜러만_반환할_수_있다() { //given - Dealer dealer =new Dealer(); + Dealer dealer = new Dealer(); List players = new ArrayList<>(); players.add(new Player("Jason")); players.add(new Player("Pobi")); //when - Players createPlayers = new Players(dealer,players); + Players createPlayers = new Players(dealer, players); //then assertThat(createPlayers.findDealer()).isEqualTo(dealer); } @Test void 참가자들_중_플레이어들만_반환할_수_있다() { - Dealer dealer =new Dealer(); + Dealer dealer = new Dealer(); List players = new ArrayList<>(); players.add(new Player("Jason")); players.add(new Player("Pobi")); //when - Players createPlayers = new Players(dealer,players); + Players createPlayers = new Players(dealer, players); //then assertThat(createPlayers.findOnlyPlayers()).isEqualTo(players); } @@ -52,7 +52,7 @@ public class PlayersTest { @Test void 참가자들_중_블랙잭이_있는지_확인할_수_있다() { //given - Dealer dealer =new Dealer(); + Dealer dealer = new Dealer(); dealer.drawCard(new Card(Suit.CLOVER, Number.ACE)); dealer.drawCard(new Card(Suit.CLOVER, Number.KING)); List players = new ArrayList<>(); @@ -63,7 +63,7 @@ public class PlayersTest { pobi.drawCard(new Card(Suit.SPADE, Number.EIGHT)); pobi.drawCard(new Card(Suit.SPADE, Number.NINE)); //when - Players createPlayers = new Players(dealer,players); + Players createPlayers = new Players(dealer, players); //then assertThat(createPlayers.hasBlackJack()).isTrue(); } From 55bd18118a53a441d4b410a9f8f78b0c89605694 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:34:31 +0900 Subject: [PATCH 58/75] feat(Player): Add returning cardBundle cards --- src/main/java/blackjack/domain/user/Player.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index e1b615bb..d416b642 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -54,4 +54,8 @@ public boolean isBurst() { public boolean isBlackJack() { return score() == BLACK_JACK_SCORE; } + + public List getCardBundle() { + return cardBundle.getCards(); + } } From ee44ffc452c31c60cb09f5c90cdddf5857457f63 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:35:04 +0900 Subject: [PATCH 59/75] feat(BlackJack): Add drawDealer when dealer isDrawable --- src/main/java/blackjack/controller/BlackJack.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index 254d5a16..d4ac31c4 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -36,6 +36,7 @@ public void runGame() { spreadStartCards(); if (!players.hasBlackJack()) { drawPlayers(); + drawDealer(); } } @@ -62,4 +63,11 @@ private boolean getPlayerRequest(Player player) { return DrawRequest.valueOf(drawRequest) .isDrawable(); } + + private void drawDealer() { + Dealer dealer = players.findDealer(); + while (dealer.isDrawable()) { + dealer.drawCard(deck.spreadCard()); + } + } } From ed02a3a878a748172b2bfa267f484b96dfa4326b Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:35:46 +0900 Subject: [PATCH 60/75] feat(OutputView): Add print dealer get Card message and apply BlackJack --- src/main/java/blackjack/controller/BlackJack.java | 1 + src/main/java/blackjack/view/OutputView.java | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index d4ac31c4..908309ce 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -68,6 +68,7 @@ private void drawDealer() { Dealer dealer = players.findDealer(); while (dealer.isDrawable()) { dealer.drawCard(deck.spreadCard()); + OutputView.printDealerGetCard(); } } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index fa3eeada..d00a59f8 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -27,6 +27,10 @@ public static void printEachCardInfo(Player player) { System.out.printf("%s : %s\n", player.name(), collectPlayerCard(player)); } + public static void printDealerGetCard() { + System.out.println("\n딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); + } + private static String collectPlayerNames(List candiates) { return candiates.stream() .map(Player::name) From c1a136ab1c82b5460c7568f6f0b4f1b73ee4aaa0 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 17:51:50 +0900 Subject: [PATCH 61/75] refactor(Player): remove isBurst and isBlackJack move to cardBundle --- src/main/java/blackjack/domain/card/CardBundle.java | 10 ++++++++++ src/main/java/blackjack/domain/user/Player.java | 13 ++++--------- src/test/java/blackjack/domain/user/DealerTest.java | 9 --------- src/test/java/blackjack/domain/user/PlayerTest.java | 9 --------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/main/java/blackjack/domain/card/CardBundle.java b/src/main/java/blackjack/domain/card/CardBundle.java index ffc48a57..975c7736 100644 --- a/src/main/java/blackjack/domain/card/CardBundle.java +++ b/src/main/java/blackjack/domain/card/CardBundle.java @@ -7,6 +7,8 @@ public class CardBundle { + private static final int BLACK_JACK_SCORE = 21; + private final List cards; private CardBundle() { @@ -29,4 +31,12 @@ public int calculateScore() { public List getCards() { return Collections.unmodifiableList(cards); } + + public boolean isBurst() { + return calculateScore() > BLACK_JACK_SCORE; + } + + public boolean isBlackJack() { + return calculateScore() == BLACK_JACK_SCORE; + } } diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index d416b642..2859993c 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -6,7 +6,6 @@ public class Player { - private static final int BLACK_JACK_SCORE = 21; protected final CardBundle cardBundle; private final String name; @@ -44,18 +43,14 @@ public int score() { } public boolean isDrawable() { - return !isBurst() && !isBlackJack(); + return !cardBundle.isBlackJack() && !cardBundle.isBurst(); } - public boolean isBurst() { - return score() > BLACK_JACK_SCORE; + public List getCardBundle() { + return cardBundle.getCards(); } public boolean isBlackJack() { - return score() == BLACK_JACK_SCORE; - } - - public List getCardBundle() { - return cardBundle.getCards(); + return cardBundle.isBlackJack(); } } diff --git a/src/test/java/blackjack/domain/user/DealerTest.java b/src/test/java/blackjack/domain/user/DealerTest.java index eb601cba..79402f03 100644 --- a/src/test/java/blackjack/domain/user/DealerTest.java +++ b/src/test/java/blackjack/domain/user/DealerTest.java @@ -31,13 +31,4 @@ public class DealerTest { dealer.drawCard(new Card(Suit.CLOVER, Number.SIX)); assertThat(dealer.isDrawable()).isTrue(); } - - @Test - void 딜러가_가진_패의_합이_21이상이라면_패배한다() { - Dealer dealer = new Dealer(); - dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); - dealer.drawCard(new Card(Suit.CLOVER, Number.SEVEN)); - dealer.drawCard(new Card(Suit.DIAMOND, Number.JACK)); - assertThat(dealer.isBurst()).isTrue(); - } } diff --git a/src/test/java/blackjack/domain/user/PlayerTest.java b/src/test/java/blackjack/domain/user/PlayerTest.java index 1ad177c8..fa0aa04f 100644 --- a/src/test/java/blackjack/domain/user/PlayerTest.java +++ b/src/test/java/blackjack/domain/user/PlayerTest.java @@ -41,15 +41,6 @@ class PlayerTest { assertThat(player.score()).isEqualTo(12); } - @Test - void 플레이어_카드의_합이_21초과라면_패배한다() { - Player player = new Player("name"); - player.drawCard(new Card(Suit.CLOVER, Number.EIGHT)); - player.drawCard(new Card(Suit.CLOVER, Number.SEVEN)); - player.drawCard(new Card(Suit.CLOVER, Number.NINE)); - assertThat(player.isBurst()).isTrue(); - } - @Test void 플레이어_카드의_합이_21이라면_승리한다() { Player player = new Player("name"); From 8627517c757dfea42a79ac931cd473e2793fe1df Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 21:47:39 +0900 Subject: [PATCH 62/75] test(GameResult): Test compare two CardBundle returning result --- .../blackjack/domain/report/GameResult.java | 22 +++++++++ .../domain/report/GameResultTest.java | 45 +++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/main/java/blackjack/domain/report/GameResult.java create mode 100644 src/test/java/blackjack/domain/report/GameResultTest.java diff --git a/src/main/java/blackjack/domain/report/GameResult.java b/src/main/java/blackjack/domain/report/GameResult.java new file mode 100644 index 00000000..df63a183 --- /dev/null +++ b/src/main/java/blackjack/domain/report/GameResult.java @@ -0,0 +1,22 @@ +package blackjack.domain.report; + +import blackjack.domain.card.CardBundle; + +public enum GameResult { + + WIN(1, "승"), + DRAW(0, "무"), + LOSE(-1, "패"); + + private final int result; + private final String message; + + GameResult(int result, String message) { + this.result = result; + this.message = message; + } + + public static GameResult comparing(CardBundle playerCardBundle, CardBundle dealerCardBundle) { + return null; + } +} diff --git a/src/test/java/blackjack/domain/report/GameResultTest.java b/src/test/java/blackjack/domain/report/GameResultTest.java new file mode 100644 index 00000000..4229e623 --- /dev/null +++ b/src/test/java/blackjack/domain/report/GameResultTest.java @@ -0,0 +1,45 @@ +package blackjack.domain.report; + + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import blackjack.domain.card.Card; +import blackjack.domain.card.CardBundle; +import blackjack.domain.card.Number; +import blackjack.domain.card.Suit; +import org.junit.jupiter.api.Test; + +class GameResultTest { + + @Test + void 값이_큰_카드번들과_작은_카드번들을_비교하면_승리를_반환한다() { + CardBundle largerCardBundle = CardBundle.emptyBundle(); + largerCardBundle.addCard(new Card(Suit.SPADE, Number.ACE)); + largerCardBundle.addCard(new Card(Suit.SPADE, Number.JACK)); + CardBundle smallerCardBundle = CardBundle.emptyBundle(); + smallerCardBundle.addCard(new Card(Suit.CLOVER, Number.TWO)); + GameResult actualResult = GameResult.comparing(largerCardBundle, smallerCardBundle); + assertThat(actualResult).isEqualTo(GameResult.WIN); + } + + @Test + void 값이_같은_카드번들을_비교하면_무승부를_반환한다() { + CardBundle cardBundle1 = CardBundle.emptyBundle(); + cardBundle1.addCard(new Card(Suit.CLOVER, Number.ACE)); + CardBundle cardBundle2 = CardBundle.emptyBundle(); + cardBundle2.addCard(new Card(Suit.DIAMOND, Number.ACE)); + GameResult actualResult = GameResult.comparing(cardBundle1, cardBundle2); + assertThat(actualResult).isEqualTo(GameResult.DRAW); + } + + @Test + void 값이_작은_카드번들과_큰_카드번들을_비교하면_패배를_반환한다() { + CardBundle largerCardBundle = CardBundle.emptyBundle(); + largerCardBundle.addCard(new Card(Suit.SPADE, Number.ACE)); + largerCardBundle.addCard(new Card(Suit.SPADE, Number.JACK)); + CardBundle smallerCardBundle = CardBundle.emptyBundle(); + smallerCardBundle.addCard(new Card(Suit.CLOVER, Number.TWO)); + GameResult actualResult = GameResult.comparing(smallerCardBundle, largerCardBundle); + assertThat(actualResult).isEqualTo(GameResult.LOSE); + } +} \ No newline at end of file From b28d592b6b7780d62b46b39e165757fc75ced712 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 21:48:27 +0900 Subject: [PATCH 63/75] feat(GameResult): Create compare two CardBundle returning result --- .../blackjack/domain/report/GameResult.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/report/GameResult.java b/src/main/java/blackjack/domain/report/GameResult.java index df63a183..0d876d5e 100644 --- a/src/main/java/blackjack/domain/report/GameResult.java +++ b/src/main/java/blackjack/domain/report/GameResult.java @@ -1,6 +1,7 @@ package blackjack.domain.report; import blackjack.domain.card.CardBundle; +import java.util.Arrays; public enum GameResult { @@ -17,6 +18,35 @@ public enum GameResult { } public static GameResult comparing(CardBundle playerCardBundle, CardBundle dealerCardBundle) { - return null; + isComparable(playerCardBundle, dealerCardBundle); + if (playerCardBundle.isBurst()) { + return GameResult.LOSE; + } + if (dealerCardBundle.isBurst()) { + return GameResult.WIN; + } + int result = Integer.compare(playerCardBundle.calculateScore(), + dealerCardBundle.calculateScore()); + return findResult(result); + } + + public String message() { + return message; + } + + private static void isComparable(CardBundle dealerCardBundle, CardBundle playerCardBundle) { + if (dealerCardBundle == null) { + throw new IllegalArgumentException("[ERROR] 딜러의 카드가 비었습니다"); + } + if (playerCardBundle == null) { + throw new IllegalArgumentException("[ERROR] 플레이어의 카드가 비었습니다."); + } + } + + private static GameResult findResult(int result) { + return Arrays.stream(values()) + .filter(gameResult -> gameResult.result == result) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("[ERROR] 올바르지 않은 값 입니다")); } } From 33558cd36b23282fbb546f3ad3aaa7f799e49c5c Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 21:50:27 +0900 Subject: [PATCH 64/75] feat(GameReport): Create with name and GameResult --- .../blackjack/domain/report/GameReport.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/blackjack/domain/report/GameReport.java diff --git a/src/main/java/blackjack/domain/report/GameReport.java b/src/main/java/blackjack/domain/report/GameReport.java new file mode 100644 index 00000000..8637c637 --- /dev/null +++ b/src/main/java/blackjack/domain/report/GameReport.java @@ -0,0 +1,51 @@ +package blackjack.domain.report; + +import java.util.Objects; + +public class GameReport { + + private final String name; + private final GameResult result; + + public GameReport(String name, GameResult result) { + this.name = name; + this.result = result; + } + + public String name() { + return name; + } + + public String message() { + return result.message(); + } + + public boolean isWin() { + return result == GameResult.WIN; + } + + public boolean isDraw() { + return result == GameResult.DRAW; + } + + public boolean isLose() { + return result == GameResult.LOSE; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + GameReport report = (GameReport) o; + return Objects.equals(name, report.name) && result == report.result; + } + + @Override + public int hashCode() { + return Objects.hash(name, result); + } +} From 7e5623906eebe00af62153e31564ad020f9331b4 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 21:54:42 +0900 Subject: [PATCH 65/75] test(GameReports): Test get count when win, draw, lose from reports --- .../blackjack/domain/report/GameReports.java | 22 ++++++++++ .../domain/report/GameReportsTest.java | 40 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/main/java/blackjack/domain/report/GameReports.java create mode 100644 src/test/java/blackjack/domain/report/GameReportsTest.java diff --git a/src/main/java/blackjack/domain/report/GameReports.java b/src/main/java/blackjack/domain/report/GameReports.java new file mode 100644 index 00000000..e069846a --- /dev/null +++ b/src/main/java/blackjack/domain/report/GameReports.java @@ -0,0 +1,22 @@ +package blackjack.domain.report; + +import java.util.List; + +public class GameReports { + + public GameReports(List reports) { + + } + + public int getPlayerWinCount() { + return 0; + } + + public int getPlayerDrawCount() { + return 0; + } + + public int getPlayerLoseCount() { + return 0; + } +} diff --git a/src/test/java/blackjack/domain/report/GameReportsTest.java b/src/test/java/blackjack/domain/report/GameReportsTest.java new file mode 100644 index 00000000..1b390ea3 --- /dev/null +++ b/src/test/java/blackjack/domain/report/GameReportsTest.java @@ -0,0 +1,40 @@ +package blackjack.domain.report; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +class GameReportsTest { + + static GameReports gameReports; + + @BeforeAll + static void setup() { + List reports = new ArrayList<>(); + reports.add(new GameReport("tester1", GameResult.WIN)); + reports.add(new GameReport("tester2", GameResult.WIN)); + reports.add(new GameReport("tester3", GameResult.WIN)); + reports.add(new GameReport("tester4", GameResult.DRAW)); + reports.add(new GameReport("tester5", GameResult.DRAW)); + reports.add(new GameReport("tester6", GameResult.LOSE)); + gameReports = new GameReports(reports); + } + + @Test + void 게임_결과_보고들의_승리_수를_구할_수_있다() { + assertThat(gameReports.getPlayerWinCount()).isEqualTo(3); + } + + @Test + void 게임_결과_보고들의_무승부_수를_구할_수_있다() { + assertThat(gameReports.getPlayerDrawCount()).isEqualTo(2); + } + + @Test + void 게임_결과_보고들의_패배_수를_구할_수_있다() { + assertThat(gameReports.getPlayerLoseCount()).isEqualTo(1); + } +} \ No newline at end of file From 320038819d31df87d337dd44689500c1166e6891 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 21:55:18 +0900 Subject: [PATCH 66/75] feat(GameReports): Create get Count when win, draw, lose from reports --- .../blackjack/domain/report/GameReports.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/report/GameReports.java b/src/main/java/blackjack/domain/report/GameReports.java index e069846a..a39b4148 100644 --- a/src/main/java/blackjack/domain/report/GameReports.java +++ b/src/main/java/blackjack/domain/report/GameReports.java @@ -1,22 +1,35 @@ package blackjack.domain.report; +import java.util.Collections; import java.util.List; public class GameReports { - public GameReports(List reports) { + private final List reports; + public GameReports(List reports) { + this.reports = reports; } public int getPlayerWinCount() { - return 0; + return (int) reports.stream() + .filter(GameReport::isWin) + .count(); } public int getPlayerDrawCount() { - return 0; + return (int) reports.stream() + .filter(GameReport::isDraw) + .count(); } public int getPlayerLoseCount() { - return 0; + return (int) reports.stream() + .filter(GameReport::isLose) + .count(); + } + + public List reports() { + return Collections.unmodifiableList(reports); } } From 10f6ca9d8659dfba803050b8f52bbd5733f2d1ca Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:05:25 +0900 Subject: [PATCH 67/75] test(UserNamesRequest): Test inititalize user names requests --- .../domain/request/UserNamesRequest.java | 18 ++++++++++ .../domain/request/UserNamesRequestTest.java | 33 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/main/java/blackjack/domain/request/UserNamesRequest.java create mode 100644 src/test/java/blackjack/domain/request/UserNamesRequestTest.java diff --git a/src/main/java/blackjack/domain/request/UserNamesRequest.java b/src/main/java/blackjack/domain/request/UserNamesRequest.java new file mode 100644 index 00000000..76b6d873 --- /dev/null +++ b/src/main/java/blackjack/domain/request/UserNamesRequest.java @@ -0,0 +1,18 @@ +package blackjack.domain.request; + +import java.util.List; + +public class UserNamesRequest { + + private UserNamesRequest(List userNames) { + + } + + public static UserNamesRequest from(String userNames) { + return null; + } + + public List userNames() { + return null; + } +} diff --git a/src/test/java/blackjack/domain/request/UserNamesRequestTest.java b/src/test/java/blackjack/domain/request/UserNamesRequestTest.java new file mode 100644 index 00000000..7c5e5d57 --- /dev/null +++ b/src/test/java/blackjack/domain/request/UserNamesRequestTest.java @@ -0,0 +1,33 @@ +package blackjack.domain.request; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; + +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class UserNamesRequestTest { + + @Test + void 사용자의_쉼표로_구분한_입력으로_사용자_이름_목록을_만들_수_있다() { + UserNamesRequest userNamesRequest = UserNamesRequest.from("jason,pobi"); + assertThat(userNamesRequest.userNames()).isEqualTo(Arrays.asList("jason", "pobi")); + } + + @Test + void 입력된_이름은_중복될_때_예외가_발생된다() { + assertThatThrownBy(() -> UserNamesRequest.from("jason,pobi,jason")) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void 빈_값이_입력되면_예외가_발생한다() { + assertAll( + () -> assertThatThrownBy(() -> UserNamesRequest.from(" ")) + .isInstanceOf(IllegalArgumentException.class), + () -> assertThatThrownBy(() -> UserNamesRequest.from(null)) + .isInstanceOf(IllegalArgumentException.class) + ); + } +} \ No newline at end of file From 1f86c26c6a054aa50588f8e357d12debfd373126 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:05:59 +0900 Subject: [PATCH 68/75] feat(UserNamesRequest): Create initialize user names requests and validation --- .../domain/request/UserNamesRequest.java | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/request/UserNamesRequest.java b/src/main/java/blackjack/domain/request/UserNamesRequest.java index 76b6d873..c4800851 100644 --- a/src/main/java/blackjack/domain/request/UserNamesRequest.java +++ b/src/main/java/blackjack/domain/request/UserNamesRequest.java @@ -1,18 +1,45 @@ package blackjack.domain.request; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; public class UserNamesRequest { - private UserNamesRequest(List userNames) { + private static final String USER_NAME_DELIMITER = ","; + + private final List userNames; + private UserNamesRequest(List userNames) { + this.userNames = userNames; } public static UserNamesRequest from(String userNames) { - return null; + validateUserNames(userNames); + List splitUserNames = Arrays.stream(userNames.split(USER_NAME_DELIMITER)) + .map(String::trim) + .collect(Collectors.toList()); + validateDuplicate(splitUserNames); + return new UserNamesRequest(splitUserNames); } public List userNames() { - return null; + return Collections.unmodifiableList(userNames); + } + + private static void validateUserNames(String userNames) { + if (userNames == null || userNames.trim().isEmpty()) { + throw new IllegalArgumentException("[ERROR] 이름을 입력해 주세요"); + } + } + + private static void validateDuplicate(List splitUserNames) { + Set removeDuplicate = new HashSet<>(splitUserNames); + if (removeDuplicate.size() != splitUserNames.size()) { + throw new IllegalArgumentException("[ERROR] 플레이어 이름은 중복될 수 없습니다"); + } } } From aec9de916addda964b057bfd0af378eb56fda1a3 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:08:05 +0900 Subject: [PATCH 69/75] refactor(UserNameRequest): Apply userNamesRequest instead of List input --- src/main/java/blackjack/BlackjackApplication.java | 6 +++--- src/main/java/blackjack/controller/BlackJack.java | 9 +++++---- src/main/java/blackjack/view/InputView.java | 10 ++-------- src/test/java/blackjack/controller/BlackJackTest.java | 8 +++----- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/main/java/blackjack/BlackjackApplication.java b/src/main/java/blackjack/BlackjackApplication.java index 07e102cc..ce7ea021 100644 --- a/src/main/java/blackjack/BlackjackApplication.java +++ b/src/main/java/blackjack/BlackjackApplication.java @@ -1,14 +1,14 @@ package blackjack; import blackjack.controller.BlackJack; +import blackjack.domain.request.UserNamesRequest; import blackjack.view.InputView; -import java.util.List; public class BlackjackApplication { public static void main(String[] args) { - List playerNames = InputView.getPlayerNames(); - BlackJack blackJack = BlackJack.init(playerNames); + String playerNames = InputView.getPlayerNames(); + BlackJack blackJack = BlackJack.init(UserNamesRequest.from(playerNames)); blackJack.runGame(); } } diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index 908309ce..e137b852 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -2,13 +2,13 @@ import blackjack.domain.card.CardFactory; import blackjack.domain.card.Deck; +import blackjack.domain.request.DrawRequest; +import blackjack.domain.request.UserNamesRequest; import blackjack.domain.user.Dealer; import blackjack.domain.user.Player; import blackjack.domain.user.Players; import blackjack.view.InputView; import blackjack.view.OutputView; -import blackjack.domain.request.DrawRequest; -import java.util.List; import java.util.stream.Collectors; public class BlackJack { @@ -21,9 +21,10 @@ private BlackJack(Players players, Deck deck) { this.deck = deck; } - public static BlackJack init(List playerNames) { + public static BlackJack init(UserNamesRequest playerNames) { Dealer dealer = new Dealer(); - Players candidates = playerNames.stream() + Players candidates = playerNames.userNames() + .stream() .map(Player::new) .collect(Collectors.collectingAndThen(Collectors.toList(), players -> new Players(dealer, players))); diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index ab218caf..cc4e40d0 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,10 +1,7 @@ package blackjack.view; import blackjack.domain.user.Player; -import java.util.Arrays; -import java.util.List; import java.util.Scanner; -import java.util.stream.Collectors; public class InputView { @@ -13,12 +10,9 @@ public class InputView { private InputView() { } - public static List getPlayerNames() { + public static String getPlayerNames() { System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); - String playerNames = scanner.nextLine(); - return Arrays.stream(playerNames.split(",")) - .map(String::trim) - .collect(Collectors.toList()); + return scanner.nextLine(); } public static String getDrawRequest(Player player) { diff --git a/src/test/java/blackjack/controller/BlackJackTest.java b/src/test/java/blackjack/controller/BlackJackTest.java index 263fe2c6..e6e4a6e7 100644 --- a/src/test/java/blackjack/controller/BlackJackTest.java +++ b/src/test/java/blackjack/controller/BlackJackTest.java @@ -1,18 +1,16 @@ package blackjack.controller; - import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import java.util.Arrays; -import java.util.List; +import blackjack.domain.request.UserNamesRequest; import org.junit.jupiter.api.Test; class BlackJackTest { @Test void 플레이어들의_이름을_입력받아_블랙잭_게임을_생성할_수_있다() { - List playerNames = Arrays.asList("pobi", "jason", "toby"); - BlackJack blackJack = BlackJack.init(playerNames); + String playerNames = "pobi, jason, toby"; + BlackJack blackJack = BlackJack.init(UserNamesRequest.from(playerNames)); assertThat(blackJack).isInstanceOf(BlackJack.class); } } From a9917ed2cb7083686f1677f39365893632695089 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:09:52 +0900 Subject: [PATCH 70/75] feat(Players): Add get all players with dealer --- src/main/java/blackjack/domain/user/Players.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/blackjack/domain/user/Players.java b/src/main/java/blackjack/domain/user/Players.java index 9a0e6361..461b2af8 100644 --- a/src/main/java/blackjack/domain/user/Players.java +++ b/src/main/java/blackjack/domain/user/Players.java @@ -2,6 +2,7 @@ import blackjack.domain.card.Deck; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -39,4 +40,8 @@ public void drawStartCards(Deck deck) { players.forEach(player -> player.drawCard(deck.spreadCard())); } } + + public List all() { + return Collections.unmodifiableList(players); + } } From 75755908f347ca5f011ced0bf146fa5f4848a7a4 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:17:17 +0900 Subject: [PATCH 71/75] test(Dealer): Add test create Report using player and extract duplications --- .../java/blackjack/domain/user/Dealer.java | 6 +++ .../blackjack/domain/user/DealerTest.java | 45 ++++++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/main/java/blackjack/domain/user/Dealer.java b/src/main/java/blackjack/domain/user/Dealer.java index 02c782ae..d2d9d911 100644 --- a/src/main/java/blackjack/domain/user/Dealer.java +++ b/src/main/java/blackjack/domain/user/Dealer.java @@ -1,5 +1,7 @@ package blackjack.domain.user; +import blackjack.domain.report.GameReport; + public class Dealer extends Player { private static final int DEALER_MUST_DRAW_SCORE = 16; @@ -8,6 +10,10 @@ public Dealer() { super("딜러"); } + public GameReport createReport(Player player) { + return null; + } + @Override public boolean isPlayer() { return false; diff --git a/src/test/java/blackjack/domain/user/DealerTest.java b/src/test/java/blackjack/domain/user/DealerTest.java index 79402f03..287d81a0 100644 --- a/src/test/java/blackjack/domain/user/DealerTest.java +++ b/src/test/java/blackjack/domain/user/DealerTest.java @@ -5,30 +5,61 @@ import blackjack.domain.card.Card; import blackjack.domain.card.Number; import blackjack.domain.card.Suit; +import blackjack.domain.report.GameReport; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; public class DealerTest { + static Dealer dealer; + + @BeforeAll + static void setUp() { + dealer = new Dealer(); + dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); + dealer.drawCard(new Card(Suit.CLOVER, Number.SIX)); + } + @Test void 딜러인지_확인할_수_있다() { - Dealer dealer = new Dealer(); assertThat(dealer.isDealer()).isTrue(); assertThat(dealer.isPlayer()).isFalse(); } @Test void 딜러가_가진_패의_합을_확인_할_수_있다() { - Dealer dealer = new Dealer(); - dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); - dealer.drawCard(new Card(Suit.CLOVER, Number.SIX)); assertThat(dealer.score()).isEqualTo(11); } @Test void 딜러가_가진_패의_합이_16이하라면_패를_뽑아야_한다() { - Dealer dealer = new Dealer(); - dealer.drawCard(new Card(Suit.CLOVER, Number.FIVE)); - dealer.drawCard(new Card(Suit.CLOVER, Number.SIX)); assertThat(dealer.isDrawable()).isTrue(); } + + @Test + void 딜러는_자신보다_낮은_패를_가진_플레이어와_비교해_패배_리포트를_생성할_수_있다() { + Player player = new Player("loser"); + player.drawCard(new Card(Suit.DIAMOND, Number.FOUR)); + player.drawCard(new Card(Suit.DIAMOND, Number.TWO)); + GameReport gameReport = dealer.createReport(player); + assertThat(gameReport.isLose()).isTrue(); + } + + @Test + void 딜러는_자신보다_높은_패를_가진_플레이어와_비교해_승리_리포트를_생성할_수_있다() { + Player player = new Player("winner"); + player.drawCard(new Card(Suit.DIAMOND, Number.FOUR)); + player.drawCard(new Card(Suit.DIAMOND, Number.EIGHT)); + GameReport gameReport = dealer.createReport(player); + assertThat(gameReport.isWin()).isTrue(); + } + + @Test + void 딜러는_자신과_같은_패를_가진_플레이어와_비교해_무승부_리포트를_생성할_수_있다() { + Player player = new Player("drawer"); + player.drawCard(new Card(Suit.DIAMOND, Number.SIX)); + player.drawCard(new Card(Suit.DIAMOND, Number.FIVE)); + GameReport gameReport = dealer.createReport(player); + assertThat(gameReport.isDraw()).isTrue(); + } } From d9ea4295ec2a26c835779176e0175429c577b36d Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:17:43 +0900 Subject: [PATCH 72/75] feat(Dealer): Add create report using player --- src/main/java/blackjack/domain/user/Dealer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/user/Dealer.java b/src/main/java/blackjack/domain/user/Dealer.java index d2d9d911..bbc1bee5 100644 --- a/src/main/java/blackjack/domain/user/Dealer.java +++ b/src/main/java/blackjack/domain/user/Dealer.java @@ -1,5 +1,6 @@ package blackjack.domain.user; +import blackjack.domain.report.GameResult; import blackjack.domain.report.GameReport; public class Dealer extends Player { @@ -11,7 +12,8 @@ public Dealer() { } public GameReport createReport(Player player) { - return null; + GameResult gameResult = GameResult.comparing(player.cardBundle, this.cardBundle); + return new GameReport(player.name(), gameResult); } @Override From 40549630e8eaa542d8a4900e6f5b124d0f85358b Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:18:47 +0900 Subject: [PATCH 73/75] feat(OutputView, BlackJack): Add show result, reports --- .../java/blackjack/controller/BlackJack.java | 17 +++++++++++ src/main/java/blackjack/view/OutputView.java | 29 ++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/controller/BlackJack.java b/src/main/java/blackjack/controller/BlackJack.java index e137b852..70592199 100644 --- a/src/main/java/blackjack/controller/BlackJack.java +++ b/src/main/java/blackjack/controller/BlackJack.java @@ -2,6 +2,7 @@ import blackjack.domain.card.CardFactory; import blackjack.domain.card.Deck; +import blackjack.domain.report.GameReports; import blackjack.domain.request.DrawRequest; import blackjack.domain.request.UserNamesRequest; import blackjack.domain.user.Dealer; @@ -9,6 +10,7 @@ import blackjack.domain.user.Players; import blackjack.view.InputView; import blackjack.view.OutputView; +import java.util.List; import java.util.stream.Collectors; public class BlackJack { @@ -39,6 +41,8 @@ public void runGame() { drawPlayers(); drawDealer(); } + GameReports reports = getResult(); + showResult(reports); } private void spreadStartCards() { @@ -72,4 +76,17 @@ private void drawDealer() { OutputView.printDealerGetCard(); } } + + private GameReports getResult() { + Dealer dealer = players.findDealer(); + List candidates = players.findOnlyPlayers(); + return candidates.stream() + .map(dealer::createReport) + .collect(Collectors.collectingAndThen(Collectors.toList(), GameReports::new)); + } + + private void showResult(GameReports reports) { + OutputView.printResultStatus(players.all()); + OutputView.printReports(reports); + } } diff --git a/src/main/java/blackjack/view/OutputView.java b/src/main/java/blackjack/view/OutputView.java index d00a59f8..3ba30dfa 100644 --- a/src/main/java/blackjack/view/OutputView.java +++ b/src/main/java/blackjack/view/OutputView.java @@ -2,6 +2,7 @@ import static blackjack.domain.user.Players.START_CARD_INIT_SIZE; +import blackjack.domain.report.GameReports; import blackjack.domain.card.Card; import blackjack.domain.user.Player; import blackjack.domain.user.Players; @@ -28,7 +29,28 @@ public static void printEachCardInfo(Player player) { } public static void printDealerGetCard() { - System.out.println("\n딜러는 16이하라 한장의 카드를 더 받았습니다.\n"); + System.out.println("\n딜러는 16이하라 한장의 카드를 더 받았습니다."); + } + + public static void printResultStatus(List players) { + System.out.println(); + players.forEach(OutputView::showEachResult); + } + + public static void printReports(GameReports reports) { + System.out.println("\n## 최종 승패"); + showDealerReports(reports); + reports.reports() + .stream() + .map(report -> String.format("%s: %s", report.name(), report.message())) + .forEach(System.out::println); + } + + private static void showDealerReports(GameReports reports) { + int dealerWinCount = reports.getPlayerLoseCount(); + int drawCount = reports.getPlayerDrawCount(); + int dealerLoseCount = reports.getPlayerWinCount(); + System.out.printf("딜러: %d승 %d무 %d패\n", dealerWinCount, drawCount, dealerLoseCount); } private static String collectPlayerNames(List candiates) { @@ -52,4 +74,9 @@ private static String collectPlayerCard(Player player) { .map(OutputView::makeCardInfo) .collect(Collectors.joining(", ")); } + + private static void showEachResult(Player player) { + System.out.printf("%s카드: %s - 결과 : %d\n", player.name(), collectPlayerCard(player), + player.score()); + } } From a4f3a209b18124fc99e3ec3107bda7ef86e89fa7 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:19:50 +0900 Subject: [PATCH 74/75] docs: Update README.md checked completed list --- README.md | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 76b7e490..77a8660f 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,16 @@ # Black-Jack -## 구현 목록 - -- 덱 - - 카드 52장 정해진 거 -- 카드 - - 무늬 => 한정 => Enum - - 숫자 => 한정 => Enum -- 플레이어 - - 카드 리스트 -- 딜러 - - 카드 리스트 - ## 기능 목록 -- [ ] 참여할 사람의 이름 입력받기 +- [X] 참여할 사람의 이름 입력받기 -- [ ] 카드 나눠주기 +- [X] 카드 나눠주기 -- [ ] 카드 수령 여부 +- [X] 카드 수령 여부 - - [ ] 딜러의 카드 합이 16 이하이면 무조건 1장을 받아야한다. + - [X] 딜러의 카드 합이 16 이하이면 무조건 1장을 받아야한다. -- [ ] 결과 판정하기 +- [X] 결과 판정하기 ## 기능 요구 사항 블랙잭 게임을 변형한 프로그램을 구현한다. From ae38381578d9f56b85b0c46169e30c665c738805 Mon Sep 17 00:00:00 2001 From: PandaHun Date: Thu, 17 Feb 2022 22:23:51 +0900 Subject: [PATCH 75/75] typo: apply code convention --- src/main/java/blackjack/domain/user/Player.java | 1 - src/test/java/blackjack/domain/card/CardFactoryTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/user/Player.java b/src/main/java/blackjack/domain/user/Player.java index 2859993c..e5523b8e 100644 --- a/src/main/java/blackjack/domain/user/Player.java +++ b/src/main/java/blackjack/domain/user/Player.java @@ -6,7 +6,6 @@ public class Player { - protected final CardBundle cardBundle; private final String name; diff --git a/src/test/java/blackjack/domain/card/CardFactoryTest.java b/src/test/java/blackjack/domain/card/CardFactoryTest.java index 413f3540..1808f10e 100644 --- a/src/test/java/blackjack/domain/card/CardFactoryTest.java +++ b/src/test/java/blackjack/domain/card/CardFactoryTest.java @@ -12,7 +12,7 @@ class CardFactoryTest { @Test void 총_52장의_서로_다른_카드를_생성한다() { CardFactory cardFactory = CardFactory.getInstance(); - List cards = cardFactory.createCards(); + List cards = cardFactory.createCards(); assertThat(cards.size()).isEqualTo(52); Set removeDuplicates = new HashSet<>(cards); assertThat(removeDuplicates.size()).isEqualTo(52);