From 7f13e052af0bee13d90190f09fa36abb721f09c2 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Fri, 11 Feb 2022 16:28:50 +0900 Subject: [PATCH 01/39] =?UTF-8?q?docs(rentcompany):=20README.md=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 - 기능 요구 사항 작성 --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 03ba7ed3..27bb3f68 100644 --- a/README.md +++ b/README.md @@ -1 +1,7 @@ +# java-rentcompany +# 기능 요구사항 +- [ ] 이동거리를 입력받아 자동차 객체를 생성한다. +- [ ] 이동거리를 활용해 차량 별로 필요한 연료를 계산한다. +- [ ] 보고서를 출력한다. + # java-blackjack \ No newline at end of file From af63466a311618633f3e31d62c08f730fdab884f Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Fri, 11 Feb 2022 16:37:06 +0900 Subject: [PATCH 02/39] =?UTF-8?q?docs(rentcompany):=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/empty.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/empty.txt diff --git a/src/main/java/empty.txt b/src/main/java/empty.txt deleted file mode 100644 index e69de29b..00000000 From d0ece66eff43b655fb023f9bf11c3c1d19b1a452 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Fri, 11 Feb 2022 16:37:37 +0900 Subject: [PATCH 03/39] =?UTF-8?q?feat(rentcompany):=20Car=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentcompany/Car.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/java/rentcompany/Car.java diff --git a/src/main/java/rentcompany/Car.java b/src/main/java/rentcompany/Car.java new file mode 100644 index 00000000..dd4b0196 --- /dev/null +++ b/src/main/java/rentcompany/Car.java @@ -0,0 +1,16 @@ +package rentcompany; + +public abstract class Car { + + abstract double getDistancePerLiter(); + + abstract double getTripDistance(); + + abstract String getName(); + + double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } + +} +성 \ No newline at end of file From 11efcf5220e26f3f8cad090da224cb9262ea7845 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Fri, 11 Feb 2022 16:41:45 +0900 Subject: [PATCH 04/39] =?UTF-8?q?refactor(rentcompany):=20Car=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 오타 제거 --- src/main/java/rentcompany/Car.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/rentcompany/Car.java b/src/main/java/rentcompany/Car.java index dd4b0196..550fcaa5 100644 --- a/src/main/java/rentcompany/Car.java +++ b/src/main/java/rentcompany/Car.java @@ -12,5 +12,4 @@ public abstract class Car { return getTripDistance() / getDistancePerLiter(); } -} -성 \ No newline at end of file +} \ No newline at end of file From c91d1168b0dee523eff3d664d48b2998645231fe Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Fri, 11 Feb 2022 16:51:39 +0900 Subject: [PATCH 05/39] =?UTF-8?q?feat(rentcompany):=20Sonata,=20Avante,=20?= =?UTF-8?q?K5=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentcompany/Avante.java | 27 +++++++++++++++++++++++++++ src/main/java/rentcompany/K5.java | 27 +++++++++++++++++++++++++++ src/main/java/rentcompany/Sonata.java | 27 +++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/main/java/rentcompany/Avante.java create mode 100644 src/main/java/rentcompany/K5.java create mode 100644 src/main/java/rentcompany/Sonata.java diff --git a/src/main/java/rentcompany/Avante.java b/src/main/java/rentcompany/Avante.java new file mode 100644 index 00000000..61db2d81 --- /dev/null +++ b/src/main/java/rentcompany/Avante.java @@ -0,0 +1,27 @@ +package rentcompany; + +public class Avante extends Car{ + + private static final String NAME = "Avante"; + private static final double DISTANCE_PER_LITER = 15; + private double distance; + + public Avante(double distance) { + this.distance = distance; + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return this.distance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/rentcompany/K5.java b/src/main/java/rentcompany/K5.java new file mode 100644 index 00000000..dcd07109 --- /dev/null +++ b/src/main/java/rentcompany/K5.java @@ -0,0 +1,27 @@ +package rentcompany; + +public class K5 extends Car{ + + private static final String NAME = "K5"; + private static final double DISTANCE_PER_LITER = 13; + private double distance; + + public K5(double distance) { + this.distance = distance; + } + + @Override + double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + double getTripDistance() { + return this.distance; + } + + @Override + String getName() { + return NAME; + } +} diff --git a/src/main/java/rentcompany/Sonata.java b/src/main/java/rentcompany/Sonata.java new file mode 100644 index 00000000..9a710f58 --- /dev/null +++ b/src/main/java/rentcompany/Sonata.java @@ -0,0 +1,27 @@ +package rentcompany; + +public class Sonata extends Car { + + private static final String NAME = "Sonata"; + private static final double DISTANCE_PER_LITER = 10; + private double distance; + + public Sonata(double distance) { + this.distance = distance; + } + + @Override + public double getDistancePerLiter() { + return DISTANCE_PER_LITER; + } + + @Override + public double getTripDistance() { + return this.distance; + } + + @Override + public String getName() { + return NAME; + } +} From c27bd1658ef1df927216dcb9bfd5a0f9c3ee4eb2 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Sun, 13 Feb 2022 17:25:10 +0900 Subject: [PATCH 06/39] =?UTF-8?q?feat(rentcompany):=20RentCompany=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentcompany/RentCompany.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/rentcompany/RentCompany.java diff --git a/src/main/java/rentcompany/RentCompany.java b/src/main/java/rentcompany/RentCompany.java new file mode 100644 index 00000000..3998afd1 --- /dev/null +++ b/src/main/java/rentcompany/RentCompany.java @@ -0,0 +1,13 @@ +package rentcompany; + +import java.util.ArrayList; +import java.util.List; + +public class RentCompany { + + private List cars; + + private RentCompany() { + cars = new ArrayList<>(); + } +} From aee5205a19e58848408326184a34c2886b68a25b Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Sun, 13 Feb 2022 17:27:28 +0900 Subject: [PATCH 07/39] =?UTF-8?q?feat(rentcompany):=20RentCompany=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 팩토리 매세드 적용 --- src/main/java/rentcompany/RentCompany.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/rentcompany/RentCompany.java b/src/main/java/rentcompany/RentCompany.java index 3998afd1..d4980b0a 100644 --- a/src/main/java/rentcompany/RentCompany.java +++ b/src/main/java/rentcompany/RentCompany.java @@ -10,4 +10,8 @@ public class RentCompany { private RentCompany() { cars = new ArrayList<>(); } + + public static RentCompany create() { + return new RentCompany(); + } } From 4f354df18f1f8a6d135fc96f0463c82177c5c935 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Sun, 13 Feb 2022 17:37:44 +0900 Subject: [PATCH 08/39] =?UTF-8?q?feat(rentcompany):=20RentCompany=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - addCar 기능 추가 --- src/main/java/rentcompany/RentCompany.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/rentcompany/RentCompany.java b/src/main/java/rentcompany/RentCompany.java index d4980b0a..54656884 100644 --- a/src/main/java/rentcompany/RentCompany.java +++ b/src/main/java/rentcompany/RentCompany.java @@ -14,4 +14,9 @@ private RentCompany() { public static RentCompany create() { return new RentCompany(); } + + public void addCar(Car car) { + cars.add(car); + } + } From 03bda82079a95a7dccbc6bc7798ad1117e7d9230 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Sun, 13 Feb 2022 17:40:06 +0900 Subject: [PATCH 09/39] =?UTF-8?q?feat(rentcompany):=20RentCompany=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - generateReport 기능 추가 --- src/main/java/rentcompany/RentCompany.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/rentcompany/RentCompany.java b/src/main/java/rentcompany/RentCompany.java index 54656884..98a84173 100644 --- a/src/main/java/rentcompany/RentCompany.java +++ b/src/main/java/rentcompany/RentCompany.java @@ -5,6 +5,9 @@ public class RentCompany { + private static final String NEW_LINE = System.getProperty("line.separator"); + private static final String LITER = "리터"; + private List cars; private RentCompany() { @@ -19,4 +22,12 @@ public void addCar(Car car) { cars.add(car); } + public String generateReport() { + StringBuilder report = new StringBuilder(); + for(Car car : cars){ + report.append(car.getName()+" : "+(int)car.getChargeQuantity()+ LITER + NEW_LINE); + } + System.out.println(report); + return report.toString(); + } } From 0470c59d754274179de85e24c3c35b6ed0d05753 Mon Sep 17 00:00:00 2001 From: lhh5863 Date: Sun, 13 Feb 2022 17:46:42 +0900 Subject: [PATCH 10/39] =?UTF-8?q?feat(rentcompany):=20RentCompanyTest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/rentcompany/RentCompanyTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/java/rentcompany/RentCompanyTest.java diff --git a/src/test/java/rentcompany/RentCompanyTest.java b/src/test/java/rentcompany/RentCompanyTest.java new file mode 100644 index 00000000..fb3f8edd --- /dev/null +++ b/src/test/java/rentcompany/RentCompanyTest.java @@ -0,0 +1,28 @@ +package rentcompany; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class RentCompanyTest { private static final String NEWLINE = System.getProperty("line.separator"); + + @Test + public void report() throws Exception { + RentCompany company = RentCompany.create(); + company.addCar(new Sonata(150)); + company.addCar(new K5(260)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(390)); + + String report = company.generateReport(); + assertThat(report).isEqualTo( + "Sonata : 15리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } + +} \ No newline at end of file From 8f8323020d4bddd835c74f4b8668cdb9261a6caa Mon Sep 17 00:00:00 2001 From: gal2o Date: Thu, 17 Feb 2022 23:57:57 +0900 Subject: [PATCH 11/39] =?UTF-8?q?docs(Blackjack):=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20README=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 27bb3f68..2bc84a34 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,66 @@ - [ ] 이동거리를 활용해 차량 별로 필요한 연료를 계산한다. - [ ] 보고서를 출력한다. -# java-blackjack \ No newline at end of file +# java-blackjack +## 기능 요구 사항 +- 블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. +- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. +- 게임을 완료한 후 각 플레이어별로 승패를 출력한다. + +## 기능 설계 +- GamePlayers + - GamePlayers는 딜러와 플레이어를 갖고 있다. + - Dealer + - [ ] 딜러는 처음에 카드를 두 장 받는다. + - [ ] 딜러는 카드의 합이 16이하이면 1장을 반드시 받고, 17 이상이면 추가로 받을 수 없다. + - Players + - Players에는 Player를 담고 있다. + - Player + - [ ] 플레이어는 InputView를 통해 입력받는다. + - [ ] 입력 받은 Player는 인스턴스 생성 +- OwnCards + - 플레이어들이 가지고 있는 카드들 + - 이 카드들을 사용하여 게임의 결과를 정한다. +- Deck + - Deck은 Card를 담고 있다. + - 게임에 사용할 52장의 카드를 생성한다. + - Card + - CardNumber + - [ ] 카드 번호를 생성하는 객체 + - CardType + - [ ] 카드 타입을 생성하는 객체 +- CardTotal + - [ ] 게임 이용자들의 카드 합을 구하는 클래스 +- GamePlay + - [ ] 게임을 진행하는 클래스 +- GameResult + - [ ] 게임의 결과를 만드는 클래스 + - ResultValue + - [ ] 승, 무, 패를 가지고 있는 ENUM 클래스 +- InputView +- ResultView + +## 프로그래밍 요구 사항 +- 자바 코드 컨벤션을 지키면서 프로그래밍한다. +- 기본적으로 Google Java Style Guide을 원칙으로 한다. +- 단, 들여쓰기는 '2 spaces'가 아닌 '4 spaces'로 한다. +- indent(인덴트, 들여쓰기) depth를 2를 넘지 않도록 구현한다. 1까지만 허용한다. +- 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. +- 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메서드)를 분리하면 된다. +- 3항 연산자를 쓰지 않는다. +- else 예약어, switch/case를 사용하지 않는다. +- 힌트: if문에서 값을 반환하는 방식으로 구현하면 else 예약어를 사용하지 않아도 된다. +- 모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다. 단, UI(System.out, System.in) 로직은 제외 +- 핵심 로직을 구현하는 코드와 UI를 담당하는 로직을 구분한다. +- UI 로직을 InputView, ResultView와 같은 클래스를 추가해 분리한다. +- 함수(또는 메서드)의 길이가 10라인을 넘어가지 않도록 구현한다. +- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라. +- 배열 대신 컬렉션을 사용한다. +- 모든 원시 값과 문자열을 포장한다 +- 줄여 쓰지 않는다(축약 금지). +- 일급 컬렉션을 쓴다. +- 모든 엔티티를 작게 유지한다. +- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다. +- 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다. From 86813d5982da1c7afdcb3fdc85ac9365538f9e92 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:05:33 +0900 Subject: [PATCH 12/39] =?UTF-8?q?feat(Blackjack):=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20=ED=8C=A8=ED=82=A4=EC=A7=80,=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/Application.java | 8 ++++++++ .../java/blackjack/controller/BlackJackController.java | 5 +++++ src/main/java/blackjack/domain/Card.java | 5 +++++ src/main/java/blackjack/domain/CardNumber.java | 5 +++++ src/main/java/blackjack/domain/CardType.java | 4 ++++ src/main/java/blackjack/domain/Dealer.java | 5 +++++ src/main/java/blackjack/domain/Deck.java | 5 +++++ src/main/java/blackjack/domain/GamePlayers.java | 5 +++++ src/main/java/blackjack/domain/GameResult.java | 5 +++++ src/main/java/blackjack/domain/OwnCards.java | 5 +++++ src/main/java/blackjack/domain/Player.java | 5 +++++ src/main/java/blackjack/domain/Players.java | 5 +++++ src/main/java/blackjack/domain/ResultValue.java | 5 +++++ src/main/java/blackjack/util/Parser.java | 5 +++++ src/main/java/blackjack/view/InputView.java | 5 +++++ src/main/java/blackjack/view/ResultView.java | 5 +++++ 16 files changed, 82 insertions(+) create mode 100644 src/main/java/blackjack/Application.java create mode 100644 src/main/java/blackjack/controller/BlackJackController.java create mode 100644 src/main/java/blackjack/domain/Card.java create mode 100644 src/main/java/blackjack/domain/CardNumber.java create mode 100644 src/main/java/blackjack/domain/CardType.java create mode 100644 src/main/java/blackjack/domain/Dealer.java create mode 100644 src/main/java/blackjack/domain/Deck.java create mode 100644 src/main/java/blackjack/domain/GamePlayers.java create mode 100644 src/main/java/blackjack/domain/GameResult.java create mode 100644 src/main/java/blackjack/domain/OwnCards.java create mode 100644 src/main/java/blackjack/domain/Player.java create mode 100644 src/main/java/blackjack/domain/Players.java create mode 100644 src/main/java/blackjack/domain/ResultValue.java create mode 100644 src/main/java/blackjack/util/Parser.java create mode 100644 src/main/java/blackjack/view/InputView.java create mode 100644 src/main/java/blackjack/view/ResultView.java diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java new file mode 100644 index 00000000..4c4dceeb --- /dev/null +++ b/src/main/java/blackjack/Application.java @@ -0,0 +1,8 @@ +package blackjack; + +public class Application { + + public static void main(String[] args) { + + } +} diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java new file mode 100644 index 00000000..8debf126 --- /dev/null +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -0,0 +1,5 @@ +package blackjack.controller; + +public class BlackJackController { + +} diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java new file mode 100644 index 00000000..c7a20673 --- /dev/null +++ b/src/main/java/blackjack/domain/Card.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Card { + +} diff --git a/src/main/java/blackjack/domain/CardNumber.java b/src/main/java/blackjack/domain/CardNumber.java new file mode 100644 index 00000000..5560511d --- /dev/null +++ b/src/main/java/blackjack/domain/CardNumber.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public enum CardNumber { + +} diff --git a/src/main/java/blackjack/domain/CardType.java b/src/main/java/blackjack/domain/CardType.java new file mode 100644 index 00000000..09ab757e --- /dev/null +++ b/src/main/java/blackjack/domain/CardType.java @@ -0,0 +1,4 @@ +package blackjack.domain; + +public enum CardType { +} diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java new file mode 100644 index 00000000..f5917c81 --- /dev/null +++ b/src/main/java/blackjack/domain/Dealer.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Dealer { + +} diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java new file mode 100644 index 00000000..1f6951d7 --- /dev/null +++ b/src/main/java/blackjack/domain/Deck.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Deck { + +} diff --git a/src/main/java/blackjack/domain/GamePlayers.java b/src/main/java/blackjack/domain/GamePlayers.java new file mode 100644 index 00000000..55be0071 --- /dev/null +++ b/src/main/java/blackjack/domain/GamePlayers.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public abstract class GamePlayers { + +} diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java new file mode 100644 index 00000000..34018e66 --- /dev/null +++ b/src/main/java/blackjack/domain/GameResult.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class GameResult { + +} diff --git a/src/main/java/blackjack/domain/OwnCards.java b/src/main/java/blackjack/domain/OwnCards.java new file mode 100644 index 00000000..bfc4c49c --- /dev/null +++ b/src/main/java/blackjack/domain/OwnCards.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class OwnCards { + +} diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java new file mode 100644 index 00000000..9802e60c --- /dev/null +++ b/src/main/java/blackjack/domain/Player.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Player { + +} diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java new file mode 100644 index 00000000..63fbd7e3 --- /dev/null +++ b/src/main/java/blackjack/domain/Players.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class Players { + +} diff --git a/src/main/java/blackjack/domain/ResultValue.java b/src/main/java/blackjack/domain/ResultValue.java new file mode 100644 index 00000000..0d24ca6a --- /dev/null +++ b/src/main/java/blackjack/domain/ResultValue.java @@ -0,0 +1,5 @@ +package blackjack.domain; + +public class ResultValue { + +} diff --git a/src/main/java/blackjack/util/Parser.java b/src/main/java/blackjack/util/Parser.java new file mode 100644 index 00000000..7c38e762 --- /dev/null +++ b/src/main/java/blackjack/util/Parser.java @@ -0,0 +1,5 @@ +package blackjack.util; + +public class Parser { + +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..ff86c007 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,5 @@ +package blackjack.view; + +public class InputView { + +} diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java new file mode 100644 index 00000000..9650d68d --- /dev/null +++ b/src/main/java/blackjack/view/ResultView.java @@ -0,0 +1,5 @@ +package blackjack.view; + +public class ResultView { + +} From cdadf6db79c1b50de25855edda925d9b49a2720d Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:07:59 +0900 Subject: [PATCH 13/39] =?UTF-8?q?feat(Blackjack):=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20=EA=B2=8C=EC=9E=84=EC=9D=84=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20=EC=B6=94=EC=83=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/GamePlayers.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/blackjack/domain/GamePlayers.java b/src/main/java/blackjack/domain/GamePlayers.java index 55be0071..8fa1b934 100644 --- a/src/main/java/blackjack/domain/GamePlayers.java +++ b/src/main/java/blackjack/domain/GamePlayers.java @@ -2,4 +2,26 @@ public abstract class GamePlayers { + protected final String playerName; + protected final OwnCards ownCards; + + protected GamePlayers(String playerName) { + this.playerName = playerName; + this.ownCards = new OwnCards(); + } + + protected GamePlayers(String playerName, OwnCards ownCards) { + this.playerName = playerName; + this.ownCards = ownCards; + } + + public abstract boolean isAvailDraw(); + + public String getPlayerName() { + return playerName; + } + + public OwnCards myOwnCards() { + return ownCards; + } } From b241605c0c1c1c559123ff17a6c16c650422bdd9 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:11:46 +0900 Subject: [PATCH 14/39] =?UTF-8?q?feat(Blackjack):=20GamePlayers=EB=A5=BC?= =?UTF-8?q?=20=EC=83=81=EC=86=8D=EB=B0=9B=EB=8A=94=20Dealer,=20Player=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Dealer.java | 17 ++++++++++++++++- src/main/java/blackjack/domain/Player.java | 12 +++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index f5917c81..3fc52155 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,5 +1,20 @@ package blackjack.domain; -public class Dealer { +public class Dealer extends GamePlayers { + + private static final String DEALER_NAME = "딜러"; + private final int DEALER_DRAW_LIMIT = 16; + + public Dealer() { + super(DEALER_NAME); + } + + public Dealer(OwnCards ownCards) { + super(DEALER_NAME, ownCards); + } + + public boolean isAvailDraw() { + return false; + } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 9802e60c..97b065a2 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,5 +1,15 @@ package blackjack.domain; -public class Player { +public class Player extends GamePlayers { + private final int DEALER_DRAW_LIMIT = 21; + + public Player(String playerName) { + super(playerName); + } + + @Override + public boolean isAvailDraw() { + return false; + } } From f288843a89b8fd1937d1b81edc92b6933018766e Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:12:16 +0900 Subject: [PATCH 15/39] =?UTF-8?q?feat(Blackjack):=20GamePlayers=EC=97=90?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=ED=95=9C=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EB=93=A4=EC=9D=B4=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20Own?= =?UTF-8?q?Cards=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/OwnCards.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/blackjack/domain/OwnCards.java b/src/main/java/blackjack/domain/OwnCards.java index bfc4c49c..18ac1d22 100644 --- a/src/main/java/blackjack/domain/OwnCards.java +++ b/src/main/java/blackjack/domain/OwnCards.java @@ -1,5 +1,21 @@ package blackjack.domain; +import java.util.ArrayList; +import java.util.List; + public class OwnCards { + private final List ownCards; + + public OwnCards() { + this.ownCards = new ArrayList<>(); + } + + public void addCard(Card card) { + ownCards.add(card); + } + + public List getOwnCards() { + return ownCards; + } } From b1233be7a9013b981fd88c0dbb7c1a1c264a1f5f Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:15:59 +0900 Subject: [PATCH 16/39] =?UTF-8?q?feat(Blackjack):=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EC=9D=98=20=EB=B2=88=ED=98=B8,=20=EC=9D=B4=EB=A6=84=EC=9D=84?= =?UTF-8?q?=20=EA=B0=80=EC=A7=80=EB=8A=94=20CardNumber=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/CardNumber.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/blackjack/domain/CardNumber.java b/src/main/java/blackjack/domain/CardNumber.java index 5560511d..a0c14ecf 100644 --- a/src/main/java/blackjack/domain/CardNumber.java +++ b/src/main/java/blackjack/domain/CardNumber.java @@ -1,5 +1,37 @@ package blackjack.domain; public enum CardNumber { + 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 name; + + CardNumber(int score, String name) { + this.score = score; + this.name = name; + } + + public int getScore() { + return score; + } + + public String getName() { + return name; + } + + public boolean isAce() { + return this == ACE; + } } From ec4503d7b68cb0c76398319185af9409211350cd Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:16:22 +0900 Subject: [PATCH 17/39] =?UTF-8?q?feat(Blackjack):=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EC=9D=98=20=EB=AC=B8=EC=96=91=EC=9D=84=20=EA=B0=80=EC=A7=80?= =?UTF-8?q?=EB=8A=94=20CardType=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/CardType.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/blackjack/domain/CardType.java b/src/main/java/blackjack/domain/CardType.java index 09ab757e..4f915b7d 100644 --- a/src/main/java/blackjack/domain/CardType.java +++ b/src/main/java/blackjack/domain/CardType.java @@ -1,4 +1,18 @@ package blackjack.domain; public enum CardType { + SPADE("스페이드"), + CLOBER("클로버"), + HEART("하트"), + DIAMOND("다이아몬드"); + + private final String type; + + CardType(String type) { + this.type = type; + } + + public String getType() { + return type; + } } From 5d92ef8a8f85725a0d9ff88adb2886347eefe444 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:16:46 +0900 Subject: [PATCH 18/39] =?UTF-8?q?feat(Blackjack):=20CardNumber,=20CardType?= =?UTF-8?q?=EC=9D=84=20=EA=B0=96=EB=8A=94=20Card=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Card.java | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index c7a20673..6ef9eab8 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -2,4 +2,27 @@ public class Card { + private final CardNumber cardNumber; + private final CardType cardType; + + public Card(CardNumber cardNumber, CardType cardType) { + this.cardNumber = cardNumber; + this.cardType = cardType; + } + + public String getCardName() { + return cardNumber.getName(); + } + + public int getCardNumber() { + return cardNumber.getScore(); + } + + public String getCardType() { + return cardType.getType(); + } + + public boolean isAceCard() { + return cardNumber.isAce(); + } } From 0f9255432ca60e76e477986c9295e6b8022a0864 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:17:40 +0900 Subject: [PATCH 19/39] =?UTF-8?q?feat(Blackjack):=20=EA=B2=8C=EC=9E=84?= =?UTF-8?q?=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=A0=2052=EC=9E=A5=EC=9D=98?= =?UTF-8?q?=20=EB=8D=B1=EC=9D=84=20=EB=A7=8C=EB=93=9C=EB=8A=94=20Deck=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Deck.java | 40 ++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 1f6951d7..2736f8ae 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -1,5 +1,45 @@ package blackjack.domain; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + public class Deck { + private final int TOP_OF_CARDS = 0; + private final String INVALID_DRAW = "남아있는 카드가 없습니다"; + private final List cards; + + private Deck(List cards) { + this.cards = cards; + } + + public static Deck createDeck() { + List blackJack = makeBlackJackCards(); + + Collections.shuffle(blackJack); + + return new Deck(blackJack); + } + + private static List makeBlackJackCards() { + return Arrays.stream(CardNumber.values()) + .flatMap(number -> + Arrays.stream(CardType.values()) + .map(type -> new Card(number, type))) + .collect(Collectors.toList()); + } + + public Card cardDraw() { + if (cards.isEmpty()) { + throw new RuntimeException(INVALID_DRAW); + } + + return cards.remove(TOP_OF_CARDS); + } + + public List getCards() { + return cards; + } } From 28228aa835f8398c8cb07f60781af2d28ccd7f9b Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:18:34 +0900 Subject: [PATCH 20/39] =?UTF-8?q?feat(Blackjack):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EC=B2=98?= =?UTF-8?q?=EC=9D=8C=20=EB=91=90=EC=9E=A5=EC=9D=98=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EB=BD=91=EB=8A=94=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/GamePlayers.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/blackjack/domain/GamePlayers.java b/src/main/java/blackjack/domain/GamePlayers.java index 8fa1b934..167be21a 100644 --- a/src/main/java/blackjack/domain/GamePlayers.java +++ b/src/main/java/blackjack/domain/GamePlayers.java @@ -2,6 +2,8 @@ public abstract class GamePlayers { + private static final int INIT_CNT = 2; + protected final String playerName; protected final OwnCards ownCards; @@ -17,6 +19,12 @@ protected GamePlayers(String playerName, OwnCards ownCards) { public abstract boolean isAvailDraw(); + public void initOwnCards(Deck deck) { + for (int i = 0; i < INIT_CNT; i++) { + ownCards.addCard(deck.cardDraw()); + } + } + public String getPlayerName() { return playerName; } From a26e00aae8cb63ec6c3882db2f4ea5eca25116fb Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:19:21 +0900 Subject: [PATCH 21/39] =?UTF-8?q?feat(Blackjack):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EA=B0=80=EC=A7=84=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=B4=20=EC=B9=B4=EB=93=9C=EB=93=A4?= =?UTF-8?q?=EC=9D=98=20=EC=B4=9D=20=ED=95=A9=EC=9D=84=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C,=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=EC=9D=B8=EC=A7=80,=20=EC=B4=88=EA=B3=BC=ED=96=88?= =?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=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/OwnCards.java | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/blackjack/domain/OwnCards.java b/src/main/java/blackjack/domain/OwnCards.java index 18ac1d22..efc806ae 100644 --- a/src/main/java/blackjack/domain/OwnCards.java +++ b/src/main/java/blackjack/domain/OwnCards.java @@ -5,12 +5,34 @@ public class OwnCards { + private final int BLACKJACK = 21; + private final int ACE_NUMBER_TEN = 10; + private final int ACE_NUMBER_ONE = 1; + private final List ownCards; public OwnCards() { this.ownCards = new ArrayList<>(); } + public int getTotalScore() { + int total = ownCards.stream().mapToInt(Card::getCardNumber).sum(); + + if (total <= BLACKJACK - ACE_NUMBER_TEN && ownCards.stream().anyMatch(Card::isAceCard)) { + return total + ACE_NUMBER_TEN - ACE_NUMBER_ONE; + } + + return total; + } + + public boolean isScoreLimit() { + return getTotalScore() > BLACKJACK; + } + + public boolean isBlackJack() { + return getTotalScore() == BLACKJACK; + } + public void addCard(Card card) { ownCards.add(card); } From c552ba4d2268387e6e714ae05ef0d304effbae58 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:20:09 +0900 Subject: [PATCH 22/39] =?UTF-8?q?feat(Blackjack):=20=EB=94=9C=EB=9F=AC,=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=EB=A5=BC=20=EB=BD=91=EC=9D=84=20=EC=88=98=20=EC=9E=88?= =?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?=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4=EB=94=A9=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Dealer.java | 2 +- src/main/java/blackjack/domain/Player.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 3fc52155..cd56e4b3 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -14,7 +14,7 @@ public Dealer(OwnCards ownCards) { } public boolean isAvailDraw() { - return false; + return ownCards.getTotalScore() <= DEALER_DRAW_LIMIT && !ownCards.isScoreLimit(); } } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 97b065a2..c5d6d30c 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -10,6 +10,6 @@ public Player(String playerName) { @Override public boolean isAvailDraw() { - return false; + return ownCards.getTotalScore() <= DEALER_DRAW_LIMIT && !ownCards.isScoreLimit(); } } From a9dbeb2814b40dac3be6a5ccbc252d7ead52e128 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:23:12 +0900 Subject: [PATCH 23/39] =?UTF-8?q?test(Blackjack):=20CardNumber=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/CardNumberTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/blackjack/domain/CardNumberTest.java diff --git a/src/test/java/blackjack/domain/CardNumberTest.java b/src/test/java/blackjack/domain/CardNumberTest.java new file mode 100644 index 00000000..cff05bcb --- /dev/null +++ b/src/test/java/blackjack/domain/CardNumberTest.java @@ -0,0 +1,20 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +class CardNumberTest { + + @Test + void 카드_전체_크기_확인() { + assertThat(CardNumber.values()).hasSize(13); + } + + @Test + void 카드_확인() { + CardNumber cardNumber = CardNumber.ACE; + assertTrue(cardNumber.isAce()); + } +} From 53e152088238f488de4e7cafe7d75b20423025c5 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:23:30 +0900 Subject: [PATCH 24/39] =?UTF-8?q?test(Blackjack):=20CardType=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/CardTypeTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/test/java/blackjack/domain/CardTypeTest.java diff --git a/src/test/java/blackjack/domain/CardTypeTest.java b/src/test/java/blackjack/domain/CardTypeTest.java new file mode 100644 index 00000000..55ac78f4 --- /dev/null +++ b/src/test/java/blackjack/domain/CardTypeTest.java @@ -0,0 +1,20 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class CardTypeTest { + + @Test + void 카드_타입_크기_확인() { + assertThat(CardType.values()).hasSize(4); + } + + @Test + void 카드_타입_확인() { + CardType cardType = CardType.DIAMOND; + assertThat(cardType.getType()).isEqualTo("다이아몬드"); + } +} From 38de5d3f240d9e17f5a8447bd4cd1f31d84c6be7 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:23:41 +0900 Subject: [PATCH 25/39] =?UTF-8?q?test(Blackjack):=20Card=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/CardTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/blackjack/domain/CardTest.java diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java new file mode 100644 index 00000000..5da735e6 --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,16 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +class CardTest { + + @Test + void 카드_만들기_테스트() { + Card card = new Card(CardNumber.ACE, CardType.CLOBER); + + assertThat(card.getCardName()).isEqualTo("A"); + assertThat(card.getCardType()).isEqualTo("클로버"); + } +} From 497ab0af88d713b2594c65706d468e459e8cb9ea Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:23:49 +0900 Subject: [PATCH 26/39] =?UTF-8?q?test(Blackjack):=20Deck=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/DeckTest.java | 28 ++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/test/java/blackjack/domain/DeckTest.java diff --git a/src/test/java/blackjack/domain/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java new file mode 100644 index 00000000..f9ad8e65 --- /dev/null +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -0,0 +1,28 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class DeckTest { + + private Deck deck; + + @BeforeEach + void 덱_만들기() { + deck = Deck.createDeck(); + } + + @Test + void 게임에_사용할_덱_만들기() { + Set cards = IntStream.range(0, 52) + .mapToObj(card -> deck.cardDraw()) + .collect(Collectors.toSet()); + + assertThat(cards.size()).isEqualTo(52); + } +} From d6233dc75cd3b12249153404274ab09f5841074e Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:24:57 +0900 Subject: [PATCH 27/39] =?UTF-8?q?test(Blackjack):=20OwnCardTest=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/OwnCardsTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/test/java/blackjack/domain/OwnCardsTest.java diff --git a/src/test/java/blackjack/domain/OwnCardsTest.java b/src/test/java/blackjack/domain/OwnCardsTest.java new file mode 100644 index 00000000..d51c6630 --- /dev/null +++ b/src/test/java/blackjack/domain/OwnCardsTest.java @@ -0,0 +1,41 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class OwnCardsTest { + + @Test + void 사용자_카드_추가_테스트() { + OwnCards ownCards = new OwnCards(); + + ownCards.addCard(new Card(CardNumber.ACE, CardType.DIAMOND)); + ownCards.addCard(new Card(CardNumber.FIVE, CardType.DIAMOND)); + + assertThat(ownCards.getTotalScore()).isEqualTo(15); + } + + @Test + void 사용자_카드_점수_초과() { + OwnCards ownCards = new OwnCards(); + + ownCards.addCard(new Card(CardNumber.KING, CardType.DIAMOND)); + ownCards.addCard(new Card(CardNumber.QUEEN, CardType.DIAMOND)); + ownCards.addCard(new Card(CardNumber.EIGHT, CardType.CLOBER)); + + assertTrue(ownCards.isScoreLimit()); + } + + @Test + void 사용자_카드_블랙잭() { + OwnCards ownCards = new OwnCards(); + + ownCards.addCard(new Card(CardNumber.KING, CardType.DIAMOND)); + ownCards.addCard(new Card(CardNumber.QUEEN, CardType.DIAMOND)); + ownCards.addCard(new Card(CardNumber.ACE, CardType.CLOBER)); + + assertTrue(ownCards.isBlackJack()); + } +} From e8ac38bbba15154726e99fda95531beabafdd5df Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:28:04 +0900 Subject: [PATCH 28/39] =?UTF-8?q?feat(Blackjack):=20=EB=94=9C=EB=9F=AC,=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=ED=95=9C=EC=9E=A5=20=EB=BD=91=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/GamePlayers.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/blackjack/domain/GamePlayers.java b/src/main/java/blackjack/domain/GamePlayers.java index 167be21a..6ec06775 100644 --- a/src/main/java/blackjack/domain/GamePlayers.java +++ b/src/main/java/blackjack/domain/GamePlayers.java @@ -25,6 +25,10 @@ public void initOwnCards(Deck deck) { } } + public void drawOneCards(Deck deck) { + ownCards.addCard(deck.cardDraw()); + } + public String getPlayerName() { return playerName; } From dee7ffc13a6052f126a51ecec88e7d34ae5ac0a4 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:29:54 +0900 Subject: [PATCH 29/39] =?UTF-8?q?test(Blackjack):=20Gameplayers,=20?= =?UTF-8?q?=EC=83=81=EC=86=8D=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=93=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/DealerTest.java | 41 +++++++++++++++++++ .../blackjack/domain/GamePlayersTest.java | 41 +++++++++++++++++++ .../java/blackjack/domain/PlayerTest.java | 38 +++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 src/test/java/blackjack/domain/DealerTest.java create mode 100644 src/test/java/blackjack/domain/GamePlayersTest.java create mode 100644 src/test/java/blackjack/domain/PlayerTest.java diff --git a/src/test/java/blackjack/domain/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java new file mode 100644 index 00000000..64f80910 --- /dev/null +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -0,0 +1,41 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class DealerTest { + + private Deck deck; + private Dealer dealer; + + @BeforeEach + void 덱_만들기() { + dealer = new Dealer(); + deck = Deck.createDeck(); + } + + @Test + void 카드_뽑기_가능_테스트() { + dealer.initOwnCards(deck); + dealer.initOwnCards(deck); + + assertFalse(dealer.isAvailDraw()); + } + + @Test + void 카드_두장_뽑기_테스트() { + dealer.initOwnCards(deck); + + assertThat(dealer.ownCards.getOwnCards().size()).isEqualTo(2); + } + + @Test + void 카드_한장_뽑기_테스트() { + dealer.drawOneCards(deck); + + assertThat(dealer.ownCards.getOwnCards().size()).isEqualTo(1); + } +} diff --git a/src/test/java/blackjack/domain/GamePlayersTest.java b/src/test/java/blackjack/domain/GamePlayersTest.java new file mode 100644 index 00000000..878c8251 --- /dev/null +++ b/src/test/java/blackjack/domain/GamePlayersTest.java @@ -0,0 +1,41 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertFalse; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class GamePlayersTest { + + private Deck deck; + private GamePlayers gamePlayers; + + @BeforeEach + void 덱_만들기() { + gamePlayers = new Dealer(); + deck = Deck.createDeck(); + } + + @Test + void 카드_뽑기_가능_테스트() { + gamePlayers.initOwnCards(deck); + gamePlayers.initOwnCards(deck); + + assertFalse(gamePlayers.isAvailDraw()); + } + + @Test + void 카드_두장_뽑기_테스트() { + gamePlayers.initOwnCards(deck); + + assertThat(gamePlayers.ownCards.getOwnCards().size()).isEqualTo(2); + } + + @Test + void 카드_한장_뽑기_테스트() { + gamePlayers.drawOneCards(deck); + + assertThat(gamePlayers.ownCards.getOwnCards().size()).isEqualTo(1); + } +} diff --git a/src/test/java/blackjack/domain/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java new file mode 100644 index 00000000..81e06e6a --- /dev/null +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -0,0 +1,38 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class PlayerTest { + + private Deck deck; + private Player player; + + @BeforeEach + void 덱_만들기() { + player = new Player("Player"); + deck = Deck.createDeck(); + } + + @Test + void 카드_뽑기_가능_테스트() { + assertTrue(player.isAvailDraw()); + } + + @Test + void 카드_두장_뽑기_테스트() { + player.initOwnCards(deck); + + assertThat(player.ownCards.getOwnCards().size()).isEqualTo(2); + } + + @Test + void 카드_한장_뽑기_테스트() { + player.drawOneCards(deck); + + assertThat(player.ownCards.getOwnCards().size()).isEqualTo(1); + } +} From 597f4c39a14f3661e6abc8472198ec2ccb36c4cf Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:30:54 +0900 Subject: [PATCH 30/39] =?UTF-8?q?feat(Blackjack):=20player=EB=A5=BC=20?= =?UTF-8?q?=EB=8B=B4=EB=8A=94=20Players=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 63fbd7e3..81e1ab52 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -1,5 +1,21 @@ package blackjack.domain; +import java.util.List; +import java.util.stream.Collectors; + public class Players { + private final List players; + + public Players(List players) { + this.players = players; + } + + public static Players createPlayers(List input) { + return new Players(input.stream().map(Player::new).collect(Collectors.toList())); + } + + public List getPlayers() { + return players; + } } From 88febd15fcb9e827146a98e70bf04fae53cace88 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:31:27 +0900 Subject: [PATCH 31/39] =?UTF-8?q?test(Blackjack):=20Players=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/PlayersTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/java/blackjack/domain/PlayersTest.java diff --git a/src/test/java/blackjack/domain/PlayersTest.java b/src/test/java/blackjack/domain/PlayersTest.java new file mode 100644 index 00000000..4ab9c9cb --- /dev/null +++ b/src/test/java/blackjack/domain/PlayersTest.java @@ -0,0 +1,17 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class PlayersTest { + + @Test + void 플레이어_만들기_테스트() { + Players players = Players.createPlayers(Arrays.asList("a", "b", "c", "d")); + + assertThat(players.getPlayers().size()).isEqualTo(4); + } +} From b2e2f123a6703ae310c90b065be77c8f0a99efc5 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:34:29 +0900 Subject: [PATCH 32/39] =?UTF-8?q?feat(Blackjack):=20=EC=B2=98=EC=9D=8C=20?= =?UTF-8?q?=EB=94=9C=EB=9F=AC,=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EB=8A=94=20InputView,=20Parser=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/util/Parser.java | 13 +++++++ src/main/java/blackjack/view/InputView.java | 43 +++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/src/main/java/blackjack/util/Parser.java b/src/main/java/blackjack/util/Parser.java index 7c38e762..add70f72 100644 --- a/src/main/java/blackjack/util/Parser.java +++ b/src/main/java/blackjack/util/Parser.java @@ -1,5 +1,18 @@ package blackjack.util; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + public class Parser { + private static final String DELIMITER = ","; + private static final String SPACE = " "; + private static final String NOT_SPACE = ""; + + public static List parseInput(String input) { + String[] splitInput = input.replace(SPACE, NOT_SPACE).split(DELIMITER); + + return Arrays.stream(splitInput).collect(Collectors.toList()); + } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index ff86c007..991e368f 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,5 +1,48 @@ package blackjack.view; +import blackjack.util.Parser; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Scanner; +import java.util.Set; + public class InputView { + private static final String SPACE = " "; + private static final String PLAYERS_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요. (쉼표 기준으로 분리)"; + private static final String EXIST_MIN_PLAYER = "최소한 1명의 플레이어가 있어야 합니다."; + private static final String DUPLICATE_PLAYER = "중복되는 플레이어가 있습니다."; + private static final Scanner scanner = new Scanner(System.in); + + private InputView() { + + } + + public static List getPlayers() { + System.out.println(PLAYERS_INPUT_MESSAGE); + + String input = scanner.nextLine().replace(SPACE, ""); + + validateEmptyValue(input); + + List parseInput = Parser.parseInput(input); + validateDuplePlayer(parseInput); + + return parseInput; + } + + private static void validateEmptyValue(String input) { + if (Objects.isNull(input) || input.isEmpty()) { + throw new IllegalArgumentException(EXIST_MIN_PLAYER); + } + } + + private static void validateDuplePlayer(List input) { + Set duple = new HashSet<>(input); + + if (duple.size() != input.size()) { + throw new IllegalArgumentException(DUPLICATE_PLAYER); + } + } } From 8de7a716aa32aa8e345c9291e6f51030e7ac4f54 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:37:04 +0900 Subject: [PATCH 33/39] =?UTF-8?q?feat(Blackjack):=20=EC=B2=98=EC=9D=8C=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=8B=9C=EC=9E=91=EC=97=90=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20ResultView-inputPlayersPrint=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 14 +++++++++++ src/main/java/blackjack/view/ResultView.java | 24 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 8debf126..cb264d87 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -1,5 +1,19 @@ package blackjack.controller; +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Players; +import blackjack.view.InputView; +import blackjack.view.ResultView; + public class BlackJackController { + public static void playBlackJack() { + Deck deck = Deck.createDeck(); + Dealer dealer = new Dealer(); + Players players = Players.createPlayers(InputView.getPlayers()); + + ResultView resultView = new ResultView(dealer, players); + resultView.inputPlayersPrint(); + } } diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 9650d68d..95b29ed0 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -1,5 +1,29 @@ package blackjack.view; +import blackjack.domain.Dealer; +import blackjack.domain.GamePlayers; +import blackjack.domain.Players; +import java.util.stream.Collectors; + public class ResultView { + private static String DELIMETER = ", "; + private static String INIT_DISPENSER_MESSAGE = "에게 2장의 카드를 나누었습니다."; + + private final Dealer dealer; + private final Players players; + + public ResultView(Dealer dealer, Players players) { + this.dealer = dealer; + this.players = players; + } + + public void inputPlayersPrint() { + String resultPlayers = dealer.getPlayerName() + DELIMETER + players.getPlayers().stream() + .map(GamePlayers::getPlayerName).collect(Collectors.joining(DELIMETER)) + + INIT_DISPENSER_MESSAGE; + + System.out.println(resultPlayers); + } + } From 9e8dc3a16d9491c3070626db56a9086ba16a702b Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:38:46 +0900 Subject: [PATCH 34/39] =?UTF-8?q?feat(Blackjack):=20Application=EC=97=90?= =?UTF-8?q?=EC=84=9C=20BlackJackController=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/Application.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java index 4c4dceeb..b9691cb7 100644 --- a/src/main/java/blackjack/Application.java +++ b/src/main/java/blackjack/Application.java @@ -1,8 +1,10 @@ package blackjack; +import blackjack.controller.BlackJackController; + public class Application { public static void main(String[] args) { - + BlackJackController.playBlackJack(); } } From b63729066102c657b50e08028a24e3b27316b56f Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:41:35 +0900 Subject: [PATCH 35/39] =?UTF-8?q?feat(Blackjack):=20=EB=94=9C=EB=9F=AC,=20?= =?UTF-8?q?=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4=EA=B0=80=20=EC=B2=98?= =?UTF-8?q?=EC=9D=8C=20=EC=B9=B4=EB=93=9C=EB=A5=BC=20=EB=B0=9B=EA=B3=A0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=B9=B4=EB=93=9C=20=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?InputView,=20OutputView=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 19 ++++++++++++++++++ src/main/java/blackjack/view/InputView.java | 9 +++++++++ src/main/java/blackjack/view/ResultView.java | 20 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index cb264d87..2bdde9bf 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -5,6 +5,7 @@ import blackjack.domain.Players; import blackjack.view.InputView; import blackjack.view.ResultView; +import java.util.Objects; public class BlackJackController { @@ -15,5 +16,23 @@ public static void playBlackJack() { ResultView resultView = new ResultView(dealer, players); resultView.inputPlayersPrint(); + + dealer.initOwnCards(deck); + players.getPlayers().forEach(player -> player.initOwnCards(deck)); + + resultView.playerCardsPrint(dealer); + players.getPlayers().forEach(resultView::playerCardsPrint); + + players.getPlayers().forEach(player -> { + while (player.isAvailDraw() && Objects.equals(InputView.doQuestion(player), "y")) { + player.drawOneCards(deck); + resultView.playerCardsPrint(player); + } + }); + + if (dealer.isAvailDraw()) { + dealer.drawOneCards(deck); + resultView.dealerDrawCardPrint(dealer); + } } } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 991e368f..fa93b8ae 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.GamePlayers; import blackjack.util.Parser; import java.util.HashSet; import java.util.List; @@ -13,6 +14,8 @@ public class InputView { private static final String PLAYERS_INPUT_MESSAGE = "게임에 참여할 사람의 이름을 입력하세요. (쉼표 기준으로 분리)"; private static final String EXIST_MIN_PLAYER = "최소한 1명의 플레이어가 있어야 합니다."; private static final String DUPLICATE_PLAYER = "중복되는 플레이어가 있습니다."; + private static final String QUESTION = "는 한장의 카드를 더 받겠습니까? (예는 y, 아니오는 n)"; + private static final Scanner scanner = new Scanner(System.in); private InputView() { @@ -45,4 +48,10 @@ private static void validateDuplePlayer(List input) { throw new IllegalArgumentException(DUPLICATE_PLAYER); } } + + public static String doQuestion(GamePlayers gamePlayers) { + System.out.println(gamePlayers.getPlayerName() + QUESTION); + + return scanner.nextLine(); + } } diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 95b29ed0..b966dafa 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -4,11 +4,14 @@ import blackjack.domain.GamePlayers; import blackjack.domain.Players; import java.util.stream.Collectors; +import java.util.stream.Stream; public class ResultView { private static String DELIMETER = ", "; + private static String COLON = " : "; private static String INIT_DISPENSER_MESSAGE = "에게 2장의 카드를 나누었습니다."; + private static String DEALER_DRAW_CARD_MESSAGE = "는 16이하라 한장의 카드를 더 받았습니다."; private final Dealer dealer; private final Players players; @@ -26,4 +29,21 @@ public void inputPlayersPrint() { System.out.println(resultPlayers); } + public void playerCardsPrint(GamePlayers gamePlayers) { + System.out.println(playersOwnCards(gamePlayers)); + } + + public String playersOwnCards(GamePlayers gamePlayers) { + return gamePlayers.getPlayerName() + COLON + + gamePlayers.myOwnCards().getOwnCards().stream() + .flatMap(card -> Stream.of(card.getCardName() + card.getCardType())).collect( + Collectors.toList()); + } + + public void dealerDrawCardPrint(GamePlayers gamePlayers) { + String result = gamePlayers.getPlayerName() + DEALER_DRAW_CARD_MESSAGE; + + System.out.println(result + "\n"); + } + } From 2c62248ffe0a21dc99fb9ba552eaa3e0fd2c7b59 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:43:12 +0900 Subject: [PATCH 36/39] =?UTF-8?q?feat(Blackjack):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=A0=20Gam?= =?UTF-8?q?eResult,=20ResultValue=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/GameResult.java | 77 +++++++++++++++++++ .../java/blackjack/domain/ResultValue.java | 29 ++++++- 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/GameResult.java b/src/main/java/blackjack/domain/GameResult.java index 34018e66..c992e51b 100644 --- a/src/main/java/blackjack/domain/GameResult.java +++ b/src/main/java/blackjack/domain/GameResult.java @@ -1,5 +1,82 @@ package blackjack.domain; +import static blackjack.domain.ResultValue.DRAW; +import static blackjack.domain.ResultValue.LOSE; +import static blackjack.domain.ResultValue.WIN; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + public class GameResult { + private final LinkedHashMap gameStatus; + + private GameResult(LinkedHashMap gameStatus) { + this.gameStatus = gameStatus; + } + + public static GameResult calGameResult(Dealer dealer, Players players) { + LinkedHashMap result = new LinkedHashMap<>(); + + players.getPlayers() + .forEach(player -> result.put(player.getPlayerName(), getPlayerResult(dealer, player))); + + return new GameResult(result); + } + + private static ResultValue getPlayerResult(Dealer dealer, Player player) { + OwnCards dealerDeck = dealer.ownCards; + OwnCards playerDeck = player.ownCards; + + if (playerDeck.isScoreLimit()) { + return LOSE; + } + + if (dealerDeck.isScoreLimit()) { + return WIN; + } + + if (playerDeck.isBlackJack() && dealerDeck.isBlackJack()) { + return DRAW; + } + + if (playerDeck.isBlackJack()) { + return WIN; + } + + if (dealerDeck.isBlackJack()) { + return LOSE; + } + + if (playerDeck.getTotalScore() == dealerDeck.getTotalScore()) { + return DRAW; + } + + if (playerDeck.getTotalScore() > dealerDeck.getTotalScore()) { + return WIN; + } + + return LOSE; + } + + public List getDealerGameResult() { + return gameStatus + .values() + .stream() + .map(ResultValue::reverseScore) + .collect(Collectors.groupingBy(group -> group, Collectors.counting())) + .entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .map(m -> m.getValue() + m.getKey().getName()) + .collect(Collectors.toList()); + } + + public List getplayerGameResult() { + return gameStatus.entrySet().stream() + .map(player -> player.getKey() + " : " + player.getValue().getName()).collect( + Collectors.toList()); + } } diff --git a/src/main/java/blackjack/domain/ResultValue.java b/src/main/java/blackjack/domain/ResultValue.java index 0d24ca6a..1649a786 100644 --- a/src/main/java/blackjack/domain/ResultValue.java +++ b/src/main/java/blackjack/domain/ResultValue.java @@ -1,5 +1,32 @@ package blackjack.domain; -public class ResultValue { +import java.util.Arrays; +public enum ResultValue { + + WIN(1, "승"), + DRAW(0, "무"), + LOSE(-1, "패"); + + private static final String INVALID_KEY = "존재하지 않는 값입니다."; + private int score; + private String name; + + ResultValue(int score, String name) { + this.score = score; + this.name = name; + } + + private static ResultValue create(int score) { + return Arrays.stream(ResultValue.values()).filter(value -> value.score == score) + .findFirst().orElseThrow(() -> new IllegalArgumentException(INVALID_KEY)); + } + + public ResultValue reverseScore() { + return ResultValue.create(-score); + } + + public String getName() { + return name; + } } From 6dcec25e9c99edd3ae070b929519c62f9c897ee7 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:44:35 +0900 Subject: [PATCH 37/39] =?UTF-8?q?test(Blackjack):=20GameResult,=20ResultVa?= =?UTF-8?q?lue=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/domain/GameResultTest.java | 43 +++++++++++++++++++ .../blackjack/domain/ResultValueTest.java | 26 +++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/test/java/blackjack/domain/GameResultTest.java create mode 100644 src/test/java/blackjack/domain/ResultValueTest.java diff --git a/src/test/java/blackjack/domain/GameResultTest.java b/src/test/java/blackjack/domain/GameResultTest.java new file mode 100644 index 00000000..5e7ae622 --- /dev/null +++ b/src/test/java/blackjack/domain/GameResultTest.java @@ -0,0 +1,43 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class GameResultTest { + + Dealer dealer; + Players players; + + @BeforeEach + void 테스트_셋업() { + dealer = new Dealer(); + dealer.ownCards.addCard(new Card(CardNumber.KING, CardType.DIAMOND)); + dealer.ownCards.addCard(new Card(CardNumber.QUEEN, CardType.DIAMOND)); + + Player player = new Player("pobi"); + player.ownCards.addCard(new Card(CardNumber.FIVE, CardType.HEART)); + player.ownCards.addCard(new Card(CardNumber.EIGHT, CardType.HEART)); + + Player player2 = new Player("pubi"); + player2.ownCards.addCard(new Card(CardNumber.TEN, CardType.HEART)); + player2.ownCards.addCard(new Card(CardNumber.TEN, CardType.CLOBER)); + player2.ownCards.addCard(new Card(CardNumber.ACE, CardType.CLOBER)); + + players = new Players(Arrays.asList(player, player2)); + } + + @Test + void 블랙잭_딜러_결과_테스트() { + assertThat(GameResult.calGameResult(dealer, players).getDealerGameResult()).isEqualTo( + Arrays.asList("1승", "1패")); + } + + @Test + void 블랙잭_플레이어_결과_테스트() { + assertThat(GameResult.calGameResult(dealer, players).getplayerGameResult()).isEqualTo( + Arrays.asList("pobi : 패", "pubi : 승")); + } +} diff --git a/src/test/java/blackjack/domain/ResultValueTest.java b/src/test/java/blackjack/domain/ResultValueTest.java new file mode 100644 index 00000000..0adda02b --- /dev/null +++ b/src/test/java/blackjack/domain/ResultValueTest.java @@ -0,0 +1,26 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.Collections; +import org.junit.jupiter.api.Test; + +class ResultValueTest { + + @Test + void 블랙잭_결과_테스트() { + Dealer dealer = new Dealer(); + dealer.ownCards.addCard(new Card(CardNumber.KING, CardType.DIAMOND)); + dealer.ownCards.addCard(new Card(CardNumber.QUEEN, CardType.DIAMOND)); + + Player player = new Player("pobi"); + player.ownCards.addCard(new Card(CardNumber.FIVE, CardType.HEART)); + player.ownCards.addCard(new Card(CardNumber.EIGHT, CardType.HEART)); + + Players players = new Players(Arrays.asList(player)); + + assertThat(GameResult.calGameResult(dealer, players).getDealerGameResult()).isEqualTo( + Collections.singletonList("1승")); + } +} From 3dcb065004918097e536060fd43d312eeae00b88 Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 00:46:55 +0900 Subject: [PATCH 38/39] =?UTF-8?q?feat(Blackjack):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/BlackJackController.java | 9 ++++++++ src/main/java/blackjack/view/ResultView.java | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/blackjack/controller/BlackJackController.java b/src/main/java/blackjack/controller/BlackJackController.java index 2bdde9bf..6011de9f 100644 --- a/src/main/java/blackjack/controller/BlackJackController.java +++ b/src/main/java/blackjack/controller/BlackJackController.java @@ -2,6 +2,7 @@ import blackjack.domain.Dealer; import blackjack.domain.Deck; +import blackjack.domain.GameResult; import blackjack.domain.Players; import blackjack.view.InputView; import blackjack.view.ResultView; @@ -34,5 +35,13 @@ public static void playBlackJack() { dealer.drawOneCards(deck); resultView.dealerDrawCardPrint(dealer); } + + resultView.playersGetTotalScore(dealer); + players.getPlayers().forEach(resultView::playersGetTotalScore); + + resultView.gameResultMessagePrint(); + GameResult gameResult = GameResult.calGameResult(dealer, players); + resultView.dealerGameResultPrint(gameResult); + resultView.playerGameResultPrint(gameResult); } } diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index b966dafa..bd6b0f1b 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -2,6 +2,7 @@ import blackjack.domain.Dealer; import blackjack.domain.GamePlayers; +import blackjack.domain.GameResult; import blackjack.domain.Players; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -12,6 +13,8 @@ public class ResultView { private static String COLON = " : "; private static String INIT_DISPENSER_MESSAGE = "에게 2장의 카드를 나누었습니다."; private static String DEALER_DRAW_CARD_MESSAGE = "는 16이하라 한장의 카드를 더 받았습니다."; + private static String PLAYER_TOTAL_SCORE_MESSAGE = " - 결과 : "; + private static String GAME_RESULT_MESSAGE = "## 최종 승패"; private final Dealer dealer; private final Players players; @@ -46,4 +49,22 @@ public void dealerDrawCardPrint(GamePlayers gamePlayers) { System.out.println(result + "\n"); } + public void playersGetTotalScore(GamePlayers gamePlayers) { + String result = playersOwnCards(gamePlayers) + PLAYER_TOTAL_SCORE_MESSAGE + + gamePlayers.myOwnCards().getTotalScore(); + + System.out.println(result); + } + + public void gameResultMessagePrint() { + System.out.println(GAME_RESULT_MESSAGE); + } + + public void dealerGameResultPrint(GameResult gameResult) { + System.out.println(dealer.getPlayerName() + COLON + gameResult.getDealerGameResult()); + } + + public void playerGameResultPrint(GameResult gameResult) { + gameResult.getplayerGameResult().forEach(System.out::println); + } } From abeae4886be83d018b0da5ae1aaaf3e7d1b97a3a Mon Sep 17 00:00:00 2001 From: gal2o Date: Fri, 18 Feb 2022 01:01:17 +0900 Subject: [PATCH 39/39] =?UTF-8?q?docs(Blackjack):=20=EB=B8=94=EB=9E=99?= =?UTF-8?q?=EC=9E=AD=20README=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 2bc84a34..25ca1934 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # java-rentcompany # 기능 요구사항 -- [ ] 이동거리를 입력받아 자동차 객체를 생성한다. -- [ ] 이동거리를 활용해 차량 별로 필요한 연료를 계산한다. -- [ ] 보고서를 출력한다. +- [X] 이동거리를 입력받아 자동차 객체를 생성한다. +- [X] 이동거리를 활용해 차량 별로 필요한 연료를 계산한다. +- [X] 보고서를 출력한다. # java-blackjack ## 기능 요구 사항 @@ -16,13 +16,13 @@ - GamePlayers - GamePlayers는 딜러와 플레이어를 갖고 있다. - Dealer - - [ ] 딜러는 처음에 카드를 두 장 받는다. - - [ ] 딜러는 카드의 합이 16이하이면 1장을 반드시 받고, 17 이상이면 추가로 받을 수 없다. + - [X] 딜러는 처음에 카드를 두 장 받는다. + - [X] 딜러는 카드의 합이 16이하이면 1장을 반드시 받고, 17 이상이면 추가로 받을 수 없다. - Players - Players에는 Player를 담고 있다. - Player - - [ ] 플레이어는 InputView를 통해 입력받는다. - - [ ] 입력 받은 Player는 인스턴스 생성 + - [X] 플레이어는 InputView를 통해 입력받는다. + - [X] 입력 받은 Player는 인스턴스 생성 - OwnCards - 플레이어들이 가지고 있는 카드들 - 이 카드들을 사용하여 게임의 결과를 정한다. @@ -31,17 +31,17 @@ - 게임에 사용할 52장의 카드를 생성한다. - Card - CardNumber - - [ ] 카드 번호를 생성하는 객체 + - [X] 카드 번호를 생성하는 객체 - CardType - - [ ] 카드 타입을 생성하는 객체 + - [X] 카드 타입을 생성하는 객체 - CardTotal - - [ ] 게임 이용자들의 카드 합을 구하는 클래스 + - [X] 게임 이용자들의 카드 합을 구하는 클래스 - GamePlay - - [ ] 게임을 진행하는 클래스 + - [X] 게임을 진행하는 클래스 - GameResult - - [ ] 게임의 결과를 만드는 클래스 + - [X] 게임의 결과를 만드는 클래스 - ResultValue - - [ ] 승, 무, 패를 가지고 있는 ENUM 클래스 + - [X] 승, 무, 패를 가지고 있는 ENUM 클래스 - InputView - ResultView