From 7be777dd1107b23722bd67dc699e12d45a692059 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 16:16:06 +0900 Subject: [PATCH 01/64] =?UTF-8?q?docs:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EC=9A=94=EA=B5=AC=20=EC=82=AC=ED=95=AD=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기능 요구사항 - 각 보유 차량 (5대) 렌트할 때 대략적인 이동거리를 입력 - 자동차 객체 생성 시 생성자에 이동거리 주입 - 연료량 계산 - 연료 주입에 필요한 연료량 보고서 생성 프로그래밍 요구사항 - 상속 / 추상 메서드 활용 - 조건문 X Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 03ba7ed3..a4551209 100644 --- a/README.md +++ b/README.md @@ -1 +1,15 @@ -# java-blackjack \ No newline at end of file +# java-blackjack + +## 연료 주입 + +### 기능 요구사항 + +- [ ] 각 보유 차량 (5대) 렌트할 때 대략적인 이동거리를 입력 + - [ ] 자동차 객체 생성 시 생성자에 이동거리 주입 + - [ ] 연료량 계산 +- [ ] 연료 주입에 필요한 연료량 보고서 생성 + +### 프로그래밍 요구사항 + +- [ ] 상속 / 추상 메서드 활용 +- [ ] 조건문 X \ No newline at end of file From f1985fb8f30d4af6aa4d1b4d7482eb61703355d3 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 16:17:12 +0900 Subject: [PATCH 02/64] refactor: Remove Unnecessary Files empty.txt's Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/empty.txt | 0 src/test/java/empty.txt | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/empty.txt 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/test/java/empty.txt b/src/test/java/empty.txt deleted file mode 100644 index e69de29b..00000000 From 9ce23cdd50d1fffd51450ebf4fffa914ce781d6e Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 17:09:01 +0900 Subject: [PATCH 03/64] =?UTF-8?q?test:=20RentCompanyTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 주입 연료량 출력 보고서 정상 동작 여부 확인 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- .../java/rentcompany/RentCompanyTest.java | 44 +++++++++++++++++++ 1 file changed, 44 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..1969ee23 --- /dev/null +++ b/src/test/java/rentcompany/RentCompanyTest.java @@ -0,0 +1,44 @@ +package rentcompany; + +import static org.assertj.core.api.Assertions.assertThat; + +import rentcompany.domain.car.Avante; +import rentcompany.domain.car.K5; +import rentcompany.domain.RentCompany; +import rentcompany.domain.car.Sonata; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class RentCompanyTest { + + private static final String NEWLINE = "\n"; + + // RentCompany + // - 자동차 리스트 + // - 연료량 리포트 + + @DisplayName("연료량 리포트 테스트 - 렌트카 업체에 자동차 목록, 대략적인 이동거리를 입력받으면, 주입해야 하는 연료량 확인할 수 있는 보고서가 작성됩니다.") + @Test + void testReportResultValid() { + // Given + RentCompany company = new RentCompany(); + company.addCar(new Sonata(150)); + company.addCar(new Sonata(120)); + company.addCar(new Avante(300)); + company.addCar(new K5(260)); + company.addCar(new K5(390)); + + // When + String report = company.generateReport(); + + // Then + assertThat(report) + .isEqualTo( + "Sonata : 15리터" + NEWLINE + + "Sonata : 12리터" + NEWLINE + + "Avante : 20리터" + NEWLINE + + "K5 : 20리터" + NEWLINE + + "K5 : 30리터" + NEWLINE + ); + } +} From 6d4d637533011fd8d4066f3befc20dbb9df3c5b8 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 17:10:01 +0900 Subject: [PATCH 04/64] =?UTF-8?q?feat:=20Car=20/=20PassengerCar=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 - 필요 기능 정의 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/rentcompany/domain/car/Car.java | 9 +++++++++ src/main/java/rentcompany/domain/car/PassengerCar.java | 8 ++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/main/java/rentcompany/domain/car/Car.java create mode 100644 src/main/java/rentcompany/domain/car/PassengerCar.java diff --git a/src/main/java/rentcompany/domain/car/Car.java b/src/main/java/rentcompany/domain/car/Car.java new file mode 100644 index 00000000..318c1c53 --- /dev/null +++ b/src/main/java/rentcompany/domain/car/Car.java @@ -0,0 +1,9 @@ +package rentcompany.domain.car; + +public interface Car { + + double getDistancePerLiter(); + double getTripDistance(); + String getName(); + +} diff --git a/src/main/java/rentcompany/domain/car/PassengerCar.java b/src/main/java/rentcompany/domain/car/PassengerCar.java new file mode 100644 index 00000000..496b1f26 --- /dev/null +++ b/src/main/java/rentcompany/domain/car/PassengerCar.java @@ -0,0 +1,8 @@ +package rentcompany.domain.car; + +public abstract class PassengerCar implements Car { + + public double getChargeQuantity() { + return getTripDistance() / getDistancePerLiter(); + } +} From 1f44c48beb792916eab2ef4c966a6c0746ba9444 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 17:10:41 +0900 Subject: [PATCH 05/64] =?UTF-8?q?feat:=20PassengerCar=20=EC=83=81=EC=86=8D?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=EC=9E=90=EB=8F=99=EC=B0=A8=20=EC=A0=95?= =?UTF-8?q?=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Sonata - K5 - Avante Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- .../java/rentcompany/domain/car/Avante.java | 27 +++++++++++++++++++ src/main/java/rentcompany/domain/car/K5.java | 27 +++++++++++++++++++ .../java/rentcompany/domain/car/Sonata.java | 27 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/main/java/rentcompany/domain/car/Avante.java create mode 100644 src/main/java/rentcompany/domain/car/K5.java create mode 100644 src/main/java/rentcompany/domain/car/Sonata.java diff --git a/src/main/java/rentcompany/domain/car/Avante.java b/src/main/java/rentcompany/domain/car/Avante.java new file mode 100644 index 00000000..327d5610 --- /dev/null +++ b/src/main/java/rentcompany/domain/car/Avante.java @@ -0,0 +1,27 @@ +package rentcompany.domain.car; + +public class Avante extends PassengerCar { + + private static final int MILEAGE = 15; + + private final int distance; + + public Avante(int distance) { + this.distance = distance; + } + + @Override + public double getDistancePerLiter() { + return MILEAGE; + } + + @Override + public double getTripDistance() { + return distance; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/rentcompany/domain/car/K5.java b/src/main/java/rentcompany/domain/car/K5.java new file mode 100644 index 00000000..4199a021 --- /dev/null +++ b/src/main/java/rentcompany/domain/car/K5.java @@ -0,0 +1,27 @@ +package rentcompany.domain.car; + +public class K5 extends PassengerCar { + + private static final int MILEAGE = 13; + + private final int distance; + + public K5(int distance) { + this.distance = distance; + } + + @Override + public double getDistancePerLiter() { + return MILEAGE; + } + + @Override + public double getTripDistance() { + return distance; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/rentcompany/domain/car/Sonata.java b/src/main/java/rentcompany/domain/car/Sonata.java new file mode 100644 index 00000000..746e41ac --- /dev/null +++ b/src/main/java/rentcompany/domain/car/Sonata.java @@ -0,0 +1,27 @@ +package rentcompany.domain.car; + +public class Sonata extends PassengerCar { + + private static final int MILEAGE = 10; + + private final int distance; + + public Sonata(final int distance) { + this.distance = distance; + } + + @Override + public double getDistancePerLiter() { + return MILEAGE; + } + + @Override + public double getTripDistance() { + return distance; + } + + @Override + public String getName() { + return this.getClass().getSimpleName(); + } +} From 4b1ce8b6f3356ca485bc38fc86fedf2d3bc34ba7 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 17:11:48 +0900 Subject: [PATCH 06/64] =?UTF-8?q?feat:=20RentCompany=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 자동차 추가 (addCar) - 주입 연료량 보고서 출력 (generateReport) Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- .../java/rentcompany/domain/RentCompany.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/rentcompany/domain/RentCompany.java diff --git a/src/main/java/rentcompany/domain/RentCompany.java b/src/main/java/rentcompany/domain/RentCompany.java new file mode 100644 index 00000000..de4bcb96 --- /dev/null +++ b/src/main/java/rentcompany/domain/RentCompany.java @@ -0,0 +1,37 @@ +package rentcompany.domain; + +import java.util.ArrayList; +import java.util.List; +import rentcompany.domain.car.PassengerCar; + +public class RentCompany { + + private static final String COLON = " : "; + private static final String LITER = "리터"; + private static final String NEWLINE = "\n"; + + private final List cars; + + public RentCompany() { + this.cars = new ArrayList<>(); + } + + public void addCar(final PassengerCar car) { + cars.add(car); + } + + public String generateReport() { + StringBuilder sb = new StringBuilder(); + + for (PassengerCar car: cars) { + sb.append(car.getName()) + .append(COLON) + .append(String.format("%d", (int) car.getChargeQuantity())) + .append(LITER) + .append(NEWLINE); + } + + return sb.toString(); + } + +} From 41bbc18852365abc3e1648fd83501ba1ff630d3c Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 17:13:07 +0900 Subject: [PATCH 07/64] refactor: Add final modifier into K5 / Avante for making distance immutable Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/rentcompany/domain/car/Avante.java | 2 +- src/main/java/rentcompany/domain/car/K5.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/rentcompany/domain/car/Avante.java b/src/main/java/rentcompany/domain/car/Avante.java index 327d5610..ac36f003 100644 --- a/src/main/java/rentcompany/domain/car/Avante.java +++ b/src/main/java/rentcompany/domain/car/Avante.java @@ -6,7 +6,7 @@ public class Avante extends PassengerCar { private final int distance; - public Avante(int distance) { + public Avante(final int distance) { this.distance = distance; } diff --git a/src/main/java/rentcompany/domain/car/K5.java b/src/main/java/rentcompany/domain/car/K5.java index 4199a021..ae1a942f 100644 --- a/src/main/java/rentcompany/domain/car/K5.java +++ b/src/main/java/rentcompany/domain/car/K5.java @@ -6,7 +6,7 @@ public class K5 extends PassengerCar { private final int distance; - public K5(int distance) { + public K5(final int distance) { this.distance = distance; } From 5a02cc76a9f485cbb5627d651699c4bacc25ad8f Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 11 Feb 2022 17:14:17 +0900 Subject: [PATCH 08/64] =?UTF-8?q?docs:=20=EC=97=B0=EB=A3=8C=20=EC=A3=BC?= =?UTF-8?q?=EC=9E=85=20=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a4551209..5e20ce79 100644 --- a/README.md +++ b/README.md @@ -4,12 +4,12 @@ ### 기능 요구사항 -- [ ] 각 보유 차량 (5대) 렌트할 때 대략적인 이동거리를 입력 - - [ ] 자동차 객체 생성 시 생성자에 이동거리 주입 - - [ ] 연료량 계산 -- [ ] 연료 주입에 필요한 연료량 보고서 생성 +- [X] 각 보유 차량 (5대) 렌트할 때 대략적인 이동거리를 입력 + - [X] 자동차 객체 생성 시 생성자에 이동거리 주입 + - [X] 연료량 계산 +- [X] 연료 주입에 필요한 연료량 보고서 생성 ### 프로그래밍 요구사항 -- [ ] 상속 / 추상 메서드 활용 -- [ ] 조건문 X \ No newline at end of file +- [X] 상속 / 추상 메서드 활용 +- [X] 조건문 X From c8d91812fffef87dead412e47016f501bf72f3d1 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Mon, 14 Feb 2022 18:09:50 +0900 Subject: [PATCH 09/64] docs: update README.md Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 5e20ce79..57b7a7b1 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,21 @@ - [X] 상속 / 추상 메서드 활용 - [X] 조건문 X + +### 블랙잭 + +- [] 카드계산 + - [] 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산 +- [] 카드지급 기준 + - [] 게임을 시작하면 플레이어는 두 장의 카드를 지급 받음 + - [] 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있음 + -[] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없음 +- [] 승자 결정 기준 + - [] 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이김 + - [] 게임을 완료한 후 각 플레이어별로 승패를 출력 + +### 프로그래밍 요구사항 + +- [] 모든 엔티티를 작게 유지 +- [] 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않음 +- [] 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 함 From 18629ed87018dce015fbad37fb24e64ba10cef79 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Mon, 14 Feb 2022 18:12:13 +0900 Subject: [PATCH 10/64] =?UTF-8?q?test:=20CardNumberTest=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/test/java/blackjack/CardNumberTest.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/test/java/blackjack/CardNumberTest.java diff --git a/src/test/java/blackjack/CardNumberTest.java b/src/test/java/blackjack/CardNumberTest.java new file mode 100644 index 00000000..598328bb --- /dev/null +++ b/src/test/java/blackjack/CardNumberTest.java @@ -0,0 +1,21 @@ +package blackjack; + +import java.util.stream.Stream; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class CardNumberTest { + + public static final Stream makeEnum() { + return Stream.of(Arguments.of(CardNumber.ACE, true), Arguments.of(CardNumber.KING, false)); + } + + @ParameterizedTest + @MethodSource("makeEnum") + public void 카드가_에이스_인지_확인_테스트(CardNumber cardNumber, boolean expect) { + Assertions.assertEquals(cardNumber.isAce(), expect); + } + +} From b1486aad114fecfa498096ad3621b03e54af2999 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Mon, 14 Feb 2022 18:18:28 +0900 Subject: [PATCH 11/64] =?UTF-8?q?feat:=20Player=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - List 최종 점수 반환 메서드 작성 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Card.java | 15 ++++++++ src/main/java/blackjack/CardNumber.java | 47 +++++++++++++++++++++++++ src/main/java/blackjack/Cards.java | 16 +++++++++ src/main/java/blackjack/Dealer.java | 13 +++++++ src/main/java/blackjack/Person.java | 19 ++++++++++ src/main/java/blackjack/Player.java | 17 +++++++++ src/test/java/blackjack/PlayerTest.java | 24 +++++++++++++ 7 files changed, 151 insertions(+) create mode 100644 src/main/java/blackjack/Card.java create mode 100644 src/main/java/blackjack/CardNumber.java create mode 100644 src/main/java/blackjack/Cards.java create mode 100644 src/main/java/blackjack/Dealer.java create mode 100644 src/main/java/blackjack/Person.java create mode 100644 src/main/java/blackjack/Player.java create mode 100644 src/test/java/blackjack/PlayerTest.java diff --git a/src/main/java/blackjack/Card.java b/src/main/java/blackjack/Card.java new file mode 100644 index 00000000..bcbbf782 --- /dev/null +++ b/src/main/java/blackjack/Card.java @@ -0,0 +1,15 @@ +package blackjack; + +public class Card { + + private final Suit suit; + private final CardNumber cardNumber; + public Card(Suit suit,CardNumber cardNumber) { + this.suit = suit; + this.cardNumber=cardNumber; + } + + public int getCardScore() { + return cardNumber.getScore(); + } +} diff --git a/src/main/java/blackjack/CardNumber.java b/src/main/java/blackjack/CardNumber.java new file mode 100644 index 00000000..29a7a48b --- /dev/null +++ b/src/main/java/blackjack/CardNumber.java @@ -0,0 +1,47 @@ +package blackjack; + +import java.util.Arrays; + +public enum CardNumber { + + ACE("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + JACK("J", 10), + QUEEN("Q", 10), + KING("K", 10); + + private final String initial; + private final int score; + + CardNumber(String initial, int score) { + this.initial = initial; + this.score = score; + } + + public static CardNumber of(final String initial) { + return Arrays.stream(values()) + .filter(cardNumber -> cardNumber.initial == initial) + .findFirst() + .orElseThrow(IllegalArgumentException::new); + } + + public boolean isAce() { + return this == ACE; + } + + public int getScore() { + return this.score; + } + + public String getInitial() { + return this.initial; + } + +} diff --git a/src/main/java/blackjack/Cards.java b/src/main/java/blackjack/Cards.java new file mode 100644 index 00000000..8f1831f2 --- /dev/null +++ b/src/main/java/blackjack/Cards.java @@ -0,0 +1,16 @@ +package blackjack; + +import java.util.List; + +public class Cards { + + private final List cards; + + public Cards(List cards) { + this.cards = cards; + } + + public int totalScore() { + return cards.stream().mapToInt(Card::getCardScore).sum(); + } +} diff --git a/src/main/java/blackjack/Dealer.java b/src/main/java/blackjack/Dealer.java new file mode 100644 index 00000000..d2ecb7ac --- /dev/null +++ b/src/main/java/blackjack/Dealer.java @@ -0,0 +1,13 @@ +package blackjack; + +public class Dealer extends Person { + + public Dealer(String userName,Cards cards) { + super(userName,cards); + } + + @Override + public Card drawCard() { + return null; + } +} diff --git a/src/main/java/blackjack/Person.java b/src/main/java/blackjack/Person.java new file mode 100644 index 00000000..0507c864 --- /dev/null +++ b/src/main/java/blackjack/Person.java @@ -0,0 +1,19 @@ +package blackjack; + +public abstract class Person { + + private static final int INIT_CARD_COUNT = 2; + + protected final String userName; + protected final Cards cards; + protected final Score score; + + public Person(String userName, Cards cards) { + this.userName = userName; + this.cards = cards; + this.score = new Score(0); + + } + + public abstract Card drawCard(); +} diff --git a/src/main/java/blackjack/Player.java b/src/main/java/blackjack/Player.java new file mode 100644 index 00000000..c051221e --- /dev/null +++ b/src/main/java/blackjack/Player.java @@ -0,0 +1,17 @@ +package blackjack; + +public class Player extends Person { + + public Player(String userName,Cards cards) { + super(userName,cards); + } + + public int getTotalScore(){ + return cards.totalScore(); + } + + @Override + public Card drawCard() { + return null; + } +} diff --git a/src/test/java/blackjack/PlayerTest.java b/src/test/java/blackjack/PlayerTest.java new file mode 100644 index 00000000..cb928e87 --- /dev/null +++ b/src/test/java/blackjack/PlayerTest.java @@ -0,0 +1,24 @@ +package blackjack; + +import java.util.Arrays; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class PlayerTest { + + private Player player; + + @BeforeEach + public void init() { + player = new Player("a", new Cards(Arrays.asList(new Card(Suit.CLUB, CardNumber.EIGHT), + new Card(Suit.DIAMOND, CardNumber.FIVE)))); + } + + @Test + public void 카드점수_확인_테스트() { + Assertions.assertThat(player.getTotalScore()).isEqualTo(13); + } + + +} From e8d2d78ea5335268d45d02115021d3d0d4166709 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Mon, 14 Feb 2022 18:19:04 +0900 Subject: [PATCH 12/64] =?UTF-8?q?feat:=20Score=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 각 카드 별 점수관련 클래스 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Score.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/blackjack/Score.java diff --git a/src/main/java/blackjack/Score.java b/src/main/java/blackjack/Score.java new file mode 100644 index 00000000..809c736d --- /dev/null +++ b/src/main/java/blackjack/Score.java @@ -0,0 +1,10 @@ +package blackjack; + +public class Score { + + private final int score; + + public Score(int score) { + this.score = score; + } +} From 151b0d4ab4eaed86f629d9ceed657621a0ff0dea Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Mon, 14 Feb 2022 18:19:25 +0900 Subject: [PATCH 13/64] =?UTF-8?q?feat:=20Suit=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Suit.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/blackjack/Suit.java diff --git a/src/main/java/blackjack/Suit.java b/src/main/java/blackjack/Suit.java new file mode 100644 index 00000000..dc19574b --- /dev/null +++ b/src/main/java/blackjack/Suit.java @@ -0,0 +1,19 @@ +package blackjack; + +public enum Suit { + SPADE("스페이드"), + HEART("하트"), + DIAMOND("다이아몬드"), + CLUB("클로버"); + + private String name; + + Suit(String name) { + this.name = name; + } + + public String getName() { + return name; + } + +} From 36af6d52a9738980820b059bf9b5428f2e14a63e Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 17:37:42 +0900 Subject: [PATCH 14/64] =?UTF-8?q?test:=20Deck=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 카드(52개)를 생성시점에 초기화 - 덱에서 한장을 카드를 뽑음 - 덱이 비면 예외 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/test/java/blackjack/DeckTest.java | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/blackjack/DeckTest.java diff --git a/src/test/java/blackjack/DeckTest.java b/src/test/java/blackjack/DeckTest.java new file mode 100644 index 00000000..851ca01b --- /dev/null +++ b/src/test/java/blackjack/DeckTest.java @@ -0,0 +1,43 @@ +package blackjack; + +import static org.assertj.core.api.Assertions.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; + +public class DeckTest { + + @Test + void 덱의_사이즈는_52개이다() { + Deck deck = Deck.create(); + + assertThat(deck.deckSize()).isEqualTo(52); + } + + @Test + void 덱에서_한장의_카드를_뽑을_수_있다() { + Card clubEight = new Card(Suit.CLUB, CardNumber.EIGHT); + Card clubSeven = new Card(Suit.CLUB, CardNumber.SEVEN); + + List cards = new ArrayList<>(Arrays.asList(clubEight, clubSeven)); + + Deck deck = new Deck(cards); + + Card card = deck.drawCard(); + Card expected = new Card(Suit.CLUB, CardNumber.EIGHT); + + assertThat(card).isEqualTo(expected); + } + + @Test + void 덱이_비어있을_때는_런타임_예외가_발생한다() { + List cards = new ArrayList<>(); + Deck deck = new Deck(cards); + + assertThatThrownBy(deck::drawCard) + .isInstanceOf(RuntimeException.class) + .hasMessage("더 이상 카드를 뽑을 수 없습니다."); + } +} From 16699dfb382f51408023ebbe4fd6a73dbaed11b7 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 17:38:19 +0900 Subject: [PATCH 15/64] =?UTF-8?q?feat:=20Deck=20=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Deck.java | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/blackjack/Deck.java diff --git a/src/main/java/blackjack/Deck.java b/src/main/java/blackjack/Deck.java new file mode 100644 index 00000000..39f0e691 --- /dev/null +++ b/src/main/java/blackjack/Deck.java @@ -0,0 +1,46 @@ +package blackjack; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class Deck { + + private static final int REMOVE_INDEX = 0; + private final List cards; + + public Deck(final List cards) { + this.cards = cards; + } + + public static Deck create() { + List cards = createEntireCards(); + Collections.shuffle(cards); + return new Deck(cards); + } + + public Card drawCard() { + if (cards.isEmpty()) { + throw new RuntimeException("더 이상 카드를 뽑을 수 없습니다."); + } + return cards.remove(REMOVE_INDEX); + } + + public int deckSize() { + return cards.size(); + } + + private static List createEntireCards() { + return Arrays.stream(CardNumber.values()) + .flatMap(Deck::createEntireSuitCards) + .collect(Collectors.toCollection(LinkedList::new)); + } + + private static Stream createEntireSuitCards(final CardNumber cardNumber) { + return Arrays.stream(Suit.values()) + .map(suit -> new Card(suit, cardNumber)); + } +} From a55c743b85e61eed02e819e92d276c7f750ff506 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 17:38:51 +0900 Subject: [PATCH 16/64] =?UTF-8?q?feat:=20Card=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20equals=20&=20hashCode=20=EC=98=A4=EB=B2=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카드끼리의 비교를 위해 구현 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Card.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/blackjack/Card.java b/src/main/java/blackjack/Card.java index bcbbf782..b5ac9701 100644 --- a/src/main/java/blackjack/Card.java +++ b/src/main/java/blackjack/Card.java @@ -1,5 +1,7 @@ package blackjack; +import java.util.Objects; + public class Card { private final Suit suit; @@ -12,4 +14,21 @@ public Card(Suit suit,CardNumber cardNumber) { public int getCardScore() { return cardNumber.getScore(); } + + @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 && cardNumber == card.cardNumber; + } + + @Override + public int hashCode() { + return Objects.hash(suit, cardNumber); + } } From fa5905deecd554a76bc91dcfa672a75c0c598833 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 17:39:51 +0900 Subject: [PATCH 17/64] =?UTF-8?q?refactor:=20CardNumber=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?Getter=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/CardNumber.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/blackjack/CardNumber.java b/src/main/java/blackjack/CardNumber.java index 29a7a48b..f4887424 100644 --- a/src/main/java/blackjack/CardNumber.java +++ b/src/main/java/blackjack/CardNumber.java @@ -13,6 +13,7 @@ public enum CardNumber { SEVEN("7", 7), EIGHT("8", 8), NINE("9", 9), + TEN("10", 10), JACK("J", 10), QUEEN("Q", 10), KING("K", 10); From 3dd4f681caeb520ad101f37860eb5c099dc1eb57 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 18:20:56 +0900 Subject: [PATCH 18/64] =?UTF-8?q?feat:=20Person=EC=9D=98=20=EC=B6=94?= =?UTF-8?q?=EC=83=81=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카드를 더 뽑을 수 있는지를 boolean으로 반환하는 canDrawCard() Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Person.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/Person.java b/src/main/java/blackjack/Person.java index 0507c864..b28a4eac 100644 --- a/src/main/java/blackjack/Person.java +++ b/src/main/java/blackjack/Person.java @@ -15,5 +15,5 @@ public Person(String userName, Cards cards) { } - public abstract Card drawCard(); + public abstract boolean canDrawCard(); } From 754087efa74574295bf8921a51c995ec9cee8bbc Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 18:21:27 +0900 Subject: [PATCH 19/64] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=98=A4=EB=B2=84=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가지고있는 cards 객체에서 위임 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Dealer.java | 4 ++-- src/main/java/blackjack/Player.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/Dealer.java b/src/main/java/blackjack/Dealer.java index d2ecb7ac..895c1dc6 100644 --- a/src/main/java/blackjack/Dealer.java +++ b/src/main/java/blackjack/Dealer.java @@ -7,7 +7,7 @@ public Dealer(String userName,Cards cards) { } @Override - public Card drawCard() { - return null; + public boolean canDrawCard() { + return cards.isNearTwentyOne(); } } diff --git a/src/main/java/blackjack/Player.java b/src/main/java/blackjack/Player.java index c051221e..c20489fc 100644 --- a/src/main/java/blackjack/Player.java +++ b/src/main/java/blackjack/Player.java @@ -11,7 +11,7 @@ public int getTotalScore(){ } @Override - public Card drawCard() { - return null; + public boolean canDrawCard() { + return cards.isNearTwentyOne(); } } From 5c6ebe816b358c8ea3674bc6e8dba9d9c8df6639 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 18:22:19 +0900 Subject: [PATCH 20/64] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B3=B5=EB=B0=B1=20=EB=B0=8F=20public=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/test/java/blackjack/PlayerTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/java/blackjack/PlayerTest.java b/src/test/java/blackjack/PlayerTest.java index cb928e87..427aebae 100644 --- a/src/test/java/blackjack/PlayerTest.java +++ b/src/test/java/blackjack/PlayerTest.java @@ -10,15 +10,13 @@ class PlayerTest { private Player player; @BeforeEach - public void init() { + void init() { player = new Player("a", new Cards(Arrays.asList(new Card(Suit.CLUB, CardNumber.EIGHT), new Card(Suit.DIAMOND, CardNumber.FIVE)))); } @Test - public void 카드점수_확인_테스트() { + void 카드점수_확인_테스트() { Assertions.assertThat(player.getTotalScore()).isEqualTo(13); } - - } From 9b05903b68f1386de4279cd141c42b8c78895c56 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Tue, 15 Feb 2022 18:24:06 +0900 Subject: [PATCH 21/64] =?UTF-8?q?feat:=20Cards=EC=9D=98=20isNearTwentyOne?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 21보다 작다면 한장 더 뽑을 수 있음 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Cards.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/blackjack/Cards.java b/src/main/java/blackjack/Cards.java index 8f1831f2..f81f8c82 100644 --- a/src/main/java/blackjack/Cards.java +++ b/src/main/java/blackjack/Cards.java @@ -4,6 +4,7 @@ public class Cards { + private static final int REFERENCE_POINT = 21; private final List cards; public Cards(List cards) { @@ -13,4 +14,8 @@ public Cards(List cards) { public int totalScore() { return cards.stream().mapToInt(Card::getCardScore).sum(); } + + public boolean isNearTwentyOne() { + return totalScore() < REFERENCE_POINT; + } } From 7c3352a758a985553ca553c31d1a08c9ec1a99c4 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Wed, 16 Feb 2022 18:27:25 +0900 Subject: [PATCH 22/64] =?UTF-8?q?test:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dealer - Deck - Players Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/test/java/blackjack/DealerTest.java | 50 ++++++++++++++++++++++++ src/test/java/blackjack/DeckTest.java | 6 +-- src/test/java/blackjack/PlayersTest.java | 37 ++++++++++++++++++ 3 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 src/test/java/blackjack/DealerTest.java create mode 100644 src/test/java/blackjack/PlayersTest.java diff --git a/src/test/java/blackjack/DealerTest.java b/src/test/java/blackjack/DealerTest.java new file mode 100644 index 00000000..3258e4cf --- /dev/null +++ b/src/test/java/blackjack/DealerTest.java @@ -0,0 +1,50 @@ +package blackjack; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class DealerTest { + + static Stream cardSetCases() { + return Stream.of( + Arguments.of(new Cards(getCards( + new Card(CardNumber.THREE, Suit.DIAMOND), + new Card(CardNumber.NINE, Suit.CLUB) + )), true), + Arguments.of(new Cards(getCards( + new Card(CardNumber.EIGHT, Suit.DIAMOND), + new Card(CardNumber.TEN, Suit.CLUB) + )), false) + ); + } + + @ParameterizedTest + @MethodSource("cardSetCases") + void 총합_16이하일경우_한장_새로_뽑기(Cards cards, boolean expected) { + Dealer dealer = new Dealer("딜러", cards); + + assertEquals(dealer.canDrawCard(), expected); + } + + @Test + void 새로_뽑은_카드_보유_여부_검증() { + Deck deck = Deck.create(); + Dealer dealer = new Dealer("딜러", new Cards(new ArrayList<>())); + dealer.initializeDeck(deck); + dealer.drawCard(deck); + + assertEquals(dealer.cardSize(), 3); + } + + private static List getCards(Card ...cards) { + return Stream.of(cards).collect(Collectors.toList()); + } +} diff --git a/src/test/java/blackjack/DeckTest.java b/src/test/java/blackjack/DeckTest.java index 851ca01b..ac03e693 100644 --- a/src/test/java/blackjack/DeckTest.java +++ b/src/test/java/blackjack/DeckTest.java @@ -18,15 +18,15 @@ public class DeckTest { @Test void 덱에서_한장의_카드를_뽑을_수_있다() { - Card clubEight = new Card(Suit.CLUB, CardNumber.EIGHT); - Card clubSeven = new Card(Suit.CLUB, CardNumber.SEVEN); + Card clubEight = new Card(CardNumber.EIGHT, Suit.CLUB); + Card clubSeven = new Card(CardNumber.SEVEN, Suit.CLUB); List cards = new ArrayList<>(Arrays.asList(clubEight, clubSeven)); Deck deck = new Deck(cards); Card card = deck.drawCard(); - Card expected = new Card(Suit.CLUB, CardNumber.EIGHT); + Card expected = new Card(CardNumber.EIGHT, Suit.CLUB); assertThat(card).isEqualTo(expected); } diff --git a/src/test/java/blackjack/PlayersTest.java b/src/test/java/blackjack/PlayersTest.java new file mode 100644 index 00000000..a1b185e1 --- /dev/null +++ b/src/test/java/blackjack/PlayersTest.java @@ -0,0 +1,37 @@ +package blackjack; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class PlayersTest { + + private List playerList; + private Player pobi; + private Player jason; + + @BeforeEach + void setUp() { + pobi = new Player("pobi", new Cards(new ArrayList<>())); + jason = new Player("jason", new Cards(new ArrayList<>())); + + playerList = new ArrayList<>(Arrays.asList(pobi, jason)); + } + + @Test + void 플레이어별_카드_초기화_결과_검증() { + Deck deck = Deck.create(); + Players players = new Players(playerList); + players.initializeDeck(deck); + + assertAll( + () -> assertEquals(pobi.cardSize(), 2), + () -> assertEquals(jason.cardSize(), 2) + ); + } +} From c0e79991d4fbb3a0c9b7b8b737fc62f88a2df55f Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Wed, 16 Feb 2022 18:27:42 +0900 Subject: [PATCH 23/64] =?UTF-8?q?test:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Player Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/test/java/blackjack/PlayerTest.java | 34 ++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/test/java/blackjack/PlayerTest.java b/src/test/java/blackjack/PlayerTest.java index 427aebae..b50fb221 100644 --- a/src/test/java/blackjack/PlayerTest.java +++ b/src/test/java/blackjack/PlayerTest.java @@ -1,22 +1,50 @@ package blackjack; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class PlayerTest { private Player player; + static Stream scoreCases() { + return Stream.of( + Arguments.of(Arrays.asList(new Card(CardNumber.FIVE, Suit.HEART)), + Arrays.asList(new Card(CardNumber.TWO, Suit.HEART)), Score.WIN), + Arguments.of(Arrays.asList(new Card(CardNumber.TWO, Suit.HEART)), + Arrays.asList(new Card(CardNumber.TWO, Suit.HEART)), Score.DRAW), + Arguments.of(Arrays.asList(new Card(CardNumber.TWO, Suit.HEART)), + Arrays.asList(new Card(CardNumber.FIVE, Suit.HEART)), Score.LOSE) + ); + } + @BeforeEach void init() { - player = new Player("a", new Cards(Arrays.asList(new Card(Suit.CLUB, CardNumber.EIGHT), - new Card(Suit.DIAMOND, CardNumber.FIVE)))); + player = new Player("a", new Cards(Arrays.asList(new Card(CardNumber.EIGHT, Suit.CLUB), + new Card(CardNumber.FIVE, Suit.DIAMOND)))); } @Test void 카드점수_확인_테스트() { - Assertions.assertThat(player.getTotalScore()).isEqualTo(13); + assertThat(player.getTotalScore()).isEqualTo(13); + } + + @ParameterizedTest + @MethodSource("scoreCases") + void 딜러_플레이어의_점수_비교_테스트(List playerCards, List dealerCards, Score result) { + Player player = new Player("플레이어", new Cards(playerCards)); + Dealer dealer = new Dealer("딜러", new Cards(dealerCards)); + + assertEquals(player.compareScore(dealer), result); } } From 1d6d1ef24ca6a54cc16c99893be23578e8263df1 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Wed, 16 Feb 2022 18:28:22 +0900 Subject: [PATCH 24/64] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=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 - Card - Cards - Dealer - Deck - Person - Player - Score Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/Card.java | 17 +++++++++++++--- src/main/java/blackjack/Cards.java | 22 +++++++++++++++++++- src/main/java/blackjack/Dealer.java | 4 +++- src/main/java/blackjack/Deck.java | 2 +- src/main/java/blackjack/Person.java | 15 ++++++++++++-- src/main/java/blackjack/Player.java | 6 +++++- src/main/java/blackjack/Score.java | 31 +++++++++++++++++++++++++---- 7 files changed, 84 insertions(+), 13 deletions(-) diff --git a/src/main/java/blackjack/Card.java b/src/main/java/blackjack/Card.java index b5ac9701..a4df8f0a 100644 --- a/src/main/java/blackjack/Card.java +++ b/src/main/java/blackjack/Card.java @@ -4,11 +4,22 @@ public class Card { - private final Suit suit; + private static final String CARD_NAME_FORMAT = "%d%s"; + private final CardNumber cardNumber; - public Card(Suit suit,CardNumber cardNumber) { + private final Suit suit; + + public Card(CardNumber cardNumber, Suit suit) { + this.cardNumber = cardNumber; this.suit = suit; - this.cardNumber=cardNumber; + } + + public boolean isAce() { + return cardNumber.isAce(); + } + + public String getCardName() { + return String.format(CARD_NAME_FORMAT, cardNumber.name(), suit.getName()); } public int getCardScore() { diff --git a/src/main/java/blackjack/Cards.java b/src/main/java/blackjack/Cards.java index f81f8c82..9265946f 100644 --- a/src/main/java/blackjack/Cards.java +++ b/src/main/java/blackjack/Cards.java @@ -4,18 +4,38 @@ public class Cards { + private static final int ADDITION_ACE_SCORE = 10; + private static final int LIMITED_ACE_SCORE = 11; private static final int REFERENCE_POINT = 21; + private final List cards; public Cards(List cards) { this.cards = cards; } + public int size() { + return cards.size(); + } + public int totalScore() { - return cards.stream().mapToInt(Card::getCardScore).sum(); + int score = cards.stream().mapToInt(Card::getCardScore).sum(); + + if (hasAce() && score <= LIMITED_ACE_SCORE) { + return score + ADDITION_ACE_SCORE; + } + return score; } public boolean isNearTwentyOne() { return totalScore() < REFERENCE_POINT; } + + public void add(Card drawCard) { + cards.add(drawCard); + } + + private boolean hasAce() { + return cards.stream().anyMatch(Card::isAce); + } } diff --git a/src/main/java/blackjack/Dealer.java b/src/main/java/blackjack/Dealer.java index 895c1dc6..8cfc0d16 100644 --- a/src/main/java/blackjack/Dealer.java +++ b/src/main/java/blackjack/Dealer.java @@ -2,12 +2,14 @@ public class Dealer extends Person { + private static final int DEALER_DRAW_LIMIT = 16; + public Dealer(String userName,Cards cards) { super(userName,cards); } @Override public boolean canDrawCard() { - return cards.isNearTwentyOne(); + return cards.totalScore() <= DEALER_DRAW_LIMIT; } } diff --git a/src/main/java/blackjack/Deck.java b/src/main/java/blackjack/Deck.java index 39f0e691..7ca89e95 100644 --- a/src/main/java/blackjack/Deck.java +++ b/src/main/java/blackjack/Deck.java @@ -41,6 +41,6 @@ private static List createEntireCards() { private static Stream createEntireSuitCards(final CardNumber cardNumber) { return Arrays.stream(Suit.values()) - .map(suit -> new Card(suit, cardNumber)); + .map(suit -> new Card(cardNumber, suit)); } } diff --git a/src/main/java/blackjack/Person.java b/src/main/java/blackjack/Person.java index b28a4eac..7e4f416a 100644 --- a/src/main/java/blackjack/Person.java +++ b/src/main/java/blackjack/Person.java @@ -6,14 +6,25 @@ public abstract class Person { protected final String userName; protected final Cards cards; - protected final Score score; public Person(String userName, Cards cards) { this.userName = userName; this.cards = cards; - this.score = new Score(0); + } + public void drawCard(Deck deck) { + cards.add(deck.drawCard()); } public abstract boolean canDrawCard(); + + public int cardSize() { + return cards.size(); + } + + public void initializeDeck(Deck deck) { + for (int i = 0; i < INIT_CARD_COUNT; i++) { + cards.add(deck.drawCard()); + } + } } diff --git a/src/main/java/blackjack/Player.java b/src/main/java/blackjack/Player.java index c20489fc..e6acdfcd 100644 --- a/src/main/java/blackjack/Player.java +++ b/src/main/java/blackjack/Player.java @@ -2,7 +2,7 @@ public class Player extends Person { - public Player(String userName,Cards cards) { + public Player(String userName, Cards cards) { super(userName,cards); } @@ -14,4 +14,8 @@ public int getTotalScore(){ public boolean canDrawCard() { return cards.isNearTwentyOne(); } + + public Score compareScore(Dealer dealer) { + return Score.judge(cards, dealer.cards); + } } diff --git a/src/main/java/blackjack/Score.java b/src/main/java/blackjack/Score.java index 809c736d..9b6df644 100644 --- a/src/main/java/blackjack/Score.java +++ b/src/main/java/blackjack/Score.java @@ -1,10 +1,33 @@ package blackjack; -public class Score { +public enum Score { + WIN(1, "승"), + DRAW(0, "무"), + LOSE(-1, "패"); - private final int score; + private static final String UNDETECTABLE_EXCEPTION_OCCURRED = "예기치 않은 오류가 발생했습니다."; - public Score(int score) { - this.score = score; + private final int key; + private final String name; + + Score(int key, String name) { + this.key = key; + this.name = name; + } + + public static Score judge(Cards playerCards, Cards dealerCards) { + if (playerCards.totalScore() == dealerCards.totalScore()) { + return DRAW; + } + + if (playerCards.totalScore() > dealerCards.totalScore()) { + return WIN; + } + + if (playerCards.totalScore() < dealerCards.totalScore()) { + return LOSE; + } + + throw new RuntimeException(UNDETECTABLE_EXCEPTION_OCCURRED); } } From 0d26b30617482fd951bed46795dc26aefd1712ec Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Wed, 16 Feb 2022 18:28:39 +0900 Subject: [PATCH 25/64] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=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 - Players Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/Players.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/blackjack/Players.java diff --git a/src/main/java/blackjack/Players.java b/src/main/java/blackjack/Players.java new file mode 100644 index 00000000..fd5ff7f0 --- /dev/null +++ b/src/main/java/blackjack/Players.java @@ -0,0 +1,26 @@ +package blackjack; + +import java.util.ArrayList; +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 create(List names) { + return new Players( + names.stream() + .map(name -> new Player(name, new Cards(new ArrayList<>()))) + .collect(Collectors.toList()) + ); + } + + public void initializeDeck(Deck deck) { + players.stream().forEach(player -> player.initializeDeck(deck)); + } +} From dfeecf44a5c13200f38521660d2ffd4d3143686a Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Wed, 16 Feb 2022 18:29:06 +0900 Subject: [PATCH 26/64] feat: View / Controller Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- .../blackjack/controller/GameController.java | 13 +++++++++ src/main/java/blackjack/view/InputView.java | 28 +++++++++++++++++++ src/main/java/blackjack/view/ResultView.java | 5 ++++ 3 files changed, 46 insertions(+) create mode 100644 src/main/java/blackjack/controller/GameController.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/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java new file mode 100644 index 00000000..f0a0fb85 --- /dev/null +++ b/src/main/java/blackjack/controller/GameController.java @@ -0,0 +1,13 @@ +package blackjack.controller; + +import blackjack.Players; +import blackjack.view.InputView; +import java.util.List; + +public class GameController { + + public void run() { + List playerNames = InputView.getNames(); + Players.create(playerNames); + } +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..e5c087d2 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,28 @@ +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; + private static final String SPLITTER = ","; + private static final String MESSAGE_GET_NAMES = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + + static { + SCANNER = new Scanner(System.in); + } + + private InputView() { + } + + public static List getNames() { + System.out.println(MESSAGE_GET_NAMES); + + return Arrays.stream(SCANNER.nextLine().split(SPLITTER)) + .map(String::trim) + .collect(Collectors.toList()); + } +} 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 fccc5fce057a8dcb7bc57f4b3405777f05e02561 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Thu, 17 Feb 2022 10:06:20 +0900 Subject: [PATCH 27/64] =?UTF-8?q?refactor:=20domain=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/{ => domain}/Card.java | 2 +- src/main/java/blackjack/{ => domain}/CardNumber.java | 2 +- src/main/java/blackjack/{ => domain}/Cards.java | 2 +- src/main/java/blackjack/{ => domain}/Dealer.java | 2 +- src/main/java/blackjack/{ => domain}/Deck.java | 2 +- src/main/java/blackjack/{ => domain}/Person.java | 2 +- src/main/java/blackjack/{ => domain}/Player.java | 2 +- src/main/java/blackjack/{ => domain}/Players.java | 2 +- src/main/java/blackjack/{ => domain}/Score.java | 2 +- src/main/java/blackjack/{ => domain}/Suit.java | 2 +- src/test/java/blackjack/CardNumberTest.java | 3 ++- src/test/java/blackjack/DealerTest.java | 6 ++++++ src/test/java/blackjack/DeckTest.java | 4 ++++ src/test/java/blackjack/PlayerTest.java | 8 +++++++- src/test/java/blackjack/PlayersTest.java | 4 ++++ 15 files changed, 33 insertions(+), 12 deletions(-) rename src/main/java/blackjack/{ => domain}/Card.java (97%) rename src/main/java/blackjack/{ => domain}/CardNumber.java (97%) rename src/main/java/blackjack/{ => domain}/Cards.java (97%) rename src/main/java/blackjack/{ => domain}/Dealer.java (91%) rename src/main/java/blackjack/{ => domain}/Deck.java (97%) rename src/main/java/blackjack/{ => domain}/Person.java (95%) rename src/main/java/blackjack/{ => domain}/Player.java (93%) rename src/main/java/blackjack/{ => domain}/Players.java (95%) rename src/main/java/blackjack/{ => domain}/Score.java (96%) rename src/main/java/blackjack/{ => domain}/Suit.java (91%) diff --git a/src/main/java/blackjack/Card.java b/src/main/java/blackjack/domain/Card.java similarity index 97% rename from src/main/java/blackjack/Card.java rename to src/main/java/blackjack/domain/Card.java index a4df8f0a..ef0cdb85 100644 --- a/src/main/java/blackjack/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import java.util.Objects; diff --git a/src/main/java/blackjack/CardNumber.java b/src/main/java/blackjack/domain/CardNumber.java similarity index 97% rename from src/main/java/blackjack/CardNumber.java rename to src/main/java/blackjack/domain/CardNumber.java index f4887424..3dac16c2 100644 --- a/src/main/java/blackjack/CardNumber.java +++ b/src/main/java/blackjack/domain/CardNumber.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import java.util.Arrays; diff --git a/src/main/java/blackjack/Cards.java b/src/main/java/blackjack/domain/Cards.java similarity index 97% rename from src/main/java/blackjack/Cards.java rename to src/main/java/blackjack/domain/Cards.java index 9265946f..f66bab9b 100644 --- a/src/main/java/blackjack/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import java.util.List; diff --git a/src/main/java/blackjack/Dealer.java b/src/main/java/blackjack/domain/Dealer.java similarity index 91% rename from src/main/java/blackjack/Dealer.java rename to src/main/java/blackjack/domain/Dealer.java index 8cfc0d16..2c05c687 100644 --- a/src/main/java/blackjack/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; public class Dealer extends Person { diff --git a/src/main/java/blackjack/Deck.java b/src/main/java/blackjack/domain/Deck.java similarity index 97% rename from src/main/java/blackjack/Deck.java rename to src/main/java/blackjack/domain/Deck.java index 7ca89e95..52e41ace 100644 --- a/src/main/java/blackjack/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import java.util.Arrays; import java.util.Collections; diff --git a/src/main/java/blackjack/Person.java b/src/main/java/blackjack/domain/Person.java similarity index 95% rename from src/main/java/blackjack/Person.java rename to src/main/java/blackjack/domain/Person.java index 7e4f416a..c55ce09e 100644 --- a/src/main/java/blackjack/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; public abstract class Person { diff --git a/src/main/java/blackjack/Player.java b/src/main/java/blackjack/domain/Player.java similarity index 93% rename from src/main/java/blackjack/Player.java rename to src/main/java/blackjack/domain/Player.java index e6acdfcd..c31f7b10 100644 --- a/src/main/java/blackjack/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; public class Player extends Person { diff --git a/src/main/java/blackjack/Players.java b/src/main/java/blackjack/domain/Players.java similarity index 95% rename from src/main/java/blackjack/Players.java rename to src/main/java/blackjack/domain/Players.java index fd5ff7f0..da513b64 100644 --- a/src/main/java/blackjack/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/blackjack/Score.java b/src/main/java/blackjack/domain/Score.java similarity index 96% rename from src/main/java/blackjack/Score.java rename to src/main/java/blackjack/domain/Score.java index 9b6df644..0fd66191 100644 --- a/src/main/java/blackjack/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; public enum Score { WIN(1, "승"), diff --git a/src/main/java/blackjack/Suit.java b/src/main/java/blackjack/domain/Suit.java similarity index 91% rename from src/main/java/blackjack/Suit.java rename to src/main/java/blackjack/domain/Suit.java index dc19574b..afe6ba67 100644 --- a/src/main/java/blackjack/Suit.java +++ b/src/main/java/blackjack/domain/Suit.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; public enum Suit { SPADE("스페이드"), diff --git a/src/test/java/blackjack/CardNumberTest.java b/src/test/java/blackjack/CardNumberTest.java index 598328bb..ff8ca0e7 100644 --- a/src/test/java/blackjack/CardNumberTest.java +++ b/src/test/java/blackjack/CardNumberTest.java @@ -1,5 +1,6 @@ package blackjack; +import blackjack.domain.CardNumber; import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; @@ -8,7 +9,7 @@ class CardNumberTest { - public static final Stream makeEnum() { + public static Stream makeEnum() { return Stream.of(Arguments.of(CardNumber.ACE, true), Arguments.of(CardNumber.KING, false)); } diff --git a/src/test/java/blackjack/DealerTest.java b/src/test/java/blackjack/DealerTest.java index 3258e4cf..397b97e8 100644 --- a/src/test/java/blackjack/DealerTest.java +++ b/src/test/java/blackjack/DealerTest.java @@ -2,6 +2,12 @@ import static org.junit.jupiter.api.Assertions.assertEquals; +import blackjack.domain.Card; +import blackjack.domain.CardNumber; +import blackjack.domain.Cards; +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Suit; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/test/java/blackjack/DeckTest.java b/src/test/java/blackjack/DeckTest.java index ac03e693..6e9dda0e 100644 --- a/src/test/java/blackjack/DeckTest.java +++ b/src/test/java/blackjack/DeckTest.java @@ -2,6 +2,10 @@ import static org.assertj.core.api.Assertions.*; +import blackjack.domain.Card; +import blackjack.domain.CardNumber; +import blackjack.domain.Deck; +import blackjack.domain.Suit; import java.util.ArrayList; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/blackjack/PlayerTest.java b/src/test/java/blackjack/PlayerTest.java index b50fb221..f52884d6 100644 --- a/src/test/java/blackjack/PlayerTest.java +++ b/src/test/java/blackjack/PlayerTest.java @@ -3,10 +3,16 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import blackjack.domain.Card; +import blackjack.domain.CardNumber; +import blackjack.domain.Cards; +import blackjack.domain.Dealer; +import blackjack.domain.Player; +import blackjack.domain.Score; +import blackjack.domain.Suit; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/blackjack/PlayersTest.java b/src/test/java/blackjack/PlayersTest.java index a1b185e1..ba870cef 100644 --- a/src/test/java/blackjack/PlayersTest.java +++ b/src/test/java/blackjack/PlayersTest.java @@ -3,6 +3,10 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import blackjack.domain.Cards; +import blackjack.domain.Deck; +import blackjack.domain.Player; +import blackjack.domain.Players; import java.util.ArrayList; import java.util.Arrays; import java.util.List; From eb50a57f1d5fe56019ccc8942f61ca976c4a1b03 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:44:14 +0900 Subject: [PATCH 28/64] =?UTF-8?q?feat:=20ResultView=20=EB=B7=B0=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/view/ResultView.java | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 9650d68d..7dae4e70 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -1,5 +1,37 @@ package blackjack.view; +import static blackjack.domain.Person.INIT_CARD_COUNT; + +import blackjack.dto.CardInfo; +import blackjack.dto.NameInfo; +import java.util.List; +import java.util.stream.Collectors; + public class ResultView { + private static final String INIT_SHARE_MESSAGE = "%s와 %s에게 %d장을 받았습니다."; + private static final String DELIMITER = ", "; + private static final String DELETER_FORMAT = "%s: %s"; + private static final String PLAYER_FORMAT = "%s카드: %s"; + + public static void shareCards(String dealerName, List playerNames) { + String playersName = playerNames.stream().map(NameInfo::getPersonName) + .collect(Collectors.joining(DELIMITER)); + System.out.println(String.format(INIT_SHARE_MESSAGE, dealerName, playersName, INIT_CARD_COUNT)); + } + + public static void openCardInfo(CardInfo dealerCardInfo, List playerCardsInfo) { + System.out.println(String.format(DELETER_FORMAT, dealerCardInfo.getPersonName(), join(dealerCardInfo))); + + for (CardInfo playerCardInfo : playerCardsInfo) { + System.out.println(String.format(PLAYER_FORMAT, playerCardInfo.getPersonName(), join(playerCardInfo))); + } + } + + private static String join(CardInfo cardInfo) { + return cardInfo.getCardNames().stream() + .collect(Collectors.joining(DELIMITER)); + } + + } From 32ec9feb0e2f1b0beec44d3c20c3c76a8bdb8680 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:46:01 +0900 Subject: [PATCH 29/64] =?UTF-8?q?feat:=20Players=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EB=B0=8F=20=EC=B9=B4=EB=93=9C=20=EC=98=A4?= =?UTF-8?q?=ED=94=88=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Players.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index da513b64..01e90f80 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -1,5 +1,7 @@ package blackjack.domain; +import blackjack.dto.CardInfo; +import blackjack.dto.NameInfo; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -23,4 +25,13 @@ public static Players create(List names) { public void initializeDeck(Deck deck) { players.stream().forEach(player -> player.initializeDeck(deck)); } + + public List getPlayersName(){ + return players.stream().map(Person::mapToNameInfo).collect(Collectors.toList()); + } + + public List openCards(){ + return players.stream().map(Player::openCards).collect(Collectors.toList()); + } + } From b7e90731c5bb91db1ba040118879ecc6dcf41217 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:46:17 +0900 Subject: [PATCH 30/64] =?UTF-8?q?feat:=20Player=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=98=A4=ED=94=88=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Player.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index c31f7b10..f85addaf 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,5 +1,7 @@ package blackjack.domain; +import blackjack.dto.CardInfo; + public class Player extends Person { public Player(String userName, Cards cards) { @@ -15,6 +17,11 @@ public boolean canDrawCard() { return cards.isNearTwentyOne(); } + @Override + public CardInfo openCards() { + return new CardInfo(userName,cards.openCardAll()); + } + public Score compareScore(Dealer dealer) { return Score.judge(cards, dealer.cards); } From d45db419f2c401db53bfe18e62a8994c042a7c68 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:47:09 +0900 Subject: [PATCH 31/64] =?UTF-8?q?feat:=20Person=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=EC=98=A4=ED=94=88=20=EB=B0=8F=20NameDto=20=EB=B3=80=ED=99=98?= =?UTF-8?q?=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Person.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Person.java b/src/main/java/blackjack/domain/Person.java index c55ce09e..c7918ef2 100644 --- a/src/main/java/blackjack/domain/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -1,8 +1,11 @@ package blackjack.domain; +import blackjack.dto.CardInfo; +import blackjack.dto.NameInfo; + public abstract class Person { - private static final int INIT_CARD_COUNT = 2; + public static final int INIT_CARD_COUNT = 2; protected final String userName; protected final Cards cards; @@ -18,6 +21,8 @@ public void drawCard(Deck deck) { public abstract boolean canDrawCard(); + public abstract CardInfo openCards(); + public int cardSize() { return cards.size(); } @@ -27,4 +32,8 @@ public void initializeDeck(Deck deck) { cards.add(deck.drawCard()); } } + + public NameInfo mapToNameInfo() { + return new NameInfo(userName); + } } From 76af023c955cad2ea20e16e7c638a77cabf70145 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:47:50 +0900 Subject: [PATCH 32/64] =?UTF-8?q?feat:=20GameController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- .../blackjack/controller/GameController.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index f0a0fb85..e5daba82 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -1,13 +1,21 @@ package blackjack.controller; -import blackjack.Players; +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Players; import blackjack.view.InputView; -import java.util.List; public class GameController { public void run() { - List playerNames = InputView.getNames(); - Players.create(playerNames); + final PeopleController peopleController = new PeopleController( + Players.create(InputView.getNames()), new Dealer()); + + final Deck deck = Deck.create(); + + peopleController.setUpPerson(deck); + peopleController.play(deck); + peopleController.showGameResult(); } + } From 316a51054ad901617bdadda4a8f62e52768c9460 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:48:56 +0900 Subject: [PATCH 33/64] =?UTF-8?q?feat:=20Dealer=20CardInfo=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Dealer.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 2c05c687..a99dfaa9 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,15 +1,29 @@ package blackjack.domain; +import blackjack.dto.CardInfo; +import java.util.ArrayList; + public class Dealer extends Person { private static final int DEALER_DRAW_LIMIT = 16; + private static final String DEALER_NAME = "딜러"; + + public Dealer(String userName, Cards cards) { + super(userName, cards); + } - public Dealer(String userName,Cards cards) { - super(userName,cards); + public Dealer() { + this(DEALER_NAME, new Cards(new ArrayList<>())); } @Override public boolean canDrawCard() { return cards.totalScore() <= DEALER_DRAW_LIMIT; } + + @Override + public CardInfo openCards() { + return new CardInfo(userName,cards.openCardOne()); + } + } From acb412333a2f01687df348a0ffcd4aee29721e3d Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:49:54 +0900 Subject: [PATCH 34/64] =?UTF-8?q?feat:=20=EC=B9=B4=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B0=98=ED=99=98=20=EB=A9=94=EC=84=9C=EB=93=9C=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Cards.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index f66bab9b..b6941317 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -1,13 +1,15 @@ package blackjack.domain; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; public class Cards { private static final int ADDITION_ACE_SCORE = 10; private static final int LIMITED_ACE_SCORE = 11; private static final int REFERENCE_POINT = 21; - + private static final String CARD_SIZE_ZERO_ERROR = "카드가 존재하지 않습니다."; private final List cards; public Cards(List cards) { @@ -38,4 +40,15 @@ public void add(Card drawCard) { private boolean hasAce() { return cards.stream().anyMatch(Card::isAce); } + + public List openCardOne() { + if (cards.isEmpty()) { + throw new RuntimeException(CARD_SIZE_ZERO_ERROR); + } + return Arrays.asList(cards.get(0).getCardName()); + } + + public List openCardAll() { + return cards.stream().map(Card::getCardName).collect(Collectors.toList()); + } } From 4da5a3af42417d49be64d581b401727007e025b6 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:50:31 +0900 Subject: [PATCH 35/64] =?UTF-8?q?style:=20=EB=A7=A4=EC=A7=81=20=EB=84=98?= =?UTF-8?q?=EB=B2=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Card.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index ef0cdb85..18354673 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -19,7 +19,7 @@ public boolean isAce() { } public String getCardName() { - return String.format(CARD_NAME_FORMAT, cardNumber.name(), suit.getName()); + return String.format(CARD_NAME_FORMAT, cardNumber.getInitial(), suit.getName()); } public int getCardScore() { From 20652769ccf35a13bc99b0e399d536a06b24503c Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:51:01 +0900 Subject: [PATCH 36/64] =?UTF-8?q?feat:=20main=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 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/Application.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/blackjack/Application.java diff --git a/src/main/java/blackjack/Application.java b/src/main/java/blackjack/Application.java new file mode 100644 index 00000000..058a761c --- /dev/null +++ b/src/main/java/blackjack/Application.java @@ -0,0 +1,14 @@ +package blackjack; + +import blackjack.controller.GameController; + +public class Application { + + + public static void main(String[] args) { + + final GameController gameController = new GameController(); + gameController.run(); + } + +} From 15404c03a18b784bd4827dc64d0a1ff31027c760 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:51:41 +0900 Subject: [PATCH 37/64] =?UTF-8?q?feat:=20CardInfo=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/dto/CardInfo.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/main/java/blackjack/dto/CardInfo.java diff --git a/src/main/java/blackjack/dto/CardInfo.java b/src/main/java/blackjack/dto/CardInfo.java new file mode 100644 index 00000000..79a085f7 --- /dev/null +++ b/src/main/java/blackjack/dto/CardInfo.java @@ -0,0 +1,22 @@ +package blackjack.dto; + +import java.util.List; + +public class CardInfo { + + private final String personName; + private final List cardNames; + + public CardInfo(String personName, List cardNames) { + this.personName = personName; + this.cardNames = cardNames; + } + + public String getPersonName() { + return personName; + } + + public List getCardNames() { + return cardNames; + } +} From d85d6e7b3fecdfef41f60671682acf4889b8043b Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:52:01 +0900 Subject: [PATCH 38/64] =?UTF-8?q?feat:=20NameInfo=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/dto/NameInfo.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/blackjack/dto/NameInfo.java diff --git a/src/main/java/blackjack/dto/NameInfo.java b/src/main/java/blackjack/dto/NameInfo.java new file mode 100644 index 00000000..1a2a5582 --- /dev/null +++ b/src/main/java/blackjack/dto/NameInfo.java @@ -0,0 +1,14 @@ +package blackjack.dto; + +public class NameInfo { + + private String personName; + + public NameInfo(String personName) { + this.personName = personName; + } + + public String getPersonName() { + return personName; + } +} From e774da420554ca21f2f513cc2b44e9c37688fff4 Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:52:24 +0900 Subject: [PATCH 39/64] =?UTF-8?q?feat:=20PeopleController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- .../controller/PeopleController.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/blackjack/controller/PeopleController.java diff --git a/src/main/java/blackjack/controller/PeopleController.java b/src/main/java/blackjack/controller/PeopleController.java new file mode 100644 index 00000000..9157c92d --- /dev/null +++ b/src/main/java/blackjack/controller/PeopleController.java @@ -0,0 +1,43 @@ +package blackjack.controller; + + +import blackjack.domain.Dealer; +import blackjack.domain.Deck; +import blackjack.domain.Players; +import blackjack.view.ResultView; + +public class PeopleController { + + private final Players players; + private final Dealer dealer; + + public PeopleController(Players players, Dealer dealer) { + this.players = players; + this.dealer = dealer; + } + + public void setUpPerson(Deck deck) { + players.initializeDeck(deck); + dealer.initializeDeck(deck); + } + + public void play(Deck deck) { + playersJudgment(deck); + dealerJudgment(deck); + + ResultView.shareCards(dealer.mapToNameInfo().getPersonName(), players.getPlayersName()); + ResultView.openCardInfo(dealer.openCards(), players.openCards()); + } + + private void playersJudgment(Deck deck) { + + } + + private void dealerJudgment(Deck deck) { + + } + + public void showGameResult() { + + } +} From 66d3ef6fbe8a854dfb6678de453dfd85cd3b349b Mon Sep 17 00:00:00 2001 From: parkhyojeong Date: Thu, 17 Feb 2022 21:53:52 +0900 Subject: [PATCH 40/64] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=EB=9D=BC?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=95=EB=A0=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Card.java | 2 +- src/main/java/blackjack/view/ResultView.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 18354673..3979fc11 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -4,7 +4,7 @@ public class Card { - private static final String CARD_NAME_FORMAT = "%d%s"; + private static final String CARD_NAME_FORMAT = "%s%s"; private final CardNumber cardNumber; private final Suit suit; diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 7dae4e70..41c34c9d 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -15,7 +15,8 @@ public class ResultView { private static final String PLAYER_FORMAT = "%s카드: %s"; public static void shareCards(String dealerName, List playerNames) { - String playersName = playerNames.stream().map(NameInfo::getPersonName) + String playersName = playerNames.stream() + .map(NameInfo::getPersonName) .collect(Collectors.joining(DELIMITER)); System.out.println(String.format(INIT_SHARE_MESSAGE, dealerName, playersName, INIT_CARD_COUNT)); } From 502a5bd01fbba98a500e693c705c628a4dadd2cf Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 18 Feb 2022 00:16:16 +0900 Subject: [PATCH 41/64] refactor: Controller Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- .../blackjack/controller/GameController.java | 71 +++++++++++++++++-- .../controller/PeopleController.java | 43 ----------- 2 files changed, 65 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/blackjack/controller/PeopleController.java diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index e5daba82..e9a74ca2 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -1,21 +1,80 @@ package blackjack.controller; +import static blackjack.domain.Dealer.DEALER_DRAW_LIMIT; + import blackjack.domain.Dealer; import blackjack.domain.Deck; import blackjack.domain.Players; +import blackjack.domain.ScoreBoard; import blackjack.view.InputView; +import blackjack.view.ResultView; public class GameController { - public void run() { - final PeopleController peopleController = new PeopleController( - Players.create(InputView.getNames()), new Dealer()); + private final Players players; + private final Dealer dealer; + + public GameController() { + this.players = Players.create(InputView.getNames()); + this.dealer = new Dealer(); + } + public void run() { final Deck deck = Deck.create(); - peopleController.setUpPerson(deck); - peopleController.play(deck); - peopleController.showGameResult(); + setUpPerson(deck); + play(deck); + showGameResult(); + } + + private void setUpPerson(Deck deck) { + ResultView.margin(); + + players.initializeDeck(deck); + dealer.initializeDeck(deck); + + ResultView.shareCards(dealer.mapToNameInfo().getPersonName(), players.getPlayersName()); + ResultView.openCardInfo(dealer.openCards(), players.openCards()); + } + + private void play(Deck deck) { + ResultView.margin(); + + playersJudgment(deck); + dealerJudgment(deck); + + ResultView.scoreboard(dealer.getScoreInfo()); + ResultView.scoreboard(players.getScoreInfo()); + } + + private void showGameResult() { + ScoreBoard scoreBoard = players.match(dealer); + ResultView.matchResult(scoreBoard.getDealerMatchInfo(dealer), scoreBoard.getPlayersMatchInfo()); + } + + private void playersJudgment(Deck deck) { + while (players.hasActivePlayer()) { + activePlayerJudgement(deck); + } + } + + private void activePlayerJudgement(Deck deck) { + while (players.checkActivePlayerCanDrawCard() && InputView.drawChoice(players.getActivePlayerNameInfo())) { + players.drawCardToActivePlayer(deck); + ResultView.playerCardsInfo(players.getActivePlayerCardsInfo()); + } + players.nextActivePlayer(); + } + + private void dealerJudgment(Deck deck) { + ResultView.margin(); + + while (dealer.canDrawCard()) { + dealer.drawCard(deck); + ResultView.dealerDrawDecision(dealer.mapToNameInfo(), DEALER_DRAW_LIMIT); + } + + ResultView.margin(); } } diff --git a/src/main/java/blackjack/controller/PeopleController.java b/src/main/java/blackjack/controller/PeopleController.java deleted file mode 100644 index 9157c92d..00000000 --- a/src/main/java/blackjack/controller/PeopleController.java +++ /dev/null @@ -1,43 +0,0 @@ -package blackjack.controller; - - -import blackjack.domain.Dealer; -import blackjack.domain.Deck; -import blackjack.domain.Players; -import blackjack.view.ResultView; - -public class PeopleController { - - private final Players players; - private final Dealer dealer; - - public PeopleController(Players players, Dealer dealer) { - this.players = players; - this.dealer = dealer; - } - - public void setUpPerson(Deck deck) { - players.initializeDeck(deck); - dealer.initializeDeck(deck); - } - - public void play(Deck deck) { - playersJudgment(deck); - dealerJudgment(deck); - - ResultView.shareCards(dealer.mapToNameInfo().getPersonName(), players.getPlayersName()); - ResultView.openCardInfo(dealer.openCards(), players.openCards()); - } - - private void playersJudgment(Deck deck) { - - } - - private void dealerJudgment(Deck deck) { - - } - - public void showGameResult() { - - } -} From ec398ccce21974ca376b186d739d695ef73dc274 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 18 Feb 2022 00:17:40 +0900 Subject: [PATCH 42/64] feat: Dto - MatchInfo - ScoreInfo Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/dto/MatchInfo.java | 19 +++++++++++++++ src/main/java/blackjack/dto/ScoreInfo.java | 28 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/main/java/blackjack/dto/MatchInfo.java create mode 100644 src/main/java/blackjack/dto/ScoreInfo.java diff --git a/src/main/java/blackjack/dto/MatchInfo.java b/src/main/java/blackjack/dto/MatchInfo.java new file mode 100644 index 00000000..61d93190 --- /dev/null +++ b/src/main/java/blackjack/dto/MatchInfo.java @@ -0,0 +1,19 @@ +package blackjack.dto; + +public class MatchInfo { + private final String name; + private final String matches; + + public MatchInfo(String name, String matches) { + this.name = name; + this.matches = matches; + } + + public String getName() { + return name; + } + + public String getMatches() { + return matches; + } +} diff --git a/src/main/java/blackjack/dto/ScoreInfo.java b/src/main/java/blackjack/dto/ScoreInfo.java new file mode 100644 index 00000000..c83f0c86 --- /dev/null +++ b/src/main/java/blackjack/dto/ScoreInfo.java @@ -0,0 +1,28 @@ +package blackjack.dto; + +import java.util.List; + +public class ScoreInfo { + + private final String name; + private final List cardNames; + private final int score; + + public ScoreInfo(String name, List cardNames, int score) { + this.name = name; + this.cardNames = cardNames; + this.score = score; + } + + public String getName() { + return name; + } + + public List getCardNames() { + return cardNames; + } + + public int getScore() { + return score; + } +} From 1193866a663af5aaae5795ca1e9a2c73473d5cb8 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 18 Feb 2022 00:18:01 +0900 Subject: [PATCH 43/64] feat: View - InputView - ResultView Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/view/InputView.java | 38 ++++++++++++++++- src/main/java/blackjack/view/ResultView.java | 44 +++++++++++++++++++- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index e5c087d2..77a99340 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -1,5 +1,7 @@ package blackjack.view; +import blackjack.dto.NameInfo; +import java.sql.SQLOutput; import java.util.Arrays; import java.util.List; import java.util.Scanner; @@ -10,12 +12,45 @@ public class InputView { private static final Scanner SCANNER; private static final String SPLITTER = ","; private static final String MESSAGE_GET_NAMES = "게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"; + private static final String MESSAGE_UNEXPECTABLE_INPUT = "의도치 않은 입력이 들어왔습니다."; + private static final String MESSAGE_CHOICE_DECISION = "%s는 한장의 카드를 더 받겠습니까?(예는 %s, 아니오는 %s)\n"; + private static final String ANSWER_YES = "y"; + private static final String ANSWER_NO = "n"; static { SCANNER = new Scanner(System.in); } - private InputView() { + enum Answer { + YES(ANSWER_YES, true), + NO(ANSWER_NO, false); + + private final String choice; + + private final boolean decision; + Answer(String choice, boolean decision) { + this.choice = choice; + this.decision = decision; + } + + public static Answer of(final String choice) { + return Arrays.stream(values()) + .filter(answer -> answer.choice.equals(choice)) + .findFirst() + .orElseThrow(() -> new RuntimeException(MESSAGE_UNEXPECTABLE_INPUT)); + } + + public boolean getDecision() { + return decision; + } + + } + + private InputView() {} + + public static boolean drawChoice(NameInfo activePlayerNameInfo) { + System.out.format(MESSAGE_CHOICE_DECISION, activePlayerNameInfo.getPersonName(), Answer.YES.choice, Answer.NO.choice); + return Answer.of(SCANNER.nextLine()).getDecision(); } public static List getNames() { @@ -25,4 +60,5 @@ public static List getNames() { .map(String::trim) .collect(Collectors.toList()); } + } diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 41c34c9d..6a00dee6 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -3,7 +3,9 @@ import static blackjack.domain.Person.INIT_CARD_COUNT; import blackjack.dto.CardInfo; +import blackjack.dto.MatchInfo; import blackjack.dto.NameInfo; +import blackjack.dto.ScoreInfo; import java.util.List; import java.util.stream.Collectors; @@ -11,8 +13,12 @@ public class ResultView { private static final String INIT_SHARE_MESSAGE = "%s와 %s에게 %d장을 받았습니다."; private static final String DELIMITER = ", "; - private static final String DELETER_FORMAT = "%s: %s"; + private static final String DEALER_FORMAT = "%s: %s"; private static final String PLAYER_FORMAT = "%s카드: %s"; + private static final String SCOREBOARD_FORMAT = "%s 카드: %s - 결과: %s\n"; + private static final String MATCH_RESULT_MESSAGE = "## 최종 승패"; + private static final String DEALER_DRAW_FORMAT = "%s는 %s이하라 한장의 카드를 더 받았습니다.\n"; + private static final String MATCH_RESULT_FORMAT = "%s: %s\n"; public static void shareCards(String dealerName, List playerNames) { String playersName = playerNames.stream() @@ -22,7 +28,7 @@ public static void shareCards(String dealerName, List playerNames) { } public static void openCardInfo(CardInfo dealerCardInfo, List playerCardsInfo) { - System.out.println(String.format(DELETER_FORMAT, dealerCardInfo.getPersonName(), join(dealerCardInfo))); + System.out.println(String.format(DEALER_FORMAT, dealerCardInfo.getPersonName(), join(dealerCardInfo))); for (CardInfo playerCardInfo : playerCardsInfo) { System.out.println(String.format(PLAYER_FORMAT, playerCardInfo.getPersonName(), join(playerCardInfo))); @@ -34,5 +40,39 @@ private static String join(CardInfo cardInfo) { .collect(Collectors.joining(DELIMITER)); } + public static void playerCardsInfo(CardInfo activePlayerCardsInfo) { + System.out.println(String.format(PLAYER_FORMAT, activePlayerCardsInfo.getPersonName(), join(activePlayerCardsInfo))); + } + + public static void dealerDrawDecision(NameInfo dealerNameInfo, int limit) { + System.out.format(DEALER_DRAW_FORMAT, dealerNameInfo.getPersonName(), limit); + } + + public static void margin() { + System.out.println(); + } + + public static void scoreboard(List scoreInfo) { + scoreInfo.forEach(ResultView::scoreboard); + margin(); + } + public static void scoreboard(ScoreInfo scoreInfo) { + System.out.format(SCOREBOARD_FORMAT, scoreInfo.getName(), scoreInfo.getCardNames().stream().collect( + Collectors.joining(DELIMITER)), scoreInfo.getScore()); + } + + public static void matchResult(MatchInfo dealerMatchInfo, List playersMatchInfo) { + System.out.println(MATCH_RESULT_MESSAGE); + printMatchResult(dealerMatchInfo); + printMatchResult(playersMatchInfo); + } + + private static void printMatchResult(List playersMatchInfo) { + playersMatchInfo.forEach(ResultView::printMatchResult); + } + + private static void printMatchResult(MatchInfo matchInfo) { + System.out.format(MATCH_RESULT_FORMAT, matchInfo.getName(), matchInfo.getMatches()); + } } From a09581c0354702dc91ac0a614a0a9c562a40593e Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 18 Feb 2022 00:18:34 +0900 Subject: [PATCH 44/64] feat: Cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파산 여부 - 블랙잭 점수 (21점) 여부 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/domain/Cards.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index b6941317..6dc3ad25 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -29,10 +29,6 @@ public int totalScore() { return score; } - public boolean isNearTwentyOne() { - return totalScore() < REFERENCE_POINT; - } - public void add(Card drawCard) { cards.add(drawCard); } @@ -51,4 +47,12 @@ public List openCardOne() { public List openCardAll() { return cards.stream().map(Card::getCardName).collect(Collectors.toList()); } + + public boolean isBust() { + return totalScore() > REFERENCE_POINT; + } + + public boolean blackjack() { + return totalScore() == REFERENCE_POINT; + } } From 14b4ec5bc14e3e0383d815eb9b0c9b9215fab1d2 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 18 Feb 2022 00:19:26 +0900 Subject: [PATCH 45/64] feat: Person (Player / Dealer) - activePlayer - scoreInfo - matchScore Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/domain/Dealer.java | 3 +- src/main/java/blackjack/domain/Person.java | 6 +++ src/main/java/blackjack/domain/Player.java | 2 +- src/main/java/blackjack/domain/Players.java | 48 +++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index a99dfaa9..ef5bab28 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -1,11 +1,12 @@ package blackjack.domain; import blackjack.dto.CardInfo; +import blackjack.dto.MatchInfo; import java.util.ArrayList; public class Dealer extends Person { - private static final int DEALER_DRAW_LIMIT = 16; + public static final int DEALER_DRAW_LIMIT = 16; private static final String DEALER_NAME = "딜러"; public Dealer(String userName, Cards cards) { diff --git a/src/main/java/blackjack/domain/Person.java b/src/main/java/blackjack/domain/Person.java index c7918ef2..b7540b85 100644 --- a/src/main/java/blackjack/domain/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -1,7 +1,9 @@ package blackjack.domain; import blackjack.dto.CardInfo; +import blackjack.dto.MatchInfo; import blackjack.dto.NameInfo; +import blackjack.dto.ScoreInfo; public abstract class Person { @@ -23,6 +25,10 @@ public void drawCard(Deck deck) { public abstract CardInfo openCards(); + public ScoreInfo getScoreInfo() { + return new ScoreInfo(userName, cards.openCardAll(), cards.totalScore()); + } + public int cardSize() { return cards.size(); } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index f85addaf..189f21c7 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -14,7 +14,7 @@ public int getTotalScore(){ @Override public boolean canDrawCard() { - return cards.isNearTwentyOne(); + return !cards.blackjack() && !cards.isBust(); } @Override diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 01e90f80..20e97008 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -1,17 +1,24 @@ package blackjack.domain; import blackjack.dto.CardInfo; +import blackjack.dto.MatchInfo; import blackjack.dto.NameInfo; +import blackjack.dto.ScoreInfo; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class Players { private final List players; + private int activePlayerIdx; + public Players(List players) { this.players = players; + this.activePlayerIdx = 0; } public static Players create(List names) { @@ -34,4 +41,45 @@ public List openCards(){ return players.stream().map(Player::openCards).collect(Collectors.toList()); } + public boolean checkActivePlayerCanDrawCard() { + return getActivePlayer().canDrawCard(); + } + + private Player getActivePlayer() { + return players.get(activePlayerIdx); + } + + public NameInfo getActivePlayerNameInfo() { + return new NameInfo(getActivePlayer().userName); + } + + public void drawCardToActivePlayer(Deck deck) { + getActivePlayer().drawCard(deck); + } + + public CardInfo getActivePlayerCardsInfo() { + Player player = getActivePlayer(); + return new CardInfo(player.userName, player.cards.openCardAll()); + } + + public void nextActivePlayer() { + activePlayerIdx++; + } + + public boolean hasActivePlayer() { + return activePlayerIdx < players.size(); + } + + public List getScoreInfo() { + return players.stream().map(Player::getScoreInfo).collect(Collectors.toList()); + } + + public ScoreBoard match(Dealer dealer) { + Map map = new LinkedHashMap<>(); + for (Player player: players) { + map.put(player, player.compareScore(dealer)); + } + + return new ScoreBoard(map); + } } From e7d4691bdcc52144828c1a3b9a4a4cf91c853020 Mon Sep 17 00:00:00 2001 From: "G1.Jeon" Date: Fri, 18 Feb 2022 00:19:54 +0900 Subject: [PATCH 46/64] feat: Score / ScoreBoard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 딜러 / 플레이어 점수 비교 Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee " --- src/main/java/blackjack/domain/Score.java | 14 ++++++++ .../java/blackjack/domain/ScoreBoard.java | 34 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/main/java/blackjack/domain/ScoreBoard.java diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index 0fd66191..0a69ec86 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -15,7 +15,21 @@ public enum Score { this.name = name; } + public int getKey() { + return key; + } + + public String getName() { + return name; + } + public static Score judge(Cards playerCards, Cards dealerCards) { + if (playerCards.isBust()) return LOSE; + + if (playerCards.blackjack() && dealerCards.blackjack()) return DRAW; + if (playerCards.blackjack()) return WIN; + if (dealerCards.blackjack()) return LOSE; + if (playerCards.totalScore() == dealerCards.totalScore()) { return DRAW; } diff --git a/src/main/java/blackjack/domain/ScoreBoard.java b/src/main/java/blackjack/domain/ScoreBoard.java new file mode 100644 index 00000000..0e28d15b --- /dev/null +++ b/src/main/java/blackjack/domain/ScoreBoard.java @@ -0,0 +1,34 @@ +package blackjack.domain; + +import blackjack.dto.MatchInfo; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class ScoreBoard { + + private final Map scoreMap; + + public ScoreBoard(Map scoreMap) { + this.scoreMap = scoreMap; + } + + public MatchInfo getDealerMatchInfo(Dealer dealer) { + return new MatchInfo( + dealer.userName, + scoreMap.values().stream() + .collect(Collectors.groupingBy(o -> o, Collectors.counting())) + .entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(map -> map.getValue() + map.getKey().getName()) + .collect(Collectors.joining(" ")) + ); + } + + public List getPlayersMatchInfo() { + return scoreMap.entrySet().stream() + .map(map -> new MatchInfo(map.getKey().userName, map.getValue().getName())) + .collect(Collectors.toList()); + } + +} From ccb5359e6209e7ddd0d2be82af03a83786c6b453 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:11:19 +0900 Subject: [PATCH 47/64] =?UTF-8?q?test:=20=EA=B8=B0=EB=8A=A5=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=20=EC=82=AC=ED=95=AD=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CardNumberTest - DealerTest - DeckTest - PlayersTest - PlayerTest - ScoreBoardTest - ScoreTest Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/test/java/blackjack/PlayersTest.java | 41 ------- .../{ => domain}/CardNumberTest.java | 2 +- .../blackjack/{ => domain}/DealerTest.java | 2 +- .../java/blackjack/{ => domain}/DeckTest.java | 2 +- .../blackjack/{ => domain}/PlayerTest.java | 11 +- .../java/blackjack/domain/PlayersTest.java | 115 ++++++++++++++++++ .../java/blackjack/domain/ScoreBoardTest.java | 51 ++++++++ src/test/java/blackjack/domain/ScoreTest.java | 28 +++++ 8 files changed, 199 insertions(+), 53 deletions(-) delete mode 100644 src/test/java/blackjack/PlayersTest.java rename src/test/java/blackjack/{ => domain}/CardNumberTest.java (96%) rename src/test/java/blackjack/{ => domain}/DealerTest.java (98%) rename src/test/java/blackjack/{ => domain}/DeckTest.java (98%) rename src/test/java/blackjack/{ => domain}/PlayerTest.java (84%) create mode 100644 src/test/java/blackjack/domain/PlayersTest.java create mode 100644 src/test/java/blackjack/domain/ScoreBoardTest.java create mode 100644 src/test/java/blackjack/domain/ScoreTest.java diff --git a/src/test/java/blackjack/PlayersTest.java b/src/test/java/blackjack/PlayersTest.java deleted file mode 100644 index ba870cef..00000000 --- a/src/test/java/blackjack/PlayersTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package blackjack; - -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import blackjack.domain.Cards; -import blackjack.domain.Deck; -import blackjack.domain.Player; -import blackjack.domain.Players; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -public class PlayersTest { - - private List playerList; - private Player pobi; - private Player jason; - - @BeforeEach - void setUp() { - pobi = new Player("pobi", new Cards(new ArrayList<>())); - jason = new Player("jason", new Cards(new ArrayList<>())); - - playerList = new ArrayList<>(Arrays.asList(pobi, jason)); - } - - @Test - void 플레이어별_카드_초기화_결과_검증() { - Deck deck = Deck.create(); - Players players = new Players(playerList); - players.initializeDeck(deck); - - assertAll( - () -> assertEquals(pobi.cardSize(), 2), - () -> assertEquals(jason.cardSize(), 2) - ); - } -} diff --git a/src/test/java/blackjack/CardNumberTest.java b/src/test/java/blackjack/domain/CardNumberTest.java similarity index 96% rename from src/test/java/blackjack/CardNumberTest.java rename to src/test/java/blackjack/domain/CardNumberTest.java index ff8ca0e7..7f46d5e0 100644 --- a/src/test/java/blackjack/CardNumberTest.java +++ b/src/test/java/blackjack/domain/CardNumberTest.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import blackjack.domain.CardNumber; import java.util.stream.Stream; diff --git a/src/test/java/blackjack/DealerTest.java b/src/test/java/blackjack/domain/DealerTest.java similarity index 98% rename from src/test/java/blackjack/DealerTest.java rename to src/test/java/blackjack/domain/DealerTest.java index 397b97e8..92b66f1f 100644 --- a/src/test/java/blackjack/DealerTest.java +++ b/src/test/java/blackjack/domain/DealerTest.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/blackjack/DeckTest.java b/src/test/java/blackjack/domain/DeckTest.java similarity index 98% rename from src/test/java/blackjack/DeckTest.java rename to src/test/java/blackjack/domain/DeckTest.java index 6e9dda0e..499f85f4 100644 --- a/src/test/java/blackjack/DeckTest.java +++ b/src/test/java/blackjack/domain/DeckTest.java @@ -1,4 +1,4 @@ -package blackjack; +package blackjack.domain; import static org.assertj.core.api.Assertions.*; diff --git a/src/test/java/blackjack/PlayerTest.java b/src/test/java/blackjack/domain/PlayerTest.java similarity index 84% rename from src/test/java/blackjack/PlayerTest.java rename to src/test/java/blackjack/domain/PlayerTest.java index f52884d6..463e1bcd 100644 --- a/src/test/java/blackjack/PlayerTest.java +++ b/src/test/java/blackjack/domain/PlayerTest.java @@ -1,15 +1,8 @@ -package blackjack; +package blackjack.domain; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -import blackjack.domain.Card; -import blackjack.domain.CardNumber; -import blackjack.domain.Cards; -import blackjack.domain.Dealer; -import blackjack.domain.Player; -import blackjack.domain.Score; -import blackjack.domain.Suit; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -42,7 +35,7 @@ void init() { @Test void 카드점수_확인_테스트() { - assertThat(player.getTotalScore()).isEqualTo(13); + assertThat(player.totalScore()).isEqualTo(13); } @ParameterizedTest diff --git a/src/test/java/blackjack/domain/PlayersTest.java b/src/test/java/blackjack/domain/PlayersTest.java new file mode 100644 index 00000000..135db577 --- /dev/null +++ b/src/test/java/blackjack/domain/PlayersTest.java @@ -0,0 +1,115 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import blackjack.dto.CardInfo; +import blackjack.dto.NameInfo; +import blackjack.dto.ScoreInfo; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class PlayersTest { + + private List playerList; + private Player pobi; + private Player jason; + private Players players; + + @BeforeEach + void setUp() { + pobi = new Player("pobi", new Cards(new ArrayList<>())); + jason = new Player("jason", new Cards(new ArrayList<>())); + + playerList = new ArrayList<>(Arrays.asList(pobi, jason)); + players = new Players(playerList); + } + + @Test + void 플레이어별_카드_초기화_결과_검증() { + Deck deck = Deck.create(); + players.initializeDeck(deck); + + assertAll( + () -> assertEquals(pobi.cardSize(), 2), + () -> assertEquals(jason.cardSize(), 2) + ); + } + + @Test + void 플레이어가_카드를_더_뽑을_수_있는지_판단할_수_있다() { + boolean isPobiCanDraw = players.checkActivePlayerCanDrawCard(); + + assertThat(isPobiCanDraw).isTrue(); + } + + @Test + void 활성화된_플레이어의_카드정보를_가져올_수_있다() { + CardInfo activePlayerCardsInfo = players.getActivePlayerCardInfo(); + CardInfo pobiCardInfo = pobi.openCards(); + + assertThat(activePlayerCardsInfo).isEqualTo(pobiCardInfo); + + players.nextActivePlayer(); + activePlayerCardsInfo = players.getActivePlayerCardInfo(); + CardInfo jasonCardInfo = jason.openCards(); + + assertThat(activePlayerCardsInfo).isEqualTo(jasonCardInfo); + } + + @Test + void 활성화된_플레이어의_이름정보를_가져올_수_있다() { + NameInfo activePlayerNameInfo = players.getActivePlayerNameInfo(); + NameInfo pobiNameInfo = pobi.nameInfo(); + + assertThat(activePlayerNameInfo).isEqualTo(pobiNameInfo); + + players.nextActivePlayer(); + activePlayerNameInfo = players.getActivePlayerNameInfo(); + NameInfo jasonNameInfo = jason.nameInfo(); + + assertThat(activePlayerNameInfo).isEqualTo(jasonNameInfo); + } + + @Test + void 모든_플레이어의_이름정보를_가져올_수_있다() { + List playersName = players.nameInfos(); + + NameInfo pobiNameInfo = pobi.nameInfo(); + NameInfo jasonNameInfo = jason.nameInfo(); + + assertThat(playersName).containsExactly(pobiNameInfo, jasonNameInfo); + } + + @Test + void 플레이어들이_가진_모든_카드정보를_가져올_수_있다() { + List cardInfos = players.openCards(); + + CardInfo pobiCardInfo = pobi.openCards(); + CardInfo jasonCardInfo = jason.openCards(); + + assertThat(cardInfos).containsExactly(pobiCardInfo, jasonCardInfo); + } + + @Test + void 플레이어들의_점수정보를_가져올_수_있다() { + List scoreInfo = players.scoreInfos(); + + ScoreInfo pobiScoreInfo = pobi.scoreInfo(); + ScoreInfo jasonScoreInfo = jason.scoreInfo(); + + assertThat(scoreInfo).containsExactly(pobiScoreInfo, jasonScoreInfo); + } + + @Test + void 더_이상_플레이어가_존재하지_않으면_멈춘다() { + players.nextActivePlayer(); + players.nextActivePlayer(); + + assertThat(players.hasActivePlayer()).isFalse(); + } +} diff --git a/src/test/java/blackjack/domain/ScoreBoardTest.java b/src/test/java/blackjack/domain/ScoreBoardTest.java new file mode 100644 index 00000000..df5ae88e --- /dev/null +++ b/src/test/java/blackjack/domain/ScoreBoardTest.java @@ -0,0 +1,51 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import blackjack.dto.MatchInfo; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class ScoreBoardTest { + + Map scoreMap; + Dealer dealer; + Deck deck = Deck.create(); + ScoreBoard scoreBoard; + + @BeforeEach + void setUp() { + dealer = new Dealer(); + dealer.initializeDeck(deck); + + scoreMap = new LinkedHashMap<>() {{ + put(new Player("pobi"), Score.LOSE); + put(new Player("지워니"), Score.WIN); + put(new Player("jason"), Score.LOSE); + }}; + scoreBoard = new ScoreBoard(scoreMap); + } + + @Test + void 딜러의_경기_결과를_얻어낼_수_있다() { + MatchInfo dealerMatchInfo = scoreBoard.dealerMatches(dealer); + MatchInfo matchInfo = new MatchInfo("딜러", "2승 1패"); + + assertThat(dealerMatchInfo.getMatches()).isEqualTo(matchInfo.getMatches()); + } + + @Test + void 모든_플레이어의_경기_결과를_얻어낼_수_있다() { + List playersMatchInfo = scoreBoard.playerMatches(); + MatchInfo pobiMatchInfo = new MatchInfo("pobi", "패"); + MatchInfo jiWoniMatchInfo = new MatchInfo("지워니", "승"); + MatchInfo jasonMatchInfo = new MatchInfo("jason", "패"); + + assertThat(playersMatchInfo).containsExactly(pobiMatchInfo, jiWoniMatchInfo, + jasonMatchInfo); + } + +} diff --git a/src/test/java/blackjack/domain/ScoreTest.java b/src/test/java/blackjack/domain/ScoreTest.java new file mode 100644 index 00000000..60c6ef29 --- /dev/null +++ b/src/test/java/blackjack/domain/ScoreTest.java @@ -0,0 +1,28 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import org.junit.jupiter.api.Test; + +class ScoreTest { + + @Test + void 플레이어와_딜러의_카드를_비교해_승무패를_판단할_수_있다() { + Cards playerCards = new Cards(Arrays.asList(new Card(CardNumber.EIGHT, Suit.CLUB), + new Card(CardNumber.SEVEN, Suit.CLUB))); + Cards dealerCards = new Cards(Arrays.asList(new Card(CardNumber.FIVE, Suit.CLUB), + new Card(CardNumber.FOUR, Suit.CLUB))); + + Score judge = Score.judge(playerCards, dealerCards); + + assertThat(judge).isEqualTo(Score.WIN); + } + + @Test + void 승패_결과를_뒤집는다() { + Score oppositeScore = Score.WIN.oppositeScore(); + + assertThat(oppositeScore).isEqualTo(Score.LOSE); + } +} From 05ce88d158e30e93d221290466e127f356e40f73 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:15:15 +0900 Subject: [PATCH 48/64] =?UTF-8?q?feat:=20=EC=BB=A8=ED=8A=B8=EB=A1=A4?= =?UTF-8?q?=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- .../blackjack/controller/GameController.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index e9a74ca2..89c3d92c 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -27,29 +27,30 @@ public void run() { showGameResult(); } - private void setUpPerson(Deck deck) { + private void setUpPerson(final Deck deck) { ResultView.margin(); players.initializeDeck(deck); dealer.initializeDeck(deck); - ResultView.shareCards(dealer.mapToNameInfo().getPersonName(), players.getPlayersName()); + ResultView.shareCards(dealer.nameInfo().getPersonName(), players.nameInfos()); ResultView.openCardInfo(dealer.openCards(), players.openCards()); } - private void play(Deck deck) { + private void play(final Deck deck) { ResultView.margin(); playersJudgment(deck); dealerJudgment(deck); - ResultView.scoreboard(dealer.getScoreInfo()); - ResultView.scoreboard(players.getScoreInfo()); + ResultView.scoreboard(dealer.scoreInfo()); + ResultView.scoreboard(players.scoreInfos()); } private void showGameResult() { ScoreBoard scoreBoard = players.match(dealer); - ResultView.matchResult(scoreBoard.getDealerMatchInfo(dealer), scoreBoard.getPlayersMatchInfo()); + ResultView.matchResult(scoreBoard.dealerMatches(dealer), + scoreBoard.playerMatches()); } private void playersJudgment(Deck deck) { @@ -58,20 +59,21 @@ private void playersJudgment(Deck deck) { } } - private void activePlayerJudgement(Deck deck) { - while (players.checkActivePlayerCanDrawCard() && InputView.drawChoice(players.getActivePlayerNameInfo())) { + private void activePlayerJudgement(final Deck deck) { + while (players.checkActivePlayerCanDrawCard() && InputView.drawChoice( + players.getActivePlayerNameInfo())) { players.drawCardToActivePlayer(deck); - ResultView.playerCardsInfo(players.getActivePlayerCardsInfo()); + ResultView.playerCardsInfo(players.getActivePlayerCardInfo()); } players.nextActivePlayer(); } - private void dealerJudgment(Deck deck) { + private void dealerJudgment(final Deck deck) { ResultView.margin(); while (dealer.canDrawCard()) { dealer.drawCard(deck); - ResultView.dealerDrawDecision(dealer.mapToNameInfo(), DEALER_DRAW_LIMIT); + ResultView.dealerDrawDecision(dealer.nameInfo(), DEALER_DRAW_LIMIT); } ResultView.margin(); From cd1e181563c735b0110136d5a84df44eb26ed167 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:16:31 +0900 Subject: [PATCH 49/64] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=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 - Card - CardNumber - Cards - Dealer - Deck - Person - Player - Players - Score - ScoreBoard Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Card.java | 2 +- .../java/blackjack/domain/CardNumber.java | 11 +--- src/main/java/blackjack/domain/Cards.java | 12 ++-- src/main/java/blackjack/domain/Dealer.java | 2 +- src/main/java/blackjack/domain/Deck.java | 2 +- src/main/java/blackjack/domain/Person.java | 25 ++++---- src/main/java/blackjack/domain/Player.java | 19 +++--- src/main/java/blackjack/domain/Players.java | 64 +++++++++---------- src/main/java/blackjack/domain/Score.java | 30 +++++++-- .../java/blackjack/domain/ScoreBoard.java | 9 +-- 10 files changed, 95 insertions(+), 81 deletions(-) diff --git a/src/main/java/blackjack/domain/Card.java b/src/main/java/blackjack/domain/Card.java index 3979fc11..f99cf2aa 100644 --- a/src/main/java/blackjack/domain/Card.java +++ b/src/main/java/blackjack/domain/Card.java @@ -9,7 +9,7 @@ public class Card { private final CardNumber cardNumber; private final Suit suit; - public Card(CardNumber cardNumber, Suit suit) { + public Card(final CardNumber cardNumber, final Suit suit) { this.cardNumber = cardNumber; this.suit = suit; } diff --git a/src/main/java/blackjack/domain/CardNumber.java b/src/main/java/blackjack/domain/CardNumber.java index 3dac16c2..1fc0390c 100644 --- a/src/main/java/blackjack/domain/CardNumber.java +++ b/src/main/java/blackjack/domain/CardNumber.java @@ -1,7 +1,5 @@ package blackjack.domain; -import java.util.Arrays; - public enum CardNumber { ACE("A", 1), @@ -21,18 +19,11 @@ public enum CardNumber { private final String initial; private final int score; - CardNumber(String initial, int score) { + CardNumber(final String initial, final int score) { this.initial = initial; this.score = score; } - public static CardNumber of(final String initial) { - return Arrays.stream(values()) - .filter(cardNumber -> cardNumber.initial == initial) - .findFirst() - .orElseThrow(IllegalArgumentException::new); - } - public boolean isAce() { return this == ACE; } diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index 6dc3ad25..97736907 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -12,7 +12,7 @@ public class Cards { private static final String CARD_SIZE_ZERO_ERROR = "카드가 존재하지 않습니다."; private final List cards; - public Cards(List cards) { + public Cards(final List cards) { this.cards = cards; } @@ -21,7 +21,9 @@ public int size() { } public int totalScore() { - int score = cards.stream().mapToInt(Card::getCardScore).sum(); + final int score = cards.stream() + .mapToInt(Card::getCardScore) + .sum(); if (hasAce() && score <= LIMITED_ACE_SCORE) { return score + ADDITION_ACE_SCORE; @@ -41,11 +43,13 @@ public List openCardOne() { if (cards.isEmpty()) { throw new RuntimeException(CARD_SIZE_ZERO_ERROR); } - return Arrays.asList(cards.get(0).getCardName()); + return Arrays.asList(cards.get(FRONT).getCardName()); } public List openCardAll() { - return cards.stream().map(Card::getCardName).collect(Collectors.toList()); + return cards.stream() + .map(Card::getCardName) + .collect(Collectors.toList()); } public boolean isBust() { diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index ef5bab28..97daa8b4 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -24,7 +24,7 @@ public boolean canDrawCard() { @Override public CardInfo openCards() { - return new CardInfo(userName,cards.openCardOne()); + return new CardInfo(userName, cards.openCardOne()); } } diff --git a/src/main/java/blackjack/domain/Deck.java b/src/main/java/blackjack/domain/Deck.java index 52e41ace..017609d8 100644 --- a/src/main/java/blackjack/domain/Deck.java +++ b/src/main/java/blackjack/domain/Deck.java @@ -17,7 +17,7 @@ public Deck(final List cards) { } public static Deck create() { - List cards = createEntireCards(); + final List cards = createEntireCards(); Collections.shuffle(cards); return new Deck(cards); } diff --git a/src/main/java/blackjack/domain/Person.java b/src/main/java/blackjack/domain/Person.java index b7540b85..54c7ade9 100644 --- a/src/main/java/blackjack/domain/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -1,7 +1,6 @@ package blackjack.domain; import blackjack.dto.CardInfo; -import blackjack.dto.MatchInfo; import blackjack.dto.NameInfo; import blackjack.dto.ScoreInfo; @@ -17,29 +16,31 @@ public Person(String userName, Cards cards) { this.cards = cards; } - public void drawCard(Deck deck) { - cards.add(deck.drawCard()); + public void initializeDeck(final Deck deck) { + for (int i = 0; i < INIT_CARD_COUNT; i++) { + cards.add(deck.drawCard()); + } } - public abstract boolean canDrawCard(); - - public abstract CardInfo openCards(); - - public ScoreInfo getScoreInfo() { - return new ScoreInfo(userName, cards.openCardAll(), cards.totalScore()); + public void drawCard(final Deck deck) { + cards.add(deck.drawCard()); } public int cardSize() { return cards.size(); } + public NameInfo nameInfo() { + return new NameInfo(userName); + } + public void initializeDeck(Deck deck) { for (int i = 0; i < INIT_CARD_COUNT; i++) { cards.add(deck.drawCard()); } } - public NameInfo mapToNameInfo() { - return new NameInfo(userName); - } + public abstract boolean canDrawCard(); + + public abstract CardInfo openCards(); } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 189f21c7..7086e971 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -1,25 +1,24 @@ package blackjack.domain; import blackjack.dto.CardInfo; +import java.util.ArrayList; public class Player extends Person { - public Player(String userName, Cards cards) { - super(userName,cards); + public Player(final String username) { + this(username, new Cards(new ArrayList<>())); } - public int getTotalScore(){ - return cards.totalScore(); + public Player(final String userName, final Cards cards) { + super(userName, cards); } - @Override - public boolean canDrawCard() { - return !cards.blackjack() && !cards.isBust(); + public Score compareScore(final Dealer dealer) { + return Score.judge(cards, dealer.cards); } - @Override - public CardInfo openCards() { - return new CardInfo(userName,cards.openCardAll()); + public int totalScore() { + return cards.totalScore(); } public Score compareScore(Dealer dealer) { diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 20e97008..a57f35c8 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -1,7 +1,6 @@ package blackjack.domain; import blackjack.dto.CardInfo; -import blackjack.dto.MatchInfo; import blackjack.dto.NameInfo; import blackjack.dto.ScoreInfo; import java.util.ArrayList; @@ -14,14 +13,14 @@ public class Players { private final List players; - private int activePlayerIdx; + private int activePlayerIndex; - public Players(List players) { + public Players(final List players) { this.players = players; - this.activePlayerIdx = 0; + this.activePlayerIndex = 0; } - public static Players create(List names) { + public static Players create(final List names) { return new Players( names.stream() .map(name -> new Player(name, new Cards(new ArrayList<>()))) @@ -29,28 +28,16 @@ public static Players create(List names) { ); } - public void initializeDeck(Deck deck) { + public void initializeDeck(final Deck deck) { players.stream().forEach(player -> player.initializeDeck(deck)); } - public List getPlayersName(){ - return players.stream().map(Person::mapToNameInfo).collect(Collectors.toList()); - } - - public List openCards(){ - return players.stream().map(Player::openCards).collect(Collectors.toList()); - } - public boolean checkActivePlayerCanDrawCard() { return getActivePlayer().canDrawCard(); } - private Player getActivePlayer() { - return players.get(activePlayerIdx); - } - - public NameInfo getActivePlayerNameInfo() { - return new NameInfo(getActivePlayer().userName); + public void drawCardToActivePlayer(final Deck deck) { + getActivePlayer().drawCard(deck); } public void drawCardToActivePlayer(Deck deck) { @@ -62,24 +49,37 @@ public CardInfo getActivePlayerCardsInfo() { return new CardInfo(player.userName, player.cards.openCardAll()); } - public void nextActivePlayer() { - activePlayerIdx++; + public ScoreBoard match(final Dealer dealer) { + final Map map = new LinkedHashMap<>(); + for (Player player : players) { + map.put(player, player.compareScore(dealer)); + } + + return new ScoreBoard(map); + } + + public CardInfo getActivePlayerCardInfo() { + final Player player = getActivePlayer(); + return new CardInfo(player.userName, player.cards.openCardAll()); + } + + public NameInfo getActivePlayerNameInfo() { + return new NameInfo(getActivePlayer().userName); } - public boolean hasActivePlayer() { - return activePlayerIdx < players.size(); + public List nameInfos() { + return players.stream().map(Person::nameInfo).collect(Collectors.toList()); } - public List getScoreInfo() { - return players.stream().map(Player::getScoreInfo).collect(Collectors.toList()); + public List openCards() { + return players.stream().map(Player::openCards).collect(Collectors.toList()); } - public ScoreBoard match(Dealer dealer) { - Map map = new LinkedHashMap<>(); - for (Player player: players) { - map.put(player, player.compareScore(dealer)); - } + public List scoreInfos() { + return players.stream().map(Player::scoreInfo).collect(Collectors.toList()); + } - return new ScoreBoard(map); + private Player getActivePlayer() { + return players.get(activePlayerIndex); } } diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index 0a69ec86..d910549d 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -1,5 +1,7 @@ package blackjack.domain; +import java.util.Arrays; + public enum Score { WIN(1, "승"), DRAW(0, "무"), @@ -10,7 +12,7 @@ public enum Score { private final int key; private final String name; - Score(int key, String name) { + Score(final int key, final String name) { this.key = key; this.name = name; } @@ -23,12 +25,20 @@ public String getName() { return name; } - public static Score judge(Cards playerCards, Cards dealerCards) { - if (playerCards.isBust()) return LOSE; + public static Score judge(final Cards playerCards, final Cards dealerCards) { + if (playerCards.isBust()) { + return LOSE; + } - if (playerCards.blackjack() && dealerCards.blackjack()) return DRAW; - if (playerCards.blackjack()) return WIN; - if (dealerCards.blackjack()) return LOSE; + if (playerCards.blackjack() && dealerCards.blackjack()) { + return DRAW; + } + if (playerCards.blackjack()) { + return WIN; + } + if (dealerCards.blackjack()) { + return LOSE; + } if (playerCards.totalScore() == dealerCards.totalScore()) { return DRAW; @@ -44,4 +54,12 @@ public static Score judge(Cards playerCards, Cards dealerCards) { throw new RuntimeException(UNDETECTABLE_EXCEPTION_OCCURRED); } + + public Score oppositeScore() { + return Score.of(-key); + } + + public String getName() { + return name; + } } diff --git a/src/main/java/blackjack/domain/ScoreBoard.java b/src/main/java/blackjack/domain/ScoreBoard.java index 0e28d15b..e5753001 100644 --- a/src/main/java/blackjack/domain/ScoreBoard.java +++ b/src/main/java/blackjack/domain/ScoreBoard.java @@ -25,10 +25,11 @@ public MatchInfo getDealerMatchInfo(Dealer dealer) { ); } - public List getPlayersMatchInfo() { - return scoreMap.entrySet().stream() - .map(map -> new MatchInfo(map.getKey().userName, map.getValue().getName())) - .collect(Collectors.toList()); + private String dealerResultFormat(final Map countingMap) { + return countingMap.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .map(map -> String.format(SCORE_RESULT_FORMAT, map.getValue(), map.getKey().getName())) + .collect(Collectors.joining(DELIMITER)); } } From 5e3663f5b4acb9b4ab1b22c6072b029e3c996a04 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:17:05 +0900 Subject: [PATCH 50/64] =?UTF-8?q?feat:=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CardInfo - MatchInfo - NameInfo - ScoreInfo Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/dto/CardInfo.java | 21 +++++++++++++++++++- src/main/java/blackjack/dto/MatchInfo.java | 23 +++++++++++++++++++++- src/main/java/blackjack/dto/NameInfo.java | 23 ++++++++++++++++++++-- src/main/java/blackjack/dto/ScoreInfo.java | 19 ++++++++++++++++++ 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/main/java/blackjack/dto/CardInfo.java b/src/main/java/blackjack/dto/CardInfo.java index 79a085f7..a283b52d 100644 --- a/src/main/java/blackjack/dto/CardInfo.java +++ b/src/main/java/blackjack/dto/CardInfo.java @@ -1,13 +1,14 @@ package blackjack.dto; import java.util.List; +import java.util.Objects; public class CardInfo { private final String personName; private final List cardNames; - public CardInfo(String personName, List cardNames) { + public CardInfo(final String personName, final List cardNames) { this.personName = personName; this.cardNames = cardNames; } @@ -19,4 +20,22 @@ public String getPersonName() { public List getCardNames() { return cardNames; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CardInfo cardInfo = (CardInfo) o; + return Objects.equals(personName, cardInfo.personName) && Objects.equals( + cardNames, cardInfo.cardNames); + } + + @Override + public int hashCode() { + return Objects.hash(personName, cardNames); + } } diff --git a/src/main/java/blackjack/dto/MatchInfo.java b/src/main/java/blackjack/dto/MatchInfo.java index 61d93190..a2a80be1 100644 --- a/src/main/java/blackjack/dto/MatchInfo.java +++ b/src/main/java/blackjack/dto/MatchInfo.java @@ -1,10 +1,13 @@ package blackjack.dto; +import java.util.Objects; + public class MatchInfo { + private final String name; private final String matches; - public MatchInfo(String name, String matches) { + public MatchInfo(final String name, final String matches) { this.name = name; this.matches = matches; } @@ -16,4 +19,22 @@ public String getName() { public String getMatches() { return matches; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MatchInfo matchInfo = (MatchInfo) o; + return Objects.equals(name, matchInfo.name) && Objects.equals(matches, + matchInfo.matches); + } + + @Override + public int hashCode() { + return Objects.hash(name, matches); + } } diff --git a/src/main/java/blackjack/dto/NameInfo.java b/src/main/java/blackjack/dto/NameInfo.java index 1a2a5582..7cd4f912 100644 --- a/src/main/java/blackjack/dto/NameInfo.java +++ b/src/main/java/blackjack/dto/NameInfo.java @@ -1,14 +1,33 @@ package blackjack.dto; +import java.util.Objects; + public class NameInfo { - private String personName; + private final String personName; - public NameInfo(String personName) { + public NameInfo(final String personName) { this.personName = personName; } public String getPersonName() { return personName; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + NameInfo nameInfo = (NameInfo) o; + return Objects.equals(personName, nameInfo.personName); + } + + @Override + public int hashCode() { + return Objects.hash(personName); + } } diff --git a/src/main/java/blackjack/dto/ScoreInfo.java b/src/main/java/blackjack/dto/ScoreInfo.java index c83f0c86..d5d6ef3d 100644 --- a/src/main/java/blackjack/dto/ScoreInfo.java +++ b/src/main/java/blackjack/dto/ScoreInfo.java @@ -1,6 +1,7 @@ package blackjack.dto; import java.util.List; +import java.util.Objects; public class ScoreInfo { @@ -25,4 +26,22 @@ public List getCardNames() { public int getScore() { return score; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ScoreInfo scoreInfo = (ScoreInfo) o; + return score == scoreInfo.score && Objects.equals(name, scoreInfo.name) + && Objects.equals(cardNames, scoreInfo.cardNames); + } + + @Override + public int hashCode() { + return Objects.hash(name, cardNames, score); + } } From e3f49f6675736c5a299de2beeaf35cc8d21d8c71 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:17:25 +0900 Subject: [PATCH 51/64] =?UTF-8?q?feat:=20View=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputView - ResultView Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/view/InputView.java | 8 +++-- src/main/java/blackjack/view/ResultView.java | 37 +++++++++++--------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 77a99340..67568492 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -28,7 +28,8 @@ enum Answer { private final String choice; private final boolean decision; - Answer(String choice, boolean decision) { + + Answer(final String choice, final boolean decision) { this.choice = choice; this.decision = decision; } @@ -48,8 +49,9 @@ public boolean getDecision() { private InputView() {} - public static boolean drawChoice(NameInfo activePlayerNameInfo) { - System.out.format(MESSAGE_CHOICE_DECISION, activePlayerNameInfo.getPersonName(), Answer.YES.choice, Answer.NO.choice); + public static boolean drawChoice(final NameInfo activePlayerNameInfo) { + System.out.format(MESSAGE_CHOICE_DECISION, activePlayerNameInfo.getPersonName(), + Answer.YES.choice, Answer.NO.choice); return Answer.of(SCANNER.nextLine()).getDecision(); } diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 6a00dee6..7a77c5e2 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -20,31 +20,35 @@ public class ResultView { private static final String DEALER_DRAW_FORMAT = "%s는 %s이하라 한장의 카드를 더 받았습니다.\n"; private static final String MATCH_RESULT_FORMAT = "%s: %s\n"; - public static void shareCards(String dealerName, List playerNames) { + public static void shareCards(final String dealerName, final List playerNames) { String playersName = playerNames.stream() .map(NameInfo::getPersonName) .collect(Collectors.joining(DELIMITER)); - System.out.println(String.format(INIT_SHARE_MESSAGE, dealerName, playersName, INIT_CARD_COUNT)); + System.out.println( + String.format(INIT_SHARE_MESSAGE, dealerName, playersName, INIT_CARD_COUNT)); } - public static void openCardInfo(CardInfo dealerCardInfo, List playerCardsInfo) { - System.out.println(String.format(DEALER_FORMAT, dealerCardInfo.getPersonName(), join(dealerCardInfo))); + public static void openCardInfo(final CardInfo dealerCardInfo, final List playerCardsInfo) { + System.out.println( + String.format(DEALER_FORMAT, dealerCardInfo.getPersonName(), join(dealerCardInfo))); for (CardInfo playerCardInfo : playerCardsInfo) { - System.out.println(String.format(PLAYER_FORMAT, playerCardInfo.getPersonName(), join(playerCardInfo))); + System.out.println( + String.format(PLAYER_FORMAT, playerCardInfo.getPersonName(), join(playerCardInfo))); } } - private static String join(CardInfo cardInfo) { + private static String join(final CardInfo cardInfo) { return cardInfo.getCardNames().stream() .collect(Collectors.joining(DELIMITER)); } - public static void playerCardsInfo(CardInfo activePlayerCardsInfo) { - System.out.println(String.format(PLAYER_FORMAT, activePlayerCardsInfo.getPersonName(), join(activePlayerCardsInfo))); + public static void playerCardsInfo(final CardInfo activePlayerCardsInfo) { + System.out.println(String.format(PLAYER_FORMAT, activePlayerCardsInfo.getPersonName(), + join(activePlayerCardsInfo))); } - public static void dealerDrawDecision(NameInfo dealerNameInfo, int limit) { + public static void dealerDrawDecision(final NameInfo dealerNameInfo, final int limit) { System.out.format(DEALER_DRAW_FORMAT, dealerNameInfo.getPersonName(), limit); } @@ -52,27 +56,28 @@ public static void margin() { System.out.println(); } - public static void scoreboard(List scoreInfo) { + public static void scoreboard(final List scoreInfo) { scoreInfo.forEach(ResultView::scoreboard); margin(); } - public static void scoreboard(ScoreInfo scoreInfo) { - System.out.format(SCOREBOARD_FORMAT, scoreInfo.getName(), scoreInfo.getCardNames().stream().collect( - Collectors.joining(DELIMITER)), scoreInfo.getScore()); + public static void scoreboard(final ScoreInfo scoreInfo) { + System.out.format(SCOREBOARD_FORMAT, scoreInfo.getName(), + scoreInfo.getCardNames().stream().collect( + Collectors.joining(DELIMITER)), scoreInfo.getScore()); } - public static void matchResult(MatchInfo dealerMatchInfo, List playersMatchInfo) { + public static void matchResult(final MatchInfo dealerMatchInfo, final List playersMatchInfo) { System.out.println(MATCH_RESULT_MESSAGE); printMatchResult(dealerMatchInfo); printMatchResult(playersMatchInfo); } - private static void printMatchResult(List playersMatchInfo) { + private static void printMatchResult(final List playersMatchInfo) { playersMatchInfo.forEach(ResultView::printMatchResult); } - private static void printMatchResult(MatchInfo matchInfo) { + private static void printMatchResult(final MatchInfo matchInfo) { System.out.format(MATCH_RESULT_FORMAT, matchInfo.getName(), matchInfo.getMatches()); } } From a5158dba09cc602054875898c430624ec52a266b Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:19:15 +0900 Subject: [PATCH 52/64] =?UTF-8?q?refactor:=20=EB=88=84=EB=9D=BD=EB=90=9C?= =?UTF-8?q?=20=EC=BB=A4=EB=B0=8B=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- .../blackjack/controller/GameController.java | 2 +- src/main/java/blackjack/domain/Cards.java | 2 ++ src/main/java/blackjack/domain/Person.java | 10 +++---- src/main/java/blackjack/domain/Players.java | 9 +++---- src/main/java/blackjack/domain/Score.java | 11 ++++---- .../java/blackjack/domain/ScoreBoard.java | 27 +++++++++++-------- 6 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/main/java/blackjack/controller/GameController.java b/src/main/java/blackjack/controller/GameController.java index 89c3d92c..62d05217 100644 --- a/src/main/java/blackjack/controller/GameController.java +++ b/src/main/java/blackjack/controller/GameController.java @@ -53,7 +53,7 @@ private void showGameResult() { scoreBoard.playerMatches()); } - private void playersJudgment(Deck deck) { + private void playersJudgment(final Deck deck) { while (players.hasActivePlayer()) { activePlayerJudgement(deck); } diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index 97736907..85b78df8 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -10,6 +10,8 @@ public class Cards { private static final int LIMITED_ACE_SCORE = 11; private static final int REFERENCE_POINT = 21; private static final String CARD_SIZE_ZERO_ERROR = "카드가 존재하지 않습니다."; + private static final int FRONT = 0; + private final List cards; public Cards(final List cards) { diff --git a/src/main/java/blackjack/domain/Person.java b/src/main/java/blackjack/domain/Person.java index 54c7ade9..2af9bc10 100644 --- a/src/main/java/blackjack/domain/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -8,8 +8,8 @@ public abstract class Person { public static final int INIT_CARD_COUNT = 2; - protected final String userName; - protected final Cards cards; + final String userName; + final Cards cards; public Person(String userName, Cards cards) { this.userName = userName; @@ -34,10 +34,8 @@ public NameInfo nameInfo() { return new NameInfo(userName); } - public void initializeDeck(Deck deck) { - for (int i = 0; i < INIT_CARD_COUNT; i++) { - cards.add(deck.drawCard()); - } + public ScoreInfo scoreInfo() { + return new ScoreInfo(userName, cards.openCardAll(), cards.totalScore()); } public abstract boolean canDrawCard(); diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index a57f35c8..bd3f7421 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -40,13 +40,12 @@ public void drawCardToActivePlayer(final Deck deck) { getActivePlayer().drawCard(deck); } - public void drawCardToActivePlayer(Deck deck) { - getActivePlayer().drawCard(deck); + public void nextActivePlayer() { + activePlayerIndex++; } - public CardInfo getActivePlayerCardsInfo() { - Player player = getActivePlayer(); - return new CardInfo(player.userName, player.cards.openCardAll()); + public boolean hasActivePlayer() { + return activePlayerIndex < players.size(); } public ScoreBoard match(final Dealer dealer) { diff --git a/src/main/java/blackjack/domain/Score.java b/src/main/java/blackjack/domain/Score.java index d910549d..ed370d6e 100644 --- a/src/main/java/blackjack/domain/Score.java +++ b/src/main/java/blackjack/domain/Score.java @@ -17,12 +17,11 @@ public enum Score { this.name = name; } - public int getKey() { - return key; - } - - public String getName() { - return name; + public static Score of(final int key) { + return Arrays.stream(values()) + .filter(score -> score.key == key) + .findFirst() + .orElseThrow(() -> new RuntimeException("존재하지 않는 키입니다.")); } public static Score judge(final Cards playerCards, final Cards dealerCards) { diff --git a/src/main/java/blackjack/domain/ScoreBoard.java b/src/main/java/blackjack/domain/ScoreBoard.java index e5753001..f16ddbed 100644 --- a/src/main/java/blackjack/domain/ScoreBoard.java +++ b/src/main/java/blackjack/domain/ScoreBoard.java @@ -7,22 +7,27 @@ public class ScoreBoard { + private final static String DELIMITER = " "; + private final static String SCORE_RESULT_FORMAT = "%s%s"; + private final Map scoreMap; - public ScoreBoard(Map scoreMap) { + public ScoreBoard(final Map scoreMap) { this.scoreMap = scoreMap; } - public MatchInfo getDealerMatchInfo(Dealer dealer) { - return new MatchInfo( - dealer.userName, - scoreMap.values().stream() - .collect(Collectors.groupingBy(o -> o, Collectors.counting())) - .entrySet().stream() - .sorted(Map.Entry.comparingByKey()) - .map(map -> map.getValue() + map.getKey().getName()) - .collect(Collectors.joining(" ")) - ); + public MatchInfo dealerMatches(final Dealer dealer) { + final Map countingMap = scoreMap.values().stream() + .map(Score::oppositeScore) + .collect(Collectors.groupingBy(o -> o, Collectors.counting())); + + return new MatchInfo(dealer.userName, dealerResultFormat(countingMap)); + } + + public List playerMatches() { + return scoreMap.entrySet().stream() + .map(map -> new MatchInfo(map.getKey().userName, map.getValue().getName())) + .collect(Collectors.toList()); } private String dealerResultFormat(final Map countingMap) { From 007cf1ceb085520d8d3b197bac4ff1fa5ee34198 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:19:34 +0900 Subject: [PATCH 53/64] =?UTF-8?q?refactor:=20=EB=88=84=EB=9D=BD=EB=90=9C?= =?UTF-8?q?=20=EC=BB=A4=EB=B0=8B=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- src/main/java/blackjack/domain/Cards.java | 2 +- src/main/java/blackjack/domain/Dealer.java | 2 +- src/main/java/blackjack/domain/Person.java | 2 +- src/main/java/blackjack/domain/Player.java | 10 ++++++++-- src/main/java/blackjack/domain/Suit.java | 2 +- src/main/java/blackjack/dto/ScoreInfo.java | 2 +- 6 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/blackjack/domain/Cards.java b/src/main/java/blackjack/domain/Cards.java index 85b78df8..ba87262b 100644 --- a/src/main/java/blackjack/domain/Cards.java +++ b/src/main/java/blackjack/domain/Cards.java @@ -33,7 +33,7 @@ public int totalScore() { return score; } - public void add(Card drawCard) { + public void add(final Card drawCard) { cards.add(drawCard); } diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 97daa8b4..34155021 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -9,7 +9,7 @@ public class Dealer extends Person { public static final int DEALER_DRAW_LIMIT = 16; private static final String DEALER_NAME = "딜러"; - public Dealer(String userName, Cards cards) { + public Dealer(final String userName,final Cards cards) { super(userName, cards); } diff --git a/src/main/java/blackjack/domain/Person.java b/src/main/java/blackjack/domain/Person.java index 2af9bc10..9625f306 100644 --- a/src/main/java/blackjack/domain/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -11,7 +11,7 @@ public abstract class Person { final String userName; final Cards cards; - public Person(String userName, Cards cards) { + public Person(final String userName,final Cards cards) { this.userName = userName; this.cards = cards; } diff --git a/src/main/java/blackjack/domain/Player.java b/src/main/java/blackjack/domain/Player.java index 7086e971..5eff8869 100644 --- a/src/main/java/blackjack/domain/Player.java +++ b/src/main/java/blackjack/domain/Player.java @@ -21,7 +21,13 @@ public int totalScore() { return cards.totalScore(); } - public Score compareScore(Dealer dealer) { - return Score.judge(cards, dealer.cards); + @Override + public boolean canDrawCard() { + return !cards.blackjack() && !cards.isBust(); + } + + @Override + public CardInfo openCards() { + return new CardInfo(userName, cards.openCardAll()); } } diff --git a/src/main/java/blackjack/domain/Suit.java b/src/main/java/blackjack/domain/Suit.java index afe6ba67..8ca090b2 100644 --- a/src/main/java/blackjack/domain/Suit.java +++ b/src/main/java/blackjack/domain/Suit.java @@ -8,7 +8,7 @@ public enum Suit { private String name; - Suit(String name) { + Suit(final String name) { this.name = name; } diff --git a/src/main/java/blackjack/dto/ScoreInfo.java b/src/main/java/blackjack/dto/ScoreInfo.java index d5d6ef3d..38afd9ad 100644 --- a/src/main/java/blackjack/dto/ScoreInfo.java +++ b/src/main/java/blackjack/dto/ScoreInfo.java @@ -9,7 +9,7 @@ public class ScoreInfo { private final List cardNames; private final int score; - public ScoreInfo(String name, List cardNames, int score) { + public ScoreInfo(final String name, final List cardNames, final int score) { this.name = name; this.cardNames = cardNames; this.score = score; From 10c15b283eca40f5b3d03559d4b1c64a564d77af Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Fri, 18 Feb 2022 23:21:40 +0900 Subject: [PATCH 54/64] =?UTF-8?q?docs:=20=EC=99=84=EB=A3=8C=EB=90=9C=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=A6=AC=EB=93=9C?= =?UTF-8?q?=EB=AF=B8=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: judy5050 Co-authored-by: minchul-son Co-authored-by: kworkbee --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 57b7a7b1..ecb8cce9 100644 --- a/README.md +++ b/README.md @@ -16,18 +16,18 @@ ### 블랙잭 -- [] 카드계산 - - [] 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산 -- [] 카드지급 기준 - - [] 게임을 시작하면 플레이어는 두 장의 카드를 지급 받음 - - [] 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있음 - -[] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없음 -- [] 승자 결정 기준 - - [] 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이김 - - [] 게임을 완료한 후 각 플레이어별로 승패를 출력 +- [x] 카드계산 + - [x] 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산 +- [x] 카드지급 기준 + - [x] 게임을 시작하면 플레이어는 두 장의 카드를 지급 받음 + - [x] 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있음 + -[x] 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없음 +- [x] 승자 결정 기준 + - [x] 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이김 + - [x] 게임을 완료한 후 각 플레이어별로 승패를 출력 ### 프로그래밍 요구사항 -- [] 모든 엔티티를 작게 유지 -- [] 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않음 -- [] 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 함 +- [x] 모든 엔티티를 작게 유지 +- [x] 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않음 +- [x] 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 함 From 714705b8c3d0603dd51b1a8be353286dd23d3f7e Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 17:49:01 +0900 Subject: [PATCH 55/64] =?UTF-8?q?refactor(rentCar):=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=20=EB=B6=80=EB=AA=A8=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/rentcompany/domain/car/Avante.java | 9 +-------- src/main/java/rentcompany/domain/car/K5.java | 8 +------- .../java/rentcompany/domain/car/PassengerCar.java | 11 +++++++++++ src/main/java/rentcompany/domain/car/Sonata.java | 9 +-------- 4 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/main/java/rentcompany/domain/car/Avante.java b/src/main/java/rentcompany/domain/car/Avante.java index ac36f003..b1578444 100644 --- a/src/main/java/rentcompany/domain/car/Avante.java +++ b/src/main/java/rentcompany/domain/car/Avante.java @@ -4,10 +4,8 @@ public class Avante extends PassengerCar { private static final int MILEAGE = 15; - private final int distance; - public Avante(final int distance) { - this.distance = distance; + super(distance); } @Override @@ -15,11 +13,6 @@ public double getDistancePerLiter() { return MILEAGE; } - @Override - public double getTripDistance() { - return distance; - } - @Override public String getName() { return this.getClass().getSimpleName(); diff --git a/src/main/java/rentcompany/domain/car/K5.java b/src/main/java/rentcompany/domain/car/K5.java index ae1a942f..5c937fee 100644 --- a/src/main/java/rentcompany/domain/car/K5.java +++ b/src/main/java/rentcompany/domain/car/K5.java @@ -4,10 +4,9 @@ public class K5 extends PassengerCar { private static final int MILEAGE = 13; - private final int distance; public K5(final int distance) { - this.distance = distance; + super(distance); } @Override @@ -15,11 +14,6 @@ public double getDistancePerLiter() { return MILEAGE; } - @Override - public double getTripDistance() { - return distance; - } - @Override public String getName() { return this.getClass().getSimpleName(); diff --git a/src/main/java/rentcompany/domain/car/PassengerCar.java b/src/main/java/rentcompany/domain/car/PassengerCar.java index 496b1f26..adf91e18 100644 --- a/src/main/java/rentcompany/domain/car/PassengerCar.java +++ b/src/main/java/rentcompany/domain/car/PassengerCar.java @@ -2,6 +2,17 @@ public abstract class PassengerCar implements Car { + private final int distance; + + protected PassengerCar(final int distance) { + this.distance = distance; + } + + @Override + public double getTripDistance() { + return distance; + } + public double getChargeQuantity() { return getTripDistance() / getDistancePerLiter(); } diff --git a/src/main/java/rentcompany/domain/car/Sonata.java b/src/main/java/rentcompany/domain/car/Sonata.java index 746e41ac..7f9ee224 100644 --- a/src/main/java/rentcompany/domain/car/Sonata.java +++ b/src/main/java/rentcompany/domain/car/Sonata.java @@ -4,10 +4,8 @@ public class Sonata extends PassengerCar { private static final int MILEAGE = 10; - private final int distance; - public Sonata(final int distance) { - this.distance = distance; + super(distance); } @Override @@ -15,11 +13,6 @@ public double getDistancePerLiter() { return MILEAGE; } - @Override - public double getTripDistance() { - return distance; - } - @Override public String getName() { return this.getClass().getSimpleName(); From 1c3978fbdc991a54ecfaf56954fba487d7845df6 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 17:55:19 +0900 Subject: [PATCH 56/64] =?UTF-8?q?refactor(blackJack):=20=EA=B0=80=EB=8F=85?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index bd3f7421..04dc65be 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -21,11 +21,10 @@ public Players(final List players) { } public static Players create(final List names) { - return new Players( - names.stream() - .map(name -> new Player(name, new Cards(new ArrayList<>()))) - .collect(Collectors.toList()) - ); + final List players = names.stream() + .map(name -> new Player(name, new Cards(new ArrayList<>()))) + .collect(Collectors.toList()); + return new Players(players); } public void initializeDeck(final Deck deck) { From 88ab17c00ae8a94d1d443b098201a92a55ce0bc4 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 17:59:54 +0900 Subject: [PATCH 57/64] =?UTF-8?q?refactor(blackJack):=20Collections.foreac?= =?UTF-8?q?k()=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 04dc65be..c57f3d16 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -28,7 +28,7 @@ public static Players create(final List names) { } public void initializeDeck(final Deck deck) { - players.stream().forEach(player -> player.initializeDeck(deck)); + players.forEach(player -> player.initializeDeck(deck)); } public boolean checkActivePlayerCanDrawCard() { From f06bc8c5e2eede70dc7d2fa7f88e08b8ecb97ff7 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:02:41 +0900 Subject: [PATCH 58/64] =?UTF-8?q?refactor(blackJack):=20Player=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=EB=A5=BC=20=EC=A0=81=EC=9E=98=ED=95=9C=20=EA=B2=83?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index c57f3d16..3775e9f1 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -22,7 +22,7 @@ public Players(final List players) { public static Players create(final List names) { final List players = names.stream() - .map(name -> new Player(name, new Cards(new ArrayList<>()))) + .map(name -> new Player(name)) .collect(Collectors.toList()); return new Players(players); } From 346e27a39904775aac09d2d6d4a90094d502b64f Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:03:29 +0900 Subject: [PATCH 59/64] =?UTF-8?q?refactor(blackJack):=20=EA=B5=AC=EA=B8=80?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= 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/Person.java | 2 +- src/main/java/blackjack/view/InputView.java | 3 ++- src/main/java/blackjack/view/ResultView.java | 6 ++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/blackjack/domain/Dealer.java b/src/main/java/blackjack/domain/Dealer.java index 34155021..62a88f6b 100644 --- a/src/main/java/blackjack/domain/Dealer.java +++ b/src/main/java/blackjack/domain/Dealer.java @@ -9,7 +9,7 @@ public class Dealer extends Person { public static final int DEALER_DRAW_LIMIT = 16; private static final String DEALER_NAME = "딜러"; - public Dealer(final String userName,final Cards cards) { + public Dealer(final String userName, final Cards cards) { super(userName, cards); } diff --git a/src/main/java/blackjack/domain/Person.java b/src/main/java/blackjack/domain/Person.java index 9625f306..67bb4806 100644 --- a/src/main/java/blackjack/domain/Person.java +++ b/src/main/java/blackjack/domain/Person.java @@ -11,7 +11,7 @@ public abstract class Person { final String userName; final Cards cards; - public Person(final String userName,final Cards cards) { + public Person(final String userName, final Cards cards) { this.userName = userName; this.cards = cards; } diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java index 67568492..eb4b3d51 100644 --- a/src/main/java/blackjack/view/InputView.java +++ b/src/main/java/blackjack/view/InputView.java @@ -47,7 +47,8 @@ public boolean getDecision() { } - private InputView() {} + private InputView() { + } public static boolean drawChoice(final NameInfo activePlayerNameInfo) { System.out.format(MESSAGE_CHOICE_DECISION, activePlayerNameInfo.getPersonName(), diff --git a/src/main/java/blackjack/view/ResultView.java b/src/main/java/blackjack/view/ResultView.java index 7a77c5e2..0f6d79f9 100644 --- a/src/main/java/blackjack/view/ResultView.java +++ b/src/main/java/blackjack/view/ResultView.java @@ -28,7 +28,8 @@ public static void shareCards(final String dealerName, final List play String.format(INIT_SHARE_MESSAGE, dealerName, playersName, INIT_CARD_COUNT)); } - public static void openCardInfo(final CardInfo dealerCardInfo, final List playerCardsInfo) { + public static void openCardInfo(final CardInfo dealerCardInfo, + final List playerCardsInfo) { System.out.println( String.format(DEALER_FORMAT, dealerCardInfo.getPersonName(), join(dealerCardInfo))); @@ -67,7 +68,8 @@ public static void scoreboard(final ScoreInfo scoreInfo) { Collectors.joining(DELIMITER)), scoreInfo.getScore()); } - public static void matchResult(final MatchInfo dealerMatchInfo, final List playersMatchInfo) { + public static void matchResult(final MatchInfo dealerMatchInfo, + final List playersMatchInfo) { System.out.println(MATCH_RESULT_MESSAGE); printMatchResult(dealerMatchInfo); printMatchResult(playersMatchInfo); From 279e281167284bc672c3eeedc0fcf5b3976ba0b5 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:07:55 +0900 Subject: [PATCH 60/64] =?UTF-8?q?refactor(blackJack):=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=EB=90=9C=20=ED=94=8C=EB=A0=88=EC=9D=B4=EC=96=B4?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=BE=EC=9D=84=20=EB=95=8C=20validation=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 3775e9f1..2d32f100 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -78,6 +78,9 @@ public List scoreInfos() { } private Player getActivePlayer() { + if (activePlayerIndex >= players.size()) { + throw new RuntimeException("해당 플레이어를 찾지 못했습니다."); + } return players.get(activePlayerIndex); } } From 0f3d1896a32c9539f90192cdc846ed01bcb56954 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:09:47 +0900 Subject: [PATCH 61/64] =?UTF-8?q?refactor(blackJack):=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/domain/Players.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/blackjack/domain/Players.java b/src/main/java/blackjack/domain/Players.java index 2d32f100..2a817c06 100644 --- a/src/main/java/blackjack/domain/Players.java +++ b/src/main/java/blackjack/domain/Players.java @@ -48,12 +48,12 @@ public boolean hasActivePlayer() { } public ScoreBoard match(final Dealer dealer) { - final Map map = new LinkedHashMap<>(); + final Map result = new LinkedHashMap<>(); for (Player player : players) { - map.put(player, player.compareScore(dealer)); + result.put(player, player.compareScore(dealer)); } - return new ScoreBoard(map); + return new ScoreBoard(result); } public CardInfo getActivePlayerCardInfo() { From eb020399faa282147b5bc02304da78db643ef1e1 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:34:16 +0900 Subject: [PATCH 62/64] =?UTF-8?q?test(blackJack):=20Card=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=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/test/java/blackjack/domain/CardTest.java | 28 ++++++++++++++++++++ 1 file changed, 28 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..fef5fca9 --- /dev/null +++ b/src/test/java/blackjack/domain/CardTest.java @@ -0,0 +1,28 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.*; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class CardTest { + + @Test + void 해당_카드가_에이스인지_알_수_있다() { + Card card = new Card(CardNumber.ACE, Suit.CLUB); + + boolean result = card.isAce(); + + assertThat(result).isTrue(); + } + + @Test + void 해당_카드가_몇점인지_알_수_있다() { + Card card = new Card(CardNumber.KING, Suit.CLUB); + + int score = card.getCardScore(); + + assertThat(score).isEqualTo(10); + } + +} From e84849e65c33d624080ed9b37cf584bf271cc589 Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:34:26 +0900 Subject: [PATCH 63/64] =?UTF-8?q?test(blackJack):=20Cards=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=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/test/java/blackjack/domain/CardsTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/test/java/blackjack/domain/CardsTest.java diff --git a/src/test/java/blackjack/domain/CardsTest.java b/src/test/java/blackjack/domain/CardsTest.java new file mode 100644 index 00000000..449e3f3f --- /dev/null +++ b/src/test/java/blackjack/domain/CardsTest.java @@ -0,0 +1,98 @@ +package blackjack.domain; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Test; + +class CardsTest { + + private List cards; + + @Test + void 새로운_카드를_추가할_수_있다() { + Cards cards = new Cards(new ArrayList<>()); + + cards.add(new Card(CardNumber.EIGHT, Suit.DIAMOND)); + int size = cards.size(); + + assertThat(size).isEqualTo(1); + } + + @Test + void 뽑은_카드의_점수_합계를_구할_수_있다() { + Cards cards = new Cards(new ArrayList<>(Arrays.asList( + new Card(CardNumber.EIGHT, Suit.CLUB), + new Card(CardNumber.SEVEN, Suit.CLUB), + new Card(CardNumber.TWO, Suit.CLUB) + ))); + + int totalScore = cards.totalScore(); + + assertThat(totalScore).isEqualTo(17); + } + + @Test + void 파산_여부를_알_수_있다() { + Cards cards = new Cards(new ArrayList<>(Arrays.asList( + new Card(CardNumber.EIGHT, Suit.CLUB), + new Card(CardNumber.SEVEN, Suit.CLUB), + new Card(CardNumber.SEVEN, Suit.CLUB) + ))); + + boolean result = cards.isBust(); + + assertThat(result).isTrue(); + } + + @Test + void 블랙잭_여부를_알_수_있다() { + Cards cards = new Cards(new ArrayList<>(Arrays.asList( + new Card(CardNumber.EIGHT, Suit.CLUB), + new Card(CardNumber.SEVEN, Suit.CLUB), + new Card(CardNumber.SIX, Suit.CLUB) + ))); + + boolean result = cards.blackjack(); + + assertThat(result).isTrue(); + } + + @Test + void 카드가_한_장도_없을_때_오픈하면_예외가_발생한다() { + Cards cards = new Cards(new ArrayList<>()); + + assertThatThrownBy(() -> cards.openCardOne()) + .isInstanceOf(RuntimeException.class) + .hasMessage("카드가 존재하지 않습니다."); + } + + @Test + void 카드를_한_장_오픈할_수_있다() { + Cards cards = new Cards(new ArrayList<>(Arrays.asList( + new Card(CardNumber.EIGHT, Suit.CLUB + )))); + + List result = cards.openCardOne(); + + assertThat(result).containsExactly("8클로버"); + + } + + @Test + void 모든_카드를_오픈할_수_있다() { + Cards cards = new Cards(new ArrayList<>(Arrays.asList( + new Card(CardNumber.EIGHT, Suit.CLUB), + new Card(CardNumber.SEVEN, Suit.CLUB), + new Card(CardNumber.TWO, Suit.CLUB) + ))); + + List result = cards.openCardAll(); + + assertThat(result).containsExactly("8클로버", "7클로버", "2클로버"); + } + +} From 3c711f69f4732e39c68bda420f08b103760ae8cc Mon Sep 17 00:00:00 2001 From: MinChul-Son Date: Sun, 27 Feb 2022 18:37:17 +0900 Subject: [PATCH 64/64] =?UTF-8?q?refactor(blackJack):=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/blackjack/domain/CardNumberTest.java | 1 - src/test/java/blackjack/domain/CardTest.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/java/blackjack/domain/CardNumberTest.java b/src/test/java/blackjack/domain/CardNumberTest.java index 7f46d5e0..71b48cdc 100644 --- a/src/test/java/blackjack/domain/CardNumberTest.java +++ b/src/test/java/blackjack/domain/CardNumberTest.java @@ -1,6 +1,5 @@ package blackjack.domain; -import blackjack.domain.CardNumber; import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/blackjack/domain/CardTest.java b/src/test/java/blackjack/domain/CardTest.java index fef5fca9..1bb92c65 100644 --- a/src/test/java/blackjack/domain/CardTest.java +++ b/src/test/java/blackjack/domain/CardTest.java @@ -1,8 +1,7 @@ package blackjack.domain; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; class CardTest {