From cef9213cf05765a8727d3346d5848895caa73e88 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 15:00:42 +0900 Subject: [PATCH 01/37] =?UTF-8?q?Refact=20:=20CarTest=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/nextstep/fp/CarTest.java | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/test/java/nextstep/fp/CarTest.java b/src/test/java/nextstep/fp/CarTest.java index 1ab1106f..add44143 100644 --- a/src/test/java/nextstep/fp/CarTest.java +++ b/src/test/java/nextstep/fp/CarTest.java @@ -8,24 +8,15 @@ public class CarTest { @Test public void 이동() { Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return true; - } - }); + Car actual = car.move(() -> true); + assertThat(actual).isEqualTo(new Car("pobi", 1)); } @Test public void 정지() { Car car = new Car("pobi", 0); - Car actual = car.move(new MoveStrategy() { - @Override - public boolean isMovable() { - return false; - } - }); + Car actual = car.move(() -> false); assertThat(actual).isEqualTo(new Car("pobi", 0)); } } From a9888c373404abfd763845b8ff65700f24069c9d Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 15:00:54 +0900 Subject: [PATCH 02/37] =?UTF-8?q?Refact=20:=20Lambda=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/Condition.java | 5 ++ src/main/java/nextstep/fp/Lambda.java | 62 ++++++++++++------------ 2 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 src/main/java/nextstep/fp/Condition.java diff --git a/src/main/java/nextstep/fp/Condition.java b/src/main/java/nextstep/fp/Condition.java new file mode 100644 index 00000000..bafa628f --- /dev/null +++ b/src/main/java/nextstep/fp/Condition.java @@ -0,0 +1,5 @@ +package nextstep.fp; + +public interface Condition { + boolean condition(Integer number); +} diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index bd68fe1c..67076654 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -4,53 +4,51 @@ public class Lambda { public static void printAllOld(List numbers) { - System.out.println("printAllOld"); - - for (int number : numbers) { - System.out.println(number); - } + print("printAllOld"); + numbers.forEach(System.out::println); } public static void printAllLambda(List numbers) { - System.out.println("printAllLambda"); - + print("printAllLambda"); numbers.forEach(System.out::println); } public static void runThread() { - new Thread(new Runnable() { - @Override - public void run() { - System.out.println("Hello from thread"); - } - }).start(); + new Thread(() -> print("Hello from thread")).start(); } + public static int sumAll(List numbers) { - int total = 0; - for (int number : numbers) { - total += number; - } - return total; + return sumAll(numbers, Lambda::getAll); } public static int sumAllEven(List numbers) { - int total = 0; - for (int number : numbers) { - if (number % 2 == 0) { - total += number; - } - } - return total; + return sumAll(numbers, Lambda::getEven); } public static int sumAllOverThree(List numbers) { - int total = 0; - for (int number : numbers) { - if (number > 3) { - total += number; - } - } - return total; + return sumAll(numbers, Lambda::getOverThree); + } + + private static int sumAll(List numbers, Condition condition) { + return numbers.stream() + .filter(condition::condition) + .reduce(Integer::sum).orElse(0); + } + + private static void print(String Hello_from_thread) { + System.out.println(Hello_from_thread); + } + + private static boolean getAll(Integer integer) { + return true; + } + + private static boolean getEven(Integer integer) { + return integer % 2 == 0; + } + + private static boolean getOverThree(Integer integer) { + return integer > 3; } } From 6eac39fd0f970c08336c013fc95a27eda2c2d8bd Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 15:15:18 +0900 Subject: [PATCH 03/37] =?UTF-8?q?Refact=20:=20StreamStudy=20=EC=9A=94?= =?UTF-8?q?=EA=B5=AC=EC=82=AC=ED=95=AD=201=EB=B2=88=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/StreamStudy.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index b446983a..68bf3fe5 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -39,6 +39,6 @@ public static long sumAll(List numbers) { } public static long sumOverThreeAndDouble(List numbers) { - return 0; + return Lambda.sumAllOverThree(numbers) * 2L; } -} \ No newline at end of file +} From bcd91407451e63070119df874729c990dbaa2621 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 15:48:31 +0900 Subject: [PATCH 04/37] =?UTF-8?q?StreamStudy=20=EC=9A=94=EA=B5=AC=EC=82=AC?= =?UTF-8?q?=ED=95=AD=202=EB=B2=88=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/StreamStudy.java | 32 +++++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index 68bf3fe5..eec092e0 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -4,15 +4,20 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; public class StreamStudy { public static long countWords() throws IOException { String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); + .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); long count = 0; @@ -24,10 +29,29 @@ public static long countWords() throws IOException { public static void printLongestWordTop100() throws IOException { String contents = new String(Files.readAllBytes(Paths - .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); + .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); List words = Arrays.asList(contents.split("[\\P{L}]+")); - // TODO 이 부분에 구현한다. + + Map wordMap = new HashMap<>(); + + for (String word : words) { + if (!wordMap.containsKey(word)) { + wordMap.put(word, 0); + } + wordMap.put(word, wordMap.get(word) + 1); + } + + List collect = wordMap.entrySet() + .stream().filter(entry -> entry.getValue() > 12) + .sorted(Comparator.comparing(entry -> - entry.getValue())) + .map(entry -> entry.getKey().toLowerCase()) + .distinct() + .collect(Collectors.toList()); + + List subList = new ArrayList<>(collect.subList(0, 100)); + System.out.println(subList); + System.out.println(subList.size()); } public static List doubleNumbers(List numbers) { @@ -35,7 +59,7 @@ public static List doubleNumbers(List numbers) { } public static long sumAll(List numbers) { - return numbers.stream().reduce(0, (x, y) -> x + y); + return numbers.stream().reduce(0, Integer::sum); } public static long sumOverThreeAndDouble(List numbers) { From d57d1ac51a236a3886cc145c6afa8d17a5a57b36 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 18:50:55 +0900 Subject: [PATCH 05/37] =?UTF-8?q?Refct=20:=20Optional=201=EB=B2=88=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/User.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index 9614c2f4..8d87cea4 100644 --- a/src/main/java/nextstep/optional/User.java +++ b/src/main/java/nextstep/optional/User.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Optional; + public class User { private String name; private Integer age; @@ -25,15 +27,15 @@ public static boolean ageIsInRange1(User user) { boolean isInRange = false; if (user != null && user.getAge() != null - && (user.getAge() >= 30 - && user.getAge() <= 45)) { + && (user.getAge() >= 30 + && user.getAge() <= 45)) { isInRange = true; } return isInRange; } public static boolean ageIsInRange2(User user) { - return false; + return user != null && user.getAge() != null && (user.getAge() >= 30 && user.getAge() <= 45); } @Override From cac2d4545d174ccd527360747f7ce993b151c62d Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 18:51:05 +0900 Subject: [PATCH 06/37] =?UTF-8?q?Refct=20:=20Optional=202=EB=B2=88=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/Users.java | 10 +++------- src/test/java/nextstep/optional/UsersTest.java | 8 ++++++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/nextstep/optional/Users.java b/src/main/java/nextstep/optional/Users.java index 6293040d..f77f6527 100644 --- a/src/main/java/nextstep/optional/Users.java +++ b/src/main/java/nextstep/optional/Users.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; public class Users { static final User DEFAULT_USER = new User("codesquad", 100); @@ -12,12 +13,7 @@ public class Users { new User("jk", 40), new User("honux", 45)); - User getUser(String name) { - for (User user : users) { - if (user.matchName(name)) { - return user; - } - } - return DEFAULT_USER; + Optional getUser(String name) { + return users.stream().filter(user -> user.matchName(name)).findFirst(); } } diff --git a/src/test/java/nextstep/optional/UsersTest.java b/src/test/java/nextstep/optional/UsersTest.java index ec0f7329..e4c2a88d 100644 --- a/src/test/java/nextstep/optional/UsersTest.java +++ b/src/test/java/nextstep/optional/UsersTest.java @@ -9,13 +9,17 @@ public class UsersTest { @Test public void getUser() { Users users = new Users(); - assertThat(users.getUser("crong")).isEqualTo(new User("crong", 35)); + assertThat(getUser(users, "crong")).isEqualTo(new User("crong", 35)); } @Test public void getDefaultUser() { Users users = new Users(); - assertThat(users.getUser("codesquard")).isEqualTo(Users.DEFAULT_USER); + assertThat(getUser(users, "codesquard")).isEqualTo(Users.DEFAULT_USER); + } + + private User getUser(Users users, String codesquard) { + return users.getUser(codesquard).orElse(Users.DEFAULT_USER); } } From 4434455664211d10bfc573dbeaa2578e3cc72e18 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 15 Aug 2022 18:53:54 +0900 Subject: [PATCH 07/37] =?UTF-8?q?Refct=20:=20Optional=203=EB=B2=88=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/Expression.java | 15 ++++++++------- .../java/nextstep/optional/ExpressionTest.java | 6 +++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/nextstep/optional/Expression.java b/src/main/java/nextstep/optional/Expression.java index 1c98cd6a..b335794b 100644 --- a/src/main/java/nextstep/optional/Expression.java +++ b/src/main/java/nextstep/optional/Expression.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Arrays; + enum Expression { PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/"); @@ -14,12 +16,11 @@ private static boolean matchExpression(Expression e, String expression) { } static Expression of(String expression) { - for (Expression v : values()) { - if (matchExpression(v, expression)) { - return v; - } - } - - throw new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)); + return Arrays.stream(values()) + .filter(expression1 -> matchExpression(expression1, expression)) + .findFirst() + .orElseThrow( + () -> new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression)) + ); } } diff --git a/src/test/java/nextstep/optional/ExpressionTest.java b/src/test/java/nextstep/optional/ExpressionTest.java index 32356261..32e0f72f 100644 --- a/src/test/java/nextstep/optional/ExpressionTest.java +++ b/src/test/java/nextstep/optional/ExpressionTest.java @@ -15,8 +15,8 @@ public void of() { @Test public void notValidExpression() { assertThatIllegalArgumentException() - .isThrownBy(() -> { - Expression.of("&"); - }); + .isThrownBy(() -> { + Expression.of("&"); + }); } } From 5e0a84b2e96ec9303970f330ef154d38ed8cd5aa Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:04:10 +0900 Subject: [PATCH 08/37] =?UTF-8?q?Refact=20:=20Lambda.java=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/Lambda.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index 67076654..a8072c3d 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -36,8 +36,8 @@ private static int sumAll(List numbers, Condition condition) { .reduce(Integer::sum).orElse(0); } - private static void print(String Hello_from_thread) { - System.out.println(Hello_from_thread); + private static void print(String message) { + System.out.println(message); } private static boolean getAll(Integer integer) { From 083322bc563f36a6b403b832b960b7ba7830a50b Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:04:21 +0900 Subject: [PATCH 09/37] =?UTF-8?q?Refact=20:=20StreamStudy.java=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/fp/StreamStudy.java | 33 +++++----------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index eec092e0..d0936af7 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -4,21 +4,18 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.function.Function; import java.util.stream.Collectors; public class StreamStudy { + private static final String REGEX = "[\\P{L}]+"; public static long countWords() throws IOException { String contents = new String(Files.readAllBytes(Paths .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); + String[] words = contents.split(REGEX); long count = 0; for (String w : words) { @@ -30,28 +27,12 @@ public static long countWords() throws IOException { public static void printLongestWordTop100() throws IOException { String contents = new String(Files.readAllBytes(Paths .get("src/main/resources/fp/war-and-peace.txt")), StandardCharsets.UTF_8); - List words = Arrays.asList(contents.split("[\\P{L}]+")); - // TODO 이 부분에 구현한다. + List words = Arrays.asList(contents.split(REGEX)); - Map wordMap = new HashMap<>(); - - for (String word : words) { - if (!wordMap.containsKey(word)) { - wordMap.put(word, 0); - } - wordMap.put(word, wordMap.get(word) + 1); - } - - List collect = wordMap.entrySet() - .stream().filter(entry -> entry.getValue() > 12) - .sorted(Comparator.comparing(entry -> - entry.getValue())) - .map(entry -> entry.getKey().toLowerCase()) - .distinct() - .collect(Collectors.toList()); - - List subList = new ArrayList<>(collect.subList(0, 100)); - System.out.println(subList); - System.out.println(subList.size()); + words.stream().filter(w -> w.length() > 12) + .sorted(Comparator.comparing(String::length) + .reversed()).distinct().limit(100) + .map(String::toLowerCase).forEach(System.out::println); } public static List doubleNumbers(List numbers) { From 4096487dc1894061698ec8860530f4e4303fa5cf Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:22:17 +0900 Subject: [PATCH 10/37] =?UTF-8?q?Refact:=20User=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/User.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index 8d87cea4..e4eb155b 100644 --- a/src/main/java/nextstep/optional/User.java +++ b/src/main/java/nextstep/optional/User.java @@ -1,7 +1,5 @@ package nextstep.optional; -import java.util.Optional; - public class User { private String name; private Integer age; @@ -56,16 +54,13 @@ public boolean equals(Object obj) { if (getClass() != obj.getClass()) return false; User other = (User) obj; + if (age == null) { - if (other.age != null) - return false; + return other.age == null; } else if (!age.equals(other.age)) return false; if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; + return other.name == null; + } else return name.equals(other.name); } } From 6ca54c84292fc49c42aa3640f7a23666c2d44ebd Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:22:53 +0900 Subject: [PATCH 11/37] =?UTF-8?q?Refact=20:=20Computer=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/Computer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/nextstep/optional/Computer.java b/src/main/java/nextstep/optional/Computer.java index cc0af4d7..fb272703 100644 --- a/src/main/java/nextstep/optional/Computer.java +++ b/src/main/java/nextstep/optional/Computer.java @@ -1,7 +1,7 @@ package nextstep.optional; public class Computer { - private Soundcard soundcard; + private final Soundcard soundcard; public Computer(Soundcard soundcard) { this.soundcard = soundcard; @@ -12,7 +12,7 @@ public Soundcard getSoundcard() { } public static class Soundcard { - private USB usb; + private final USB usb; public Soundcard(USB usb) { super(); @@ -25,7 +25,7 @@ public USB getUsb() { } public static class USB { - private String version; + private final String version; public USB(String version) { super(); From 486d5742798f6aa2dc93ed0710108be6102fb5e4 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:40:48 +0900 Subject: [PATCH 12/37] =?UTF-8?q?Refact=20:=20User=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/User.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index e4eb155b..800539f8 100644 --- a/src/main/java/nextstep/optional/User.java +++ b/src/main/java/nextstep/optional/User.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Optional; + public class User { private String name; private Integer age; @@ -33,7 +35,7 @@ public static boolean ageIsInRange1(User user) { } public static boolean ageIsInRange2(User user) { - return user != null && user.getAge() != null && (user.getAge() >= 30 && user.getAge() <= 45); + return Optional.ofNullable(user).map(User::getAge).filter(x -> x >= 30 && x <= 45).isPresent(); } @Override From 7d783eac22eb9565cf593ce848aaef1aea2455ee Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 12:41:05 +0900 Subject: [PATCH 13/37] =?UTF-8?q?Refact=20:=20ComputerStore=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/optional/Computer.java | 10 ++++++++++ src/main/java/nextstep/optional/ComputerStore.java | 12 ++++++++++-- .../java/nextstep/optional/ComputerStoreTest.java | 14 ++++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/nextstep/optional/Computer.java b/src/main/java/nextstep/optional/Computer.java index fb272703..08e8343d 100644 --- a/src/main/java/nextstep/optional/Computer.java +++ b/src/main/java/nextstep/optional/Computer.java @@ -1,5 +1,7 @@ package nextstep.optional; +import java.util.Optional; + public class Computer { private final Soundcard soundcard; @@ -11,6 +13,10 @@ public Soundcard getSoundcard() { return soundcard; } + public Optional getOptionalSoundcard() { + return Optional.ofNullable(soundcard); + } + public static class Soundcard { private final USB usb; @@ -22,6 +28,10 @@ public Soundcard(USB usb) { public USB getUsb() { return usb; } + + public Optional getOptionalUsb() { + return Optional.ofNullable(usb); + } } public static class USB { diff --git a/src/main/java/nextstep/optional/ComputerStore.java b/src/main/java/nextstep/optional/ComputerStore.java index 2695c967..51831f92 100644 --- a/src/main/java/nextstep/optional/ComputerStore.java +++ b/src/main/java/nextstep/optional/ComputerStore.java @@ -3,8 +3,13 @@ import nextstep.optional.Computer.Soundcard; import nextstep.optional.Computer.USB; +import java.util.Optional; + public class ComputerStore { - public static final String UNKNOWN_VERSION = "UNKNOWN"; + private static final String UNKNOWN_VERSION = "UNKNOWN"; + private static final USB UNKNOWN_USB = new USB(UNKNOWN_VERSION); + private static final Soundcard UNKNOWN_SOUNDCARD = new Soundcard(UNKNOWN_USB); + private static final Computer UNKNOWN_COMPUTER = new Computer(UNKNOWN_SOUNDCARD); public static String getVersion(Computer computer) { String version = UNKNOWN_VERSION; @@ -21,6 +26,9 @@ public static String getVersion(Computer computer) { } public static String getVersionOptional(Computer computer) { - return null; + return Optional.ofNullable(computer).orElse(UNKNOWN_COMPUTER) + .getOptionalSoundcard().orElse(UNKNOWN_SOUNDCARD) + .getOptionalUsb().orElse(UNKNOWN_USB) + .getVersion(); } } diff --git a/src/test/java/nextstep/optional/ComputerStoreTest.java b/src/test/java/nextstep/optional/ComputerStoreTest.java index b576253a..c8185f57 100644 --- a/src/test/java/nextstep/optional/ComputerStoreTest.java +++ b/src/test/java/nextstep/optional/ComputerStoreTest.java @@ -7,6 +7,8 @@ import static org.assertj.core.api.Assertions.assertThat; public class ComputerStoreTest { + private static final String UNKNOWN_VERSION = "UNKNOWN"; + @Test public void getVersion() { String version = "pobi's usb"; @@ -17,19 +19,19 @@ public void getVersion() { @Test public void getVersionWhenComputerIsNull() throws Exception { - assertThat(ComputerStore.getVersion(null)).isEqualTo(ComputerStore.UNKNOWN_VERSION); + assertThat(ComputerStore.getVersion(null)).isEqualTo(UNKNOWN_VERSION); } @Test public void getVersionWhenSoundcardIsNull() throws Exception { Computer computer = new Computer(null); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); + assertThat(ComputerStore.getVersion(computer)).isEqualTo(UNKNOWN_VERSION); } @Test public void getVersionWhenUSBIsNull() throws Exception { Computer computer = new Computer(new Soundcard(null)); - assertThat(ComputerStore.getVersion(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); + assertThat(ComputerStore.getVersion(computer)).isEqualTo(UNKNOWN_VERSION); } @Test @@ -42,18 +44,18 @@ public void getVersionOptional() { @Test public void getVersionOptionalWhenComputerIsNull() throws Exception { - assertThat(ComputerStore.getVersionOptional(null)).isEqualTo(ComputerStore.UNKNOWN_VERSION); + assertThat(ComputerStore.getVersionOptional(null)).isEqualTo(UNKNOWN_VERSION); } @Test public void getVersionOptionalWhenSoundcardIsNull() throws Exception { Computer computer = new Computer(null); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); + assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(UNKNOWN_VERSION); } @Test public void getVersionOptionalWhenUSBIsNull() throws Exception { Computer computer = new Computer(new Soundcard(null)); - assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(ComputerStore.UNKNOWN_VERSION); + assertThat(ComputerStore.getVersionOptional(computer)).isEqualTo(UNKNOWN_VERSION); } } From eae04b8f2d31e8d0d322e6ee43691b70c9d3d01e Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 18:23:58 +0900 Subject: [PATCH 14/37] =?UTF-8?q?Docs=20:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 91 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 8fe71120..43435513 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,79 @@ -## [NEXTSTEP 플레이그라운드의 미션 진행 과정](https://github.com/next-step/nextstep-docs/blob/master/playground/README.md) +# 블랙잭 미션 구현 ---- -## 학습 효과를 높이기 위해 추천하는 미션 진행 방법 +## 기능 요구 사항 ---- -1. 피드백 강의 전까지 미션 진행 -> 피드백 강의 전까지 혼자 힘으로 미션 진행. 미션을 진행하면서 하나의 작업이 끝날 때 마다 add, commit -> 예를 들어 다음 숫자 야구 게임의 경우 0, 1, 2단계까지 구현을 완료한 후 push +블랙잭 게임을 변형한 프로그램을 구현한다. 블랙잭 게임은 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 이기는 게임이다. -![mission baseball](https://raw.githubusercontent.com/next-step/nextstep-docs/master/playground/images/mission_baseball.png) +- 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다. +- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. +- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다. 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다. +- 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다. +- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다. 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다. ---- -2. 피드백 앞 단계까지 미션 구현을 완료한 후 피드백 강의를 학습한다. +## 이벤트 흐름 ---- -3. Git 브랜치를 master 또는 main으로 변경한 후 피드백을 반영하기 위한 새로운 브랜치를 생성한 후 처음부터 다시 미션 구현을 도전한다. +1. 참가자의 이름을 등록했다. +2. 참가자들의 배팅 금액을 등록했다. +3. 딜러와 참가자들에게 카드를 나눠줬다. +4. 카드를 확인해 진행여부를 판단했다. +5. 카드를 계속 받을지 딜러와 참여자들에게 물었다. +6. 게임 승패에 따라 분배금을 분배했다. -``` -git branch -a // 모든 로컬 브랜치 확인 -git checkout master // 기본 브랜치가 master인 경우 -git checkout main // 기본 브랜치가 main인 경우 +## 모델링 +### 참여자 +- 상태 + - 참여자는 이름과 배팅 금액 그리고 카드패를 가지고 있다. + - 이름은 1 글자 이상이어야 한다. + - 배팅 금액은 0 이상의 정수여야 한다. +- 행위 + - 카드덱에서 카드를 뽑는다. + - 자신의 카드패를 확인한다. + - 자신의 카드패의 합을 확인한다. -git checkout -b 브랜치이름 -ex) git checkout -b apply-feedback -``` +### 딜러 +- 상태 + - 딜러는 카드패를 가지고 있다. + - 딜러의 카드패 합이 16 이하이면 카드덱에서 한 장 더 뽑아야 한다. + +### 카드패(Cards) +- 상태 + - 카드패에는 카드가 포함되어 있다. +- 행위 + - 카드패의 숫자 합을 출력한다. + - 카드패를 보여준다. + +### 카드(Card) +- 상태 + - 카드는 ACE, 2, 3, 4, 5, 6, 7, 8, 9, 10, King, Queen, Jack 중 하나의 숫자를 가진다. + - Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. + - 카드덱은 클로버, 하트, 다이아몬드, 스페이드 중 하나의 타입을 가진다. + - 카드에는 식별자가 존재하고, 13진수 이다. + - 둘 째자리 숫자를 이용해 카드의 종류를 파악할 수 있고, 첫 째자리 숫자를 이용해 카드의 숫자를 파악할 수 있다. + +### 카드덱(OneCard) +- 상태 + - 카드덱에는 52 종류의 카드가 저장되어 있다. + - 카드덱이 생성되면 카드덱을 섞는다. +- 행위 + - 카드덱에서 카드를 뽑아 건네준다. + +### 게임 +- 행위 + - 게임 시작 + - 이름을 등록한다. + - 배팅 금액을 등록한다. + - 카드를 두 장 분배한다. + - 이름 등록 + - 문자열을 받아 이름을 등록한다. + - 이름은 `,` 단위로 분리한다. + - 배팅 금액 등록 + - 순서대로 배팅 금액을 등록한다. + - 배팅 금액은 0 이상의 정수이다. + - 카드 한 장 분배 + - 카드덱에서 꺼내 카드를 분배한다. + - 진행 여부 판단 + - 참여자들의 카드를 확인해 진행 여부를 판단한다. + - 카드 패의 합이 21이 나온 딜러나 참여자가 있다면 게임을 종료한다. + - 분배금 분배 + - 참여자들과 딜러의 카드 패를 확인한다. + - 배팅 금액 정보를 기반으로 금액을 분배한다. From c675df9af1bb718b33ed224ec7ffd343bfa1b01a Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 19:15:52 +0900 Subject: [PATCH 15/37] =?UTF-8?q?Feat=20:=20Card=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++------ .../java/nextstep/blackjack/domain/Card.java | 15 ++++++++++ .../nextstep/blackjack/domain/CardNumber.java | 25 ++++++++++++++++ .../nextstep/blackjack/domain/CardType.java | 18 ++++++++++++ .../nextstep/blackjack/domain/CardTest.java | 29 +++++++++++++++++++ 5 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 src/main/java/nextstep/blackjack/domain/Card.java create mode 100644 src/main/java/nextstep/blackjack/domain/CardNumber.java create mode 100644 src/main/java/nextstep/blackjack/domain/CardType.java create mode 100644 src/test/java/nextstep/blackjack/domain/CardTest.java diff --git a/README.md b/README.md index 43435513..42726e9c 100644 --- a/README.md +++ b/README.md @@ -38,17 +38,16 @@ ### 카드패(Cards) - 상태 - 카드패에는 카드가 포함되어 있다. + - 처음 카드패는 최소 두 장의 카드가 존재해야 한다. - 행위 - 카드패의 숫자 합을 출력한다. + - Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. - 카드패를 보여준다. ### 카드(Card) - 상태 - 카드는 ACE, 2, 3, 4, 5, 6, 7, 8, 9, 10, King, Queen, Jack 중 하나의 숫자를 가진다. - - Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. - 카드덱은 클로버, 하트, 다이아몬드, 스페이드 중 하나의 타입을 가진다. - - 카드에는 식별자가 존재하고, 13진수 이다. - - 둘 째자리 숫자를 이용해 카드의 종류를 파악할 수 있고, 첫 째자리 숫자를 이용해 카드의 숫자를 파악할 수 있다. ### 카드덱(OneCard) - 상태 @@ -59,18 +58,16 @@ ### 게임 - 행위 - - 게임 시작 - - 이름을 등록한다. - - 배팅 금액을 등록한다. - - 카드를 두 장 분배한다. - 이름 등록 - 문자열을 받아 이름을 등록한다. - 이름은 `,` 단위로 분리한다. - 배팅 금액 등록 - 순서대로 배팅 금액을 등록한다. - 배팅 금액은 0 이상의 정수이다. - - 카드 한 장 분배 - - 카드덱에서 꺼내 카드를 분배한다. + - 카드를 모두에게 분배한다. + - 카드를 참여자와 딜러에게 두 장씩 분배한다. + - 참여자에게 카드 한 장 분배 + - 카드덱에서 꺼내 참여자에게 카드를 분배한다. - 진행 여부 판단 - 참여자들의 카드를 확인해 진행 여부를 판단한다. - 카드 패의 합이 21이 나온 딜러나 참여자가 있다면 게임을 종료한다. diff --git a/src/main/java/nextstep/blackjack/domain/Card.java b/src/main/java/nextstep/blackjack/domain/Card.java new file mode 100644 index 00000000..a7408ecb --- /dev/null +++ b/src/main/java/nextstep/blackjack/domain/Card.java @@ -0,0 +1,15 @@ +package nextstep.blackjack.domain; + +public class Card { + private final CardType cardType; + private final CardNumber cardNumber; + + public Card(CardType cardType, CardNumber cardNumber) { + this.cardType = cardType; + this.cardNumber = cardNumber; + } + + public String name() { + return cardNumber.getNumber() + cardType.getType(); + } +} diff --git a/src/main/java/nextstep/blackjack/domain/CardNumber.java b/src/main/java/nextstep/blackjack/domain/CardNumber.java new file mode 100644 index 00000000..49405fff --- /dev/null +++ b/src/main/java/nextstep/blackjack/domain/CardNumber.java @@ -0,0 +1,25 @@ +package nextstep.blackjack.domain; + +public enum CardNumber { + ONE("A"), + TWO("2"), + THREE("3"), + FOUR("4"), + FIVE("5"), + SIX("6"), + SEVEN("7"), + NINE("8"), + TEN("9"), + KING("K"), + QUEEN("Q"), + JACK("J"); + private final String cardNumber; + + CardNumber(String cardNumber) { + this.cardNumber = cardNumber; + } + + String getNumber() { + return cardNumber; + } +} diff --git a/src/main/java/nextstep/blackjack/domain/CardType.java b/src/main/java/nextstep/blackjack/domain/CardType.java new file mode 100644 index 00000000..4f6594ea --- /dev/null +++ b/src/main/java/nextstep/blackjack/domain/CardType.java @@ -0,0 +1,18 @@ +package nextstep.blackjack.domain; + +public enum CardType { + HEART("하트"), + DIAMOND("다이아몬드"), + CLOVER("클로버"), + SPADE("스페이드"); + + private final String cardType; + + CardType(String cardType) { + this.cardType = cardType; + } + + String getType() { + return cardType; + } +} diff --git a/src/test/java/nextstep/blackjack/domain/CardTest.java b/src/test/java/nextstep/blackjack/domain/CardTest.java new file mode 100644 index 00000000..b11bfee4 --- /dev/null +++ b/src/test/java/nextstep/blackjack/domain/CardTest.java @@ -0,0 +1,29 @@ +package nextstep.blackjack.domain; + +import nextstep.blackjack.domain.Card; +import nextstep.blackjack.domain.CardNumber; +import nextstep.blackjack.domain.CardType; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class CardTest { + + @Test + @DisplayName("카드는 숫자와 타입을 가진다.") + void card_create() { + Assertions.assertDoesNotThrow( + () -> new Card(CardType.CLOVER, CardNumber.FOUR) + ); + } + + @Test + @DisplayName("자신의 정보를 반환한다.") + void card_getName() { + CardType clover = CardType.CLOVER; + CardNumber four = CardNumber.FOUR; + + Card clover_four = new Card(clover, four); + org.assertj.core.api.Assertions.assertThat(clover_four.name()).isEqualTo(four.getNumber() + clover.getType()); + } +} From fac6f7a271b63f5799af1e00db205113ce98cdc4 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 19:46:20 +0900 Subject: [PATCH 16/37] =?UTF-8?q?Feat=20:=20OneCards=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/domain/Card.java | 35 +++++++++++++++ .../{ => blackjack}/domain/CardNumber.java | 12 +++-- .../{ => blackjack}/domain/CardType.java | 7 ++- .../blackjack/blackjack/domain/OneCards.java | 19 ++++++++ .../blackjack/utils/OneCardsGenerator.java | 34 ++++++++++++++ .../java/nextstep/blackjack/domain/Card.java | 15 ------- .../{ => blackjack}/domain/CardTest.java | 8 ++-- .../blackjack/domain/OneCardsTest.java | 45 +++++++++++++++++++ .../utils/OneCardsGeneratorTest.java | 17 +++++++ 9 files changed, 169 insertions(+), 23 deletions(-) create mode 100644 src/main/java/nextstep/blackjack/blackjack/domain/Card.java rename src/main/java/nextstep/blackjack/{ => blackjack}/domain/CardNumber.java (67%) rename src/main/java/nextstep/blackjack/{ => blackjack}/domain/CardType.java (70%) create mode 100644 src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java create mode 100644 src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java delete mode 100644 src/main/java/nextstep/blackjack/domain/Card.java rename src/test/java/nextstep/blackjack/{ => blackjack}/domain/CardTest.java (77%) create mode 100644 src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java create mode 100644 src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java b/src/main/java/nextstep/blackjack/blackjack/domain/Card.java new file mode 100644 index 00000000..f4fe9f66 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Card.java @@ -0,0 +1,35 @@ +package nextstep.blackjack.blackjack.domain; + +import java.util.Objects; + +public class Card { + private final CardType cardType; + private final CardNumber cardNumber; + + public Card(CardType cardType, CardNumber cardNumber) { + this.cardType = cardType; + this.cardNumber = cardNumber; + } + + public String name() { + return cardNumber.getNumber() + cardType.getType(); + } + + @Override + public String toString() { + return cardNumber.getNumber() + cardType.getType(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Card card = (Card) o; + return cardType == card.cardType && cardNumber == card.cardNumber; + } + + @Override + public int hashCode() { + return Objects.hash(cardType, cardNumber); + } +} diff --git a/src/main/java/nextstep/blackjack/domain/CardNumber.java b/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java similarity index 67% rename from src/main/java/nextstep/blackjack/domain/CardNumber.java rename to src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java index 49405fff..cdb63bf5 100644 --- a/src/main/java/nextstep/blackjack/domain/CardNumber.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.domain; +package nextstep.blackjack.blackjack.domain; public enum CardNumber { ONE("A"), @@ -8,8 +8,9 @@ public enum CardNumber { FIVE("5"), SIX("6"), SEVEN("7"), - NINE("8"), - TEN("9"), + EIGHT("8"), + NINE("9"), + TEN("10"), KING("K"), QUEEN("Q"), JACK("J"); @@ -22,4 +23,9 @@ public enum CardNumber { String getNumber() { return cardNumber; } + + @Override + public String toString() { + return cardNumber; + } } diff --git a/src/main/java/nextstep/blackjack/domain/CardType.java b/src/main/java/nextstep/blackjack/blackjack/domain/CardType.java similarity index 70% rename from src/main/java/nextstep/blackjack/domain/CardType.java rename to src/main/java/nextstep/blackjack/blackjack/domain/CardType.java index 4f6594ea..42a987e8 100644 --- a/src/main/java/nextstep/blackjack/domain/CardType.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/CardType.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.domain; +package nextstep.blackjack.blackjack.domain; public enum CardType { HEART("하트"), @@ -15,4 +15,9 @@ public enum CardType { String getType() { return cardType; } + + @Override + public String toString() { + return cardType; + } } diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java b/src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java new file mode 100644 index 00000000..49c66924 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java @@ -0,0 +1,19 @@ +package nextstep.blackjack.blackjack.domain; + +import java.util.LinkedList; + +public class OneCards { + private final LinkedList cardList; + + public OneCards(LinkedList cardList) { + this.cardList = cardList; + } + + public LinkedList getCardList() { + return new LinkedList<>(cardList); + } + + public Card pollCard() { + return cardList.pollFirst(); + } +} diff --git a/src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java b/src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java new file mode 100644 index 00000000..b57d108e --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java @@ -0,0 +1,34 @@ +package nextstep.blackjack.blackjack.utils; + +import nextstep.blackjack.blackjack.domain.Card; +import nextstep.blackjack.blackjack.domain.CardNumber; +import nextstep.blackjack.blackjack.domain.CardType; +import nextstep.blackjack.blackjack.domain.OneCards; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +public class OneCardsGenerator { + public static OneCards generateOneCards() { + List cards = getCards(); + shuffle(cards); + return new OneCards((LinkedList) cards); + } + + private static void shuffle(List cards) { + Collections.shuffle(cards); + } + + private static List getCards() { + List cards = new LinkedList<>(); + Arrays.stream(CardType.values()) + .forEach( + cardType -> Arrays + .stream(CardNumber.values()) + .forEach(cardNumber -> cards.add(new Card(cardType, cardNumber))) + ); + return cards; + } +} diff --git a/src/main/java/nextstep/blackjack/domain/Card.java b/src/main/java/nextstep/blackjack/domain/Card.java deleted file mode 100644 index a7408ecb..00000000 --- a/src/main/java/nextstep/blackjack/domain/Card.java +++ /dev/null @@ -1,15 +0,0 @@ -package nextstep.blackjack.domain; - -public class Card { - private final CardType cardType; - private final CardNumber cardNumber; - - public Card(CardType cardType, CardNumber cardNumber) { - this.cardType = cardType; - this.cardNumber = cardNumber; - } - - public String name() { - return cardNumber.getNumber() + cardType.getType(); - } -} diff --git a/src/test/java/nextstep/blackjack/domain/CardTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java similarity index 77% rename from src/test/java/nextstep/blackjack/domain/CardTest.java rename to src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java index b11bfee4..f6065dbc 100644 --- a/src/test/java/nextstep/blackjack/domain/CardTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java @@ -1,8 +1,8 @@ -package nextstep.blackjack.domain; +package nextstep.blackjack.blackjack.domain; -import nextstep.blackjack.domain.Card; -import nextstep.blackjack.domain.CardNumber; -import nextstep.blackjack.domain.CardType; +import nextstep.blackjack.blackjack.domain.Card; +import nextstep.blackjack.blackjack.domain.CardNumber; +import nextstep.blackjack.blackjack.domain.CardType; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java new file mode 100644 index 00000000..988b409a --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java @@ -0,0 +1,45 @@ +package nextstep.blackjack.blackjack.domain; + +import nextstep.blackjack.blackjack.domain.Card; +import nextstep.blackjack.blackjack.domain.CardNumber; +import nextstep.blackjack.blackjack.domain.CardType; +import nextstep.blackjack.blackjack.domain.OneCards; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +class OneCardsTest { + private static final Card 첫_번째_카드 = new Card(CardType.CLOVER, CardNumber.ONE); + private static final Card 두_번째_카드 = new Card(CardType.CLOVER, CardNumber.TWO); + private static final Card 세_번째_카드 = new Card(CardType.CLOVER, CardNumber.THREE); + private static final Card 네_번쨰_카드 = new Card(CardType.CLOVER, CardNumber.FOUR); + private static final List CARD_LIST = Arrays.asList(첫_번째_카드, 두_번째_카드, 세_번째_카드, 네_번쨰_카드); + private final OneCards oneCards = new OneCards(new LinkedList<>(CARD_LIST)); + + @Test + @DisplayName("카드덱에서 카드를 뽑으면 카드덱에서 한 장 사라진다.") + void getCard() { + // given + int 카드덱_사이즈 = oneCards.getCardList().size(); + + // when + oneCards.pollCard(); + + // then + Assertions.assertThat(oneCards.getCardList().size()).isEqualTo(카드덱_사이즈 - 1); + } + + @Test + @DisplayName("카드덱은 추가된 순서대로 받을 수 있다.") + void getFirstCard() { + // when + Card card = oneCards.pollCard(); + + // then + Assertions.assertThat(card).isEqualTo(첫_번째_카드); + } +} diff --git a/src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java b/src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java new file mode 100644 index 00000000..5e8d7c42 --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java @@ -0,0 +1,17 @@ +package nextstep.blackjack.blackjack.utils; + +import nextstep.blackjack.blackjack.domain.OneCards; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class OneCardsGeneratorTest { + private static final int ONE_CARDS_SIZE = 52; + + @Test + @DisplayName("카드덱에는 52 종류의 카드가 저장되어 있다.") + void getOneCardsSize() { + OneCards oneCards = OneCardsGenerator.generateOneCards(); + Assertions.assertThat(oneCards.getCardList()).hasSize(ONE_CARDS_SIZE); + } +} From 16ddf56946d755943a5f9906735f2c1d5c07b6c4 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Wed, 31 Aug 2022 20:50:21 +0900 Subject: [PATCH 17/37] =?UTF-8?q?Feat=20:=20=EC=B0=B8=EA=B0=80=EC=9E=90=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/domain/Cards.java | 12 +++++ .../blackjack/domain/Participant.java | 35 +++++++++++++++ .../blackjack/domain/ParticipantsTest.java | 44 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/main/java/nextstep/blackjack/blackjack/domain/Cards.java create mode 100644 src/main/java/nextstep/blackjack/blackjack/domain/Participant.java create mode 100644 src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java b/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java new file mode 100644 index 00000000..3d7468ba --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java @@ -0,0 +1,12 @@ +package nextstep.blackjack.blackjack.domain; + +import java.util.Arrays; +import java.util.List; + +public class Cards { + private final List card; + + public Cards(Card one, Card two) { + this.card = Arrays.asList(one, two); + } +} diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java b/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java new file mode 100644 index 00000000..d47de72d --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java @@ -0,0 +1,35 @@ +package nextstep.blackjack.blackjack.domain; + +import java.math.BigDecimal; + +public class Participant { + private final String username; + private final BigDecimal bettingMoney; + private final Cards cards; + + public Participant(String username, BigDecimal bettingMoney, Cards cards) { + if (username == null || username.trim().isEmpty()) { + throw new IllegalArgumentException(); + } + + if (bettingMoney.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException(); + } + + this.username = username; + this.bettingMoney = bettingMoney; + this.cards = cards; + } + + public String getUsername() { + return username; + } + + public BigDecimal getBettingMoney() { + return bettingMoney; + } + + public Cards getCards() { + return cards; + } +} diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java new file mode 100644 index 00000000..a39180a6 --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java @@ -0,0 +1,44 @@ +package nextstep.blackjack.blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.math.BigDecimal; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class ParticipantsTest { + private static final String USERNAME = "tis"; + private static final BigDecimal BETTING_MONEY = BigDecimal.valueOf(1000L); + private static final Card one = new Card(CardType.CLOVER, CardNumber.FOUR); + private static final Card two = new Card(CardType.CLOVER, CardNumber.JACK); + private static final Cards CARDS = new Cards(one, two); + + @Test + @DisplayName("참여자는 이름과 배팀 금액, 카드 패를 가집니다.") + void participant_create() { + assertDoesNotThrow( + () -> new Participant(USERNAME, BETTING_MONEY, CARDS) + ); + } + + @ParameterizedTest + @NullAndEmptySource + void participant_username_is_not_blank(String username) { + assertThatThrownBy( + () -> new Participant(username, BETTING_MONEY, CARDS) + ).isInstanceOf(IllegalArgumentException.class); + } + + @ParameterizedTest + @ValueSource(ints = {-1, -1000}) + void participant_battingMoney_is_not_minus(int money) { + assertThatThrownBy( + () -> new Participant(USERNAME, BigDecimal.valueOf(money), CARDS) + ).isInstanceOf(IllegalArgumentException.class); + } +} From ab459123d61bb7ba4ff6feffc27c3b70862626f6 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 00:30:45 +0900 Subject: [PATCH 18/37] =?UTF-8?q?Feat=20:=20Cards=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../blackjack/blackjack/domain/Card.java | 4 ++ .../blackjack/domain/CardNumber.java | 36 +++++++----- .../blackjack/blackjack/domain/Cards.java | 36 +++++++++++- .../blackjack/blackjack/domain/CardsTest.java | 58 +++++++++++++++++++ .../blackjack/domain/OneCardsTest.java | 6 +- 6 files changed, 119 insertions(+), 23 deletions(-) create mode 100644 src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java diff --git a/README.md b/README.md index 42726e9c..fd38c532 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ - 행위 - 카드패의 숫자 합을 출력한다. - Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다. - - 카드패를 보여준다. + - 카드패와 숫자 합을 출력준다. ### 카드(Card) - 상태 diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java b/src/main/java/nextstep/blackjack/blackjack/domain/Card.java index f4fe9f66..3e09bed4 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Card.java @@ -11,6 +11,10 @@ public Card(CardType cardType, CardNumber cardNumber) { this.cardNumber = cardNumber; } + public CardNumber getCardNumber() { + return cardNumber; + } + public String name() { return cardNumber.getNumber() + cardType.getType(); } diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java b/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java index cdb63bf5..c456ef82 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java @@ -1,31 +1,37 @@ package nextstep.blackjack.blackjack.domain; public enum CardNumber { - ONE("A"), - TWO("2"), - THREE("3"), - FOUR("4"), - FIVE("5"), - SIX("6"), - SEVEN("7"), - EIGHT("8"), - NINE("9"), - TEN("10"), - KING("K"), - QUEEN("Q"), - JACK("J"); + ACE("A", 1), + TWO("2", 2), + THREE("3", 3), + FOUR("4", 4), + FIVE("5", 5), + SIX("6", 6), + SEVEN("7", 7), + EIGHT("8", 8), + NINE("9", 9), + TEN("10", 10), + KING("K", 10), + QUEEN("Q", 10), + JACK("J", 10); private final String cardNumber; + private final int score; - CardNumber(String cardNumber) { + CardNumber(String cardNumber, int score) { this.cardNumber = cardNumber; + this.score = score; } String getNumber() { return cardNumber; } + int score() { + return score; + } + @Override public String toString() { - return cardNumber; + return cardNumber; } } diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java b/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java index 3d7468ba..8a6ede0a 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java @@ -1,12 +1,44 @@ package nextstep.blackjack.blackjack.domain; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; public class Cards { - private final List card; + private final List cards; + + public Cards(List cards) { + this.cards = cards; + } public Cards(Card one, Card two) { - this.card = Arrays.asList(one, two); + this.cards = Arrays.asList(one, two); + } + + public List getCards() { + return new ArrayList<>(cards); + } + + public int sumAll() { + final int aceCount = (int) getCards().stream().filter(card -> card.getCardNumber().equals(CardNumber.ACE)).count(); + final int value = getCards().stream().filter(card -> !card.getCardNumber().equals(CardNumber.ACE)) + .mapToInt(card -> card.getCardNumber().score()) + .sum(); + + if (aceCount > 0 && value + aceCount <= 11) { + return value + aceCount + 10; + } + + return value + aceCount; + } + + public Cards putCard(Card card) { + List cards = getCards(); + cards.add( + Optional.ofNullable(card) + .orElseThrow(() -> new IllegalArgumentException("Card는 Null일 수 없습니다.")) + ); + return new Cards(cards); } } diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java new file mode 100644 index 00000000..883b22be --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java @@ -0,0 +1,58 @@ +package nextstep.blackjack.blackjack.domain; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class CardsTest { + private static final Card CLOVER_FOUR = new Card(CardType.CLOVER, CardNumber.FOUR); + private static final Card CLOVER_ACE = new Card(CardType.CLOVER, CardNumber.ACE); + private static final Card HEART_ACE = new Card(CardType.HEART, CardNumber.ACE); + private static final Card CLOVER_THREE = new Card(CardType.CLOVER, CardNumber.THREE); + private static final Card CLOVER_JACK = new Card(CardType.CLOVER, CardNumber.JACK); + private static final int SEVEN = 7; + private static final int TWELVE = 12; + + @Test + @DisplayName("카드 패는 최소 두 장이 들어간다.") + void cards_atLeast_two() { + assertDoesNotThrow( + () -> new Cards(CLOVER_FOUR, CLOVER_THREE) + ); + } + + @Test + @DisplayName("카드패의 숫자 합을 출력한다.") + void sumCards() { + Cards cards = new Cards(CLOVER_FOUR, CLOVER_THREE); + assertThat(cards.sumAll()).isEqualTo(SEVEN); + } + + @Test + @DisplayName("Ace가 두장이면 12이다.") + void sumCards_ace_and_ace() { + Cards cards = new Cards(CLOVER_ACE, HEART_ACE); + assertThat(cards.sumAll()).isEqualTo(TWELVE); + } + + @Test + @DisplayName("에이스와 잭이면 합이 21이다.") + void sumCards_ace_and_jack() { + Cards cards = new Cards(CLOVER_ACE, CLOVER_JACK); + assertThat(cards.sumAll()).isEqualTo(21); + } + + @Test + @DisplayName("에이스가 두 장이고 잭이 한 장이면 12이다.") + void sumCards_ace_and_ace_and_jack() { + Cards cards = new Cards(CLOVER_ACE, CLOVER_JACK); + + Cards newCards = cards.putCard(HEART_ACE); + + assertThat(newCards.sumAll()).isEqualTo(12); + } + + +} diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java index 988b409a..65763c62 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java @@ -1,9 +1,5 @@ package nextstep.blackjack.blackjack.domain; -import nextstep.blackjack.blackjack.domain.Card; -import nextstep.blackjack.blackjack.domain.CardNumber; -import nextstep.blackjack.blackjack.domain.CardType; -import nextstep.blackjack.blackjack.domain.OneCards; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,7 +9,7 @@ import java.util.List; class OneCardsTest { - private static final Card 첫_번째_카드 = new Card(CardType.CLOVER, CardNumber.ONE); + private static final Card 첫_번째_카드 = new Card(CardType.CLOVER, CardNumber.ACE); private static final Card 두_번째_카드 = new Card(CardType.CLOVER, CardNumber.TWO); private static final Card 세_번째_카드 = new Card(CardType.CLOVER, CardNumber.THREE); private static final Card 네_번쨰_카드 = new Card(CardType.CLOVER, CardNumber.FOUR); From 078122a19b7a115f9c3a1fdb4d78250373a7e955 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 00:32:03 +0900 Subject: [PATCH 19/37] =?UTF-8?q?Refact=20:=20Cards=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/domain/Card.java | 4 +-- .../blackjack/domain/CardNumber.java | 6 +++- .../blackjack/blackjack/domain/Cards.java | 36 ++++++++++--------- .../blackjack/blackjack/domain/CardTest.java | 11 +++--- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java b/src/main/java/nextstep/blackjack/blackjack/domain/Card.java index 3e09bed4..fd20b73b 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Card.java @@ -16,12 +16,12 @@ public CardNumber getCardNumber() { } public String name() { - return cardNumber.getNumber() + cardType.getType(); + return cardNumber.number() + cardType.getType(); } @Override public String toString() { - return cardNumber.getNumber() + cardType.getType(); + return cardNumber.number() + cardType.getType(); } @Override diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java b/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java index c456ef82..62581307 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java @@ -22,7 +22,7 @@ public enum CardNumber { this.score = score; } - String getNumber() { + String number() { return cardNumber; } @@ -30,6 +30,10 @@ int score() { return score; } + boolean isAce() { + return this.equals(CardNumber.ACE); + } + @Override public String toString() { return cardNumber; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java b/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java index 8a6ede0a..7bdfee39 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java @@ -8,37 +8,41 @@ public class Cards { private final List cards; - public Cards(List cards) { - this.cards = cards; + public Cards(final Card one, final Card two) { + this.cards = Arrays.asList(getCard(one), getCard(two)); } - public Cards(Card one, Card two) { - this.cards = Arrays.asList(one, two); + private Cards(final List cards) { + this.cards = cards; } - public List getCards() { + private List getCards() { return new ArrayList<>(cards); } public int sumAll() { - final int aceCount = (int) getCards().stream().filter(card -> card.getCardNumber().equals(CardNumber.ACE)).count(); - final int value = getCards().stream().filter(card -> !card.getCardNumber().equals(CardNumber.ACE)) + final int aceCount = (int) getCards().stream() + .filter(card -> card.getCardNumber().isAce()) + .count(); + + final int value = getCards().stream() .mapToInt(card -> card.getCardNumber().score()) .sum(); - if (aceCount > 0 && value + aceCount <= 11) { - return value + aceCount + 10; + if (aceCount > 0 && value <= 11) { + return value + 10; } - - return value + aceCount; + return value; } - public Cards putCard(Card card) { + public Cards putCard(final Card card) { List cards = getCards(); - cards.add( - Optional.ofNullable(card) - .orElseThrow(() -> new IllegalArgumentException("Card는 Null일 수 없습니다.")) - ); + cards.add(getCard(card)); return new Cards(cards); } + + private Card getCard(Card card) { + return Optional.ofNullable(card) + .orElseThrow(() -> new IllegalArgumentException("Card는 Null일 수 없습니다.")); + } } diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java index f6065dbc..56598b55 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java @@ -1,18 +1,17 @@ package nextstep.blackjack.blackjack.domain; -import nextstep.blackjack.blackjack.domain.Card; -import nextstep.blackjack.blackjack.domain.CardNumber; -import nextstep.blackjack.blackjack.domain.CardType; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + class CardTest { @Test @DisplayName("카드는 숫자와 타입을 가진다.") void card_create() { - Assertions.assertDoesNotThrow( + assertDoesNotThrow( () -> new Card(CardType.CLOVER, CardNumber.FOUR) ); } @@ -24,6 +23,6 @@ void card_getName() { CardNumber four = CardNumber.FOUR; Card clover_four = new Card(clover, four); - org.assertj.core.api.Assertions.assertThat(clover_four.name()).isEqualTo(four.getNumber() + clover.getType()); + assertThat(clover_four.name()).isEqualTo(four.number() + clover.getType()); } } From 1d26d8f527ebce76e9c9408cbb69bafba756c235 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 16:16:40 +0900 Subject: [PATCH 20/37] =?UTF-8?q?Feat=20:=20=EB=94=9C=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/domain/Dealer.java | 24 +++++++++++++ .../blackjack/domain/DealerTest.java | 36 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java create mode 100644 src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java b/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java new file mode 100644 index 00000000..649af182 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java @@ -0,0 +1,24 @@ +package nextstep.blackjack.blackjack.domain; + +public class Dealer { + private static final int CRITERION = 16; + private final Cards cards; + + public Dealer(OneCards oneCards) { + Cards cards = new Cards(oneCards.pollCard(), oneCards.pollCard()); + + while (condition(cards)) { + cards = cards.putCard(oneCards.pollCard()); + } + + this.cards = cards; + } + + private boolean condition(Cards cards) { + return cards.sumAll() <= CRITERION; + } + + public Cards getCards() { + return cards; + } +} diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java new file mode 100644 index 00000000..4f07c9bc --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java @@ -0,0 +1,36 @@ +package nextstep.blackjack.blackjack.domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.LinkedList; + +import static nextstep.blackjack.blackjack.fixture.OneCardFixture.CARD_LIST; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class DealerTest { + + OneCards 카드덱; + + @BeforeEach + void setUp() { + 카드덱 = new OneCards(new LinkedList<>(CARD_LIST)); + } + + @Test + @DisplayName("딜러는 카드를 받습니다.") + void dealer_create() { + assertDoesNotThrow( + () -> new Dealer(카드덱) + ); + } + + @Test + @DisplayName("딜러의 카드가 16이하면 카드를 추가로 받습니다.") + void dealer_create_add_cards() { + Dealer dealer = new Dealer(카드덱); + assertThat(dealer.getCards().sumAll()).isGreaterThan(16); + } +} From a4e2280eee6783af0e9a827ed37c8e4827c30e20 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 16:55:55 +0900 Subject: [PATCH 21/37] =?UTF-8?q?Refact=20:=20OneCards=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/OneCardsTest.java | 27 ++++++++++--------- .../blackjack/fixture/OneCardFixture.java | 21 +++++++++++++++ 2 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java index 65763c62..f5eb4775 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java @@ -1,39 +1,42 @@ package nextstep.blackjack.blackjack.domain; import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.Arrays; import java.util.LinkedList; -import java.util.List; + +import static nextstep.blackjack.blackjack.fixture.OneCardFixture.CARD_LIST; +import static nextstep.blackjack.blackjack.fixture.OneCardFixture.첫_번째_카드; class OneCardsTest { - private static final Card 첫_번째_카드 = new Card(CardType.CLOVER, CardNumber.ACE); - private static final Card 두_번째_카드 = new Card(CardType.CLOVER, CardNumber.TWO); - private static final Card 세_번째_카드 = new Card(CardType.CLOVER, CardNumber.THREE); - private static final Card 네_번쨰_카드 = new Card(CardType.CLOVER, CardNumber.FOUR); - private static final List CARD_LIST = Arrays.asList(첫_번째_카드, 두_번째_카드, 세_번째_카드, 네_번쨰_카드); - private final OneCards oneCards = new OneCards(new LinkedList<>(CARD_LIST)); + + OneCards 카드덱; + + @BeforeEach + void setUp() { + 카드덱 = new OneCards(new LinkedList<>(CARD_LIST)); + } @Test @DisplayName("카드덱에서 카드를 뽑으면 카드덱에서 한 장 사라진다.") void getCard() { // given - int 카드덱_사이즈 = oneCards.getCardList().size(); + int 카드덱_사이즈 = 카드덱.getCardList().size(); // when - oneCards.pollCard(); + 카드덱.pollCard(); // then - Assertions.assertThat(oneCards.getCardList().size()).isEqualTo(카드덱_사이즈 - 1); + Assertions.assertThat(카드덱.getCardList().size()).isEqualTo(카드덱_사이즈 - 1); } @Test @DisplayName("카드덱은 추가된 순서대로 받을 수 있다.") void getFirstCard() { // when - Card card = oneCards.pollCard(); + Card card = 카드덱.pollCard(); // then Assertions.assertThat(card).isEqualTo(첫_번째_카드); diff --git a/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java b/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java new file mode 100644 index 00000000..624c1869 --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java @@ -0,0 +1,21 @@ +package nextstep.blackjack.blackjack.fixture; + +import nextstep.blackjack.blackjack.domain.Card; +import nextstep.blackjack.blackjack.domain.CardNumber; +import nextstep.blackjack.blackjack.domain.CardType; +import nextstep.blackjack.blackjack.domain.OneCards; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +public class OneCardFixture { + public static final Card 첫_번째_카드 = new Card(CardType.CLOVER, CardNumber.ACE); + public static final Card 두_번째_카드 = new Card(CardType.CLOVER, CardNumber.TWO); + public static final Card 세_번째_카드 = new Card(CardType.CLOVER, CardNumber.THREE); + public static final Card 네_번쨰_카드 = new Card(CardType.CLOVER, CardNumber.FOUR); + private static final Card 다섯_번째_카드 = new Card(CardType.CLOVER, CardNumber.JACK); + private static final Card 여섯_번째_카드 = new Card(CardType.HEART, CardNumber.JACK); + public static final List CARD_LIST = Arrays.asList(첫_번째_카드, 두_번째_카드, 세_번째_카드, 네_번쨰_카드, 다섯_번째_카드, 여섯_번째_카드); + +} From eca06c89a554cc762036f664baaf34975761edf0 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 16:56:29 +0900 Subject: [PATCH 22/37] =?UTF-8?q?Refact=20:=20ParticipantsTest=20->=20Part?= =?UTF-8?q?icipantTest=20=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/{ParticipantsTest.java => ParticipantTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/java/nextstep/blackjack/blackjack/domain/{ParticipantsTest.java => ParticipantTest.java} (98%) diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java similarity index 98% rename from src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java rename to src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java index a39180a6..acf5c9be 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -class ParticipantsTest { +class ParticipantTest { private static final String USERNAME = "tis"; private static final BigDecimal BETTING_MONEY = BigDecimal.valueOf(1000L); private static final Card one = new Card(CardType.CLOVER, CardNumber.FOUR); From 2b39e030deb620f61869b950a16cef410217a6db Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 17:07:31 +0900 Subject: [PATCH 23/37] =?UTF-8?q?Feat=20:=20Participants=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/domain/Participants.java | 21 +++++++ .../blackjack/domain/ParticipantsTest.java | 60 +++++++++++++++++++ .../blackjack/fixture/OneCardFixture.java | 8 ++- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 src/main/java/nextstep/blackjack/blackjack/domain/Participants.java create mode 100644 src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java b/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java new file mode 100644 index 00000000..c72197a8 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java @@ -0,0 +1,21 @@ +package nextstep.blackjack.blackjack.domain; + +import java.util.ArrayList; +import java.util.List; + +public class Participants { + + private final List participants; + + public Participants(List participants) { + this.participants = participants; + } + + public List getParticipants() { + return new ArrayList<>(participants); + } + + public void distribute(OneCards oneCards) { + participants.forEach(participant -> participant.getCards().putCard(oneCards.pollCard())); + } +} diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java new file mode 100644 index 00000000..7b8651f6 --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java @@ -0,0 +1,60 @@ +package nextstep.blackjack.blackjack.domain; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.LinkedList; + +import static nextstep.blackjack.blackjack.fixture.OneCardFixture.CARD_LIST; +import static org.assertj.core.api.Assertions.assertThat; + +class ParticipantsTest { + + OneCards 카드덱; + + + @BeforeEach + void setUp() { + 카드덱 = new OneCards(new LinkedList<>(CARD_LIST)); + } + + private Cards getCards() { + return new Cards(카드덱.pollCard(), 카드덱.pollCard()); + } + + @Test + @DisplayName("게임에 참여자들이 입장한다.") + void participants_create() { + Assertions.assertDoesNotThrow( + () -> new Participants(Arrays.asList( + new Participant("tis", BigDecimal.TEN, getCards()), + new Participant("me", BigDecimal.valueOf(20_000), getCards()), + new Participant("yolo", BigDecimal.valueOf(30_000_000), getCards()) + ) + ) + ); + } + + @Test + @DisplayName("참여자들에게 카드를 분배한다.") + void participants_distribute() { + // given + int size = 카드덱.getCardList().size(); + + Participants participants = new Participants(Arrays.asList( + new Participant("tis", BigDecimal.TEN, getCards()), + new Participant("me", BigDecimal.valueOf(20_000), getCards()), + new Participant("yolo", BigDecimal.valueOf(30_000_000), getCards()) + )); + + // when + participants.distribute(카드덱); + + // then + assertThat(카드덱.getCardList()).hasSize(size - 9); + } +} diff --git a/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java b/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java index 624c1869..c1d856f8 100644 --- a/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java +++ b/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java @@ -3,10 +3,8 @@ import nextstep.blackjack.blackjack.domain.Card; import nextstep.blackjack.blackjack.domain.CardNumber; import nextstep.blackjack.blackjack.domain.CardType; -import nextstep.blackjack.blackjack.domain.OneCards; import java.util.Arrays; -import java.util.LinkedList; import java.util.List; public class OneCardFixture { @@ -16,6 +14,10 @@ public class OneCardFixture { public static final Card 네_번쨰_카드 = new Card(CardType.CLOVER, CardNumber.FOUR); private static final Card 다섯_번째_카드 = new Card(CardType.CLOVER, CardNumber.JACK); private static final Card 여섯_번째_카드 = new Card(CardType.HEART, CardNumber.JACK); - public static final List CARD_LIST = Arrays.asList(첫_번째_카드, 두_번째_카드, 세_번째_카드, 네_번쨰_카드, 다섯_번째_카드, 여섯_번째_카드); + private static final Card 일곱_번째_카드 = new Card(CardType.HEART, CardNumber.ACE); + private static final Card 여덟_번째_카드 = new Card(CardType.DIAMOND, CardNumber.ACE); + private static final Card 아홉_번째_카드 = new Card(CardType.SPADE, CardNumber.ACE); + public static final List CARD_LIST = Arrays.asList(첫_번째_카드, 두_번째_카드, 세_번째_카드, 네_번쨰_카드, 다섯_번째_카드, + 여섯_번째_카드, 일곱_번째_카드, 여덟_번째_카드, 아홉_번째_카드); } From 656e0324aac66bf185ccecefa3dc18a1e84d0c5a Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 17:16:10 +0900 Subject: [PATCH 24/37] =?UTF-8?q?Refact=20:=20=EC=B9=B4=EB=93=9C=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=91=EC=A7=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/blackjack/blackjack/domain/Dealer.java | 3 +++ .../blackjack/blackjack/domain/Participant.java | 2 ++ .../blackjack/blackjack/domain/Participants.java | 2 ++ .../blackjack/blackjack/{domain => onecards}/Card.java | 2 +- .../blackjack/{domain => onecards}/CardNumber.java | 2 +- .../blackjack/{domain => onecards}/CardType.java | 2 +- .../blackjack/{domain => onecards}/Cards.java | 2 +- .../blackjack/{domain => onecards}/OneCards.java | 2 +- .../{utils => onecards}/OneCardsGenerator.java | 7 +------ .../blackjack/blackjack/domain/DealerTest.java | 1 + .../blackjack/blackjack/domain/ParticipantTest.java | 4 ++++ .../blackjack/blackjack/domain/ParticipantsTest.java | 2 ++ .../blackjack/blackjack/fixture/OneCardFixture.java | 6 +++--- .../blackjack/{domain => onecards}/CardTest.java | 5 ++++- .../blackjack/{domain => onecards}/CardsTest.java | 10 +++++++++- .../{utils => onecards}/OneCardsGeneratorTest.java | 3 +-- .../blackjack/{domain => onecards}/OneCardsTest.java | 2 +- 17 files changed, 38 insertions(+), 19 deletions(-) rename src/main/java/nextstep/blackjack/blackjack/{domain => onecards}/Card.java (95%) rename src/main/java/nextstep/blackjack/blackjack/{domain => onecards}/CardNumber.java (93%) rename src/main/java/nextstep/blackjack/blackjack/{domain => onecards}/CardType.java (88%) rename src/main/java/nextstep/blackjack/blackjack/{domain => onecards}/Cards.java (96%) rename src/main/java/nextstep/blackjack/blackjack/{domain => onecards}/OneCards.java (88%) rename src/main/java/nextstep/blackjack/blackjack/{utils => onecards}/OneCardsGenerator.java (75%) rename src/test/java/nextstep/blackjack/blackjack/{domain => onecards}/CardTest.java (78%) rename src/test/java/nextstep/blackjack/blackjack/{domain => onecards}/CardsTest.java (82%) rename src/test/java/nextstep/blackjack/blackjack/{utils => onecards}/OneCardsGeneratorTest.java (82%) rename src/test/java/nextstep/blackjack/blackjack/{domain => onecards}/OneCardsTest.java (96%) diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java b/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java index 649af182..3c040101 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java @@ -1,5 +1,8 @@ package nextstep.blackjack.blackjack.domain; +import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.onecards.OneCards; + public class Dealer { private static final int CRITERION = 16; private final Cards cards; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java b/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java index d47de72d..36ff9bb6 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java @@ -1,5 +1,7 @@ package nextstep.blackjack.blackjack.domain; +import nextstep.blackjack.blackjack.onecards.Cards; + import java.math.BigDecimal; public class Participant { diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java b/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java index c72197a8..31115f74 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java +++ b/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java @@ -1,5 +1,7 @@ package nextstep.blackjack.blackjack.domain; +import nextstep.blackjack.blackjack.onecards.OneCards; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java b/src/main/java/nextstep/blackjack/blackjack/onecards/Card.java similarity index 95% rename from src/main/java/nextstep/blackjack/blackjack/domain/Card.java rename to src/main/java/nextstep/blackjack/blackjack/onecards/Card.java index fd20b73b..de63ea16 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Card.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/Card.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; import java.util.Objects; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java b/src/main/java/nextstep/blackjack/blackjack/onecards/CardNumber.java similarity index 93% rename from src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java rename to src/main/java/nextstep/blackjack/blackjack/onecards/CardNumber.java index 62581307..f0bf49ec 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/CardNumber.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/CardNumber.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; public enum CardNumber { ACE("A", 1), diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/CardType.java b/src/main/java/nextstep/blackjack/blackjack/onecards/CardType.java similarity index 88% rename from src/main/java/nextstep/blackjack/blackjack/domain/CardType.java rename to src/main/java/nextstep/blackjack/blackjack/onecards/CardType.java index 42a987e8..5b0db6f4 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/CardType.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/CardType.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; public enum CardType { HEART("하트"), diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java similarity index 96% rename from src/main/java/nextstep/blackjack/blackjack/domain/Cards.java rename to src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java index 7bdfee39..4d1a19c1 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Cards.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java b/src/main/java/nextstep/blackjack/blackjack/onecards/OneCards.java similarity index 88% rename from src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java rename to src/main/java/nextstep/blackjack/blackjack/onecards/OneCards.java index 49c66924..54e7446b 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/OneCards.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/OneCards.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; import java.util.LinkedList; diff --git a/src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java b/src/main/java/nextstep/blackjack/blackjack/onecards/OneCardsGenerator.java similarity index 75% rename from src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java rename to src/main/java/nextstep/blackjack/blackjack/onecards/OneCardsGenerator.java index b57d108e..d07e8040 100644 --- a/src/main/java/nextstep/blackjack/blackjack/utils/OneCardsGenerator.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/OneCardsGenerator.java @@ -1,9 +1,4 @@ -package nextstep.blackjack.blackjack.utils; - -import nextstep.blackjack.blackjack.domain.Card; -import nextstep.blackjack.blackjack.domain.CardNumber; -import nextstep.blackjack.blackjack.domain.CardType; -import nextstep.blackjack.blackjack.domain.OneCards; +package nextstep.blackjack.blackjack.onecards; import java.util.Arrays; import java.util.Collections; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java index 4f07c9bc..814bb38f 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java @@ -1,5 +1,6 @@ package nextstep.blackjack.blackjack.domain; +import nextstep.blackjack.blackjack.onecards.OneCards; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java index acf5c9be..b8445dc2 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java @@ -1,5 +1,9 @@ package nextstep.blackjack.blackjack.domain; +import nextstep.blackjack.blackjack.onecards.Card; +import nextstep.blackjack.blackjack.onecards.CardNumber; +import nextstep.blackjack.blackjack.onecards.CardType; +import nextstep.blackjack.blackjack.onecards.Cards; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java index 7b8651f6..dbca82ad 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java @@ -1,5 +1,7 @@ package nextstep.blackjack.blackjack.domain; +import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.onecards.OneCards; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java b/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java index c1d856f8..08888b40 100644 --- a/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java +++ b/src/test/java/nextstep/blackjack/blackjack/fixture/OneCardFixture.java @@ -1,8 +1,8 @@ package nextstep.blackjack.blackjack.fixture; -import nextstep.blackjack.blackjack.domain.Card; -import nextstep.blackjack.blackjack.domain.CardNumber; -import nextstep.blackjack.blackjack.domain.CardType; +import nextstep.blackjack.blackjack.onecards.Card; +import nextstep.blackjack.blackjack.onecards.CardNumber; +import nextstep.blackjack.blackjack.onecards.CardType; import java.util.Arrays; import java.util.List; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java b/src/test/java/nextstep/blackjack/blackjack/onecards/CardTest.java similarity index 78% rename from src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java rename to src/test/java/nextstep/blackjack/blackjack/onecards/CardTest.java index 56598b55..86d4ccab 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/CardTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/onecards/CardTest.java @@ -1,5 +1,8 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; +import nextstep.blackjack.blackjack.onecards.Card; +import nextstep.blackjack.blackjack.onecards.CardNumber; +import nextstep.blackjack.blackjack.onecards.CardType; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java b/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java similarity index 82% rename from src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java rename to src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java index 883b22be..e18d34b8 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/CardsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java @@ -1,5 +1,9 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; +import nextstep.blackjack.blackjack.onecards.Card; +import nextstep.blackjack.blackjack.onecards.CardNumber; +import nextstep.blackjack.blackjack.onecards.CardType; +import nextstep.blackjack.blackjack.onecards.Cards; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -54,5 +58,9 @@ void sumCards_ace_and_ace_and_jack() { assertThat(newCards.sumAll()).isEqualTo(12); } + @Test + @DisplayName("합이 21이 넘으면 더 이상 받을 수 없다.") + void cards_putCard_notSumAllOver21() { + } } diff --git a/src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java b/src/test/java/nextstep/blackjack/blackjack/onecards/OneCardsGeneratorTest.java similarity index 82% rename from src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java rename to src/test/java/nextstep/blackjack/blackjack/onecards/OneCardsGeneratorTest.java index 5e8d7c42..8b797e20 100644 --- a/src/test/java/nextstep/blackjack/blackjack/utils/OneCardsGeneratorTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/onecards/OneCardsGeneratorTest.java @@ -1,6 +1,5 @@ -package nextstep.blackjack.blackjack.utils; +package nextstep.blackjack.blackjack.onecards; -import nextstep.blackjack.blackjack.domain.OneCards; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java b/src/test/java/nextstep/blackjack/blackjack/onecards/OneCardsTest.java similarity index 96% rename from src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java rename to src/test/java/nextstep/blackjack/blackjack/onecards/OneCardsTest.java index f5eb4775..e7eb0a39 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/OneCardsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/onecards/OneCardsTest.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.onecards; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; From ce9ffa2ac7935b2130a3411cbfa4d095c3b07174 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 17:17:45 +0900 Subject: [PATCH 25/37] =?UTF-8?q?Refact=20:=20=EC=B0=B8=EC=97=AC=EC=9E=90?= =?UTF-8?q?=EC=99=80=20=EB=94=9C=EB=9F=AC=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/BlackjackGame.java | 62 +++++++++++++++++++ .../blackjack/{domain => member}/Dealer.java | 2 +- .../{domain => member}/Participant.java | 2 +- .../{domain => member}/Participants.java | 2 +- .../{domain => member}/DealerTest.java | 2 +- .../{domain => member}/ParticipantTest.java | 2 +- .../{domain => member}/ParticipantsTest.java | 2 +- 7 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java rename src/main/java/nextstep/blackjack/blackjack/{domain => member}/Dealer.java (93%) rename src/main/java/nextstep/blackjack/blackjack/{domain => member}/Participant.java (95%) rename src/main/java/nextstep/blackjack/blackjack/{domain => member}/Participants.java (92%) rename src/test/java/nextstep/blackjack/blackjack/{domain => member}/DealerTest.java (95%) rename src/test/java/nextstep/blackjack/blackjack/{domain => member}/ParticipantTest.java (97%) rename src/test/java/nextstep/blackjack/blackjack/{domain => member}/ParticipantsTest.java (97%) diff --git a/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java b/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java new file mode 100644 index 00000000..f606c6af --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java @@ -0,0 +1,62 @@ +package nextstep.blackjack.blackjack; + +import nextstep.blackjack.blackjack.member.Dealer; +import nextstep.blackjack.blackjack.member.Participant; +import nextstep.blackjack.blackjack.member.Participants; +import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.onecards.OneCards; +import nextstep.blackjack.blackjack.utils.IOService; +import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.stream.Collectors; + +public class BlackjackGame { + private final IOService ioService; + + public BlackjackGame(IOService ioService) { + this.ioService = ioService; + } + + public void start() { + OneCards oneCards = OneCardsGenerator.generateOneCards(); + + Participants participants = enter(oneCards); + + Dealer dealer = new Dealer(oneCards); + + participants.distribute(oneCards); + + weatherToAcceptCard(participants, oneCards); + + getResult(dealer, participants); + } + + private Participants enter(OneCards oneCards) { + Map participantNameAndBatting = ioService.inputParticipantNameAndBattingMoney(); + return new Participants( + participantNameAndBatting.entrySet().stream() + .map(entry -> getParticipant(oneCards, entry.getKey(), entry.getValue())) + .collect(Collectors.toList()) + ); + } + + private void getResult(Dealer dealer, Participants participants) { + } + + private void weatherToAcceptCard(Participants participants, OneCards oneCards) { + participants.getParticipants().stream() + .filter(participant -> participant.getCards().sumAll() < 21) + .forEach(participant -> { + while (ioService.weatherToAcceptCard(participant.getUsername())) { + participant.getCards().putCard(oneCards.pollCard()); + } + }); + } + + private Participant getParticipant(OneCards oneCards, String username, BigDecimal battingMoney) { + return new Participant(username, battingMoney, new Cards(oneCards.pollCard(), oneCards.pollCard())); + } + +} diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java similarity index 93% rename from src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java rename to src/main/java/nextstep/blackjack/blackjack/member/Dealer.java index 3c040101..219be348 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Dealer.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java b/src/main/java/nextstep/blackjack/blackjack/member/Participant.java similarity index 95% rename from src/main/java/nextstep/blackjack/blackjack/domain/Participant.java rename to src/main/java/nextstep/blackjack/blackjack/member/Participant.java index 36ff9bb6..8e939919 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Participant.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Participant.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.Cards; diff --git a/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java b/src/main/java/nextstep/blackjack/blackjack/member/Participants.java similarity index 92% rename from src/main/java/nextstep/blackjack/blackjack/domain/Participants.java rename to src/main/java/nextstep/blackjack/blackjack/member/Participants.java index 31115f74..c64324bb 100644 --- a/src/main/java/nextstep/blackjack/blackjack/domain/Participants.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Participants.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.OneCards; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java b/src/test/java/nextstep/blackjack/blackjack/member/DealerTest.java similarity index 95% rename from src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java rename to src/test/java/nextstep/blackjack/blackjack/member/DealerTest.java index 814bb38f..b583cadb 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/DealerTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/member/DealerTest.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.OneCards; import org.junit.jupiter.api.BeforeEach; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java similarity index 97% rename from src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java rename to src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java index b8445dc2..ca4c74d8 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.Card; import nextstep.blackjack.blackjack.onecards.CardNumber; diff --git a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java similarity index 97% rename from src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java rename to src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java index dbca82ad..105b5a12 100644 --- a/src/test/java/nextstep/blackjack/blackjack/domain/ParticipantsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java @@ -1,4 +1,4 @@ -package nextstep.blackjack.blackjack.domain; +package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; From b72fba947fc0c4b3f708223397c3e81707e39032 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 17:30:27 +0900 Subject: [PATCH 26/37] =?UTF-8?q?Refact=20:=20Cards=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/BlackjackGame.java | 9 ++++----- .../blackjack/blackjack/member/Dealer.java | 4 +++- .../blackjack/blackjack/member/Participant.java | 5 +++++ .../blackjack/blackjack/onecards/Cards.java | 12 ++++++++---- .../blackjack/member/ParticipantTest.java | 3 ++- .../blackjack/member/ParticipantsTest.java | 16 ++++++---------- .../blackjack/blackjack/onecards/CardsTest.java | 16 +++++++--------- 7 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java b/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java index f606c6af..856779fa 100644 --- a/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java +++ b/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java @@ -3,10 +3,9 @@ import nextstep.blackjack.blackjack.member.Dealer; import nextstep.blackjack.blackjack.member.Participant; import nextstep.blackjack.blackjack.member.Participants; -import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; -import nextstep.blackjack.blackjack.utils.IOService; import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; +import nextstep.blackjack.blackjack.utils.IOService; import java.math.BigDecimal; import java.util.Map; @@ -47,16 +46,16 @@ private void getResult(Dealer dealer, Participants participants) { private void weatherToAcceptCard(Participants participants, OneCards oneCards) { participants.getParticipants().stream() - .filter(participant -> participant.getCards().sumAll() < 21) + .filter(participant -> participant.getCards().isOver21()) .forEach(participant -> { - while (ioService.weatherToAcceptCard(participant.getUsername())) { + while (ioService.weatherToAcceptCard(participant.getUsername()) && participant.getCards().isOver21()) { participant.getCards().putCard(oneCards.pollCard()); } }); } private Participant getParticipant(OneCards oneCards, String username, BigDecimal battingMoney) { - return new Participant(username, battingMoney, new Cards(oneCards.pollCard(), oneCards.pollCard())); + return new Participant(username, battingMoney, oneCards); } } diff --git a/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java index 219be348..56565358 100644 --- a/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java @@ -3,12 +3,14 @@ import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; +import java.util.Arrays; + public class Dealer { private static final int CRITERION = 16; private final Cards cards; public Dealer(OneCards oneCards) { - Cards cards = new Cards(oneCards.pollCard(), oneCards.pollCard()); + Cards cards = new Cards(Arrays.asList(oneCards.pollCard(), oneCards.pollCard())); while (condition(cards)) { cards = cards.putCard(oneCards.pollCard()); diff --git a/src/main/java/nextstep/blackjack/blackjack/member/Participant.java b/src/main/java/nextstep/blackjack/blackjack/member/Participant.java index 8e939919..8bc28363 100644 --- a/src/main/java/nextstep/blackjack/blackjack/member/Participant.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Participant.java @@ -1,6 +1,7 @@ package nextstep.blackjack.blackjack.member; import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.onecards.OneCards; import java.math.BigDecimal; @@ -23,6 +24,10 @@ public Participant(String username, BigDecimal bettingMoney, Cards cards) { this.cards = cards; } + public Participant(String username, BigDecimal bettingMoney, OneCards oneCards) { + this(username, bettingMoney, new Cards(oneCards)); + } + public String getUsername() { return username; } diff --git a/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java index 4d1a19c1..afb91fae 100644 --- a/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java @@ -8,12 +8,12 @@ public class Cards { private final List cards; - public Cards(final Card one, final Card two) { - this.cards = Arrays.asList(getCard(one), getCard(two)); + public Cards(final List cards) { + this.cards = cards; } - private Cards(final List cards) { - this.cards = cards; + public Cards(OneCards oneCards) { + this(Arrays.asList(oneCards.pollCard(), oneCards.pollCard())); } private List getCards() { @@ -45,4 +45,8 @@ private Card getCard(Card card) { return Optional.ofNullable(card) .orElseThrow(() -> new IllegalArgumentException("Card는 Null일 수 없습니다.")); } + + public boolean isOver21() { + return sumAll() < 21; + } } diff --git a/src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java index ca4c74d8..3670b3ae 100644 --- a/src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantTest.java @@ -11,6 +11,7 @@ import org.junit.jupiter.params.provider.ValueSource; import java.math.BigDecimal; +import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -20,7 +21,7 @@ class ParticipantTest { private static final BigDecimal BETTING_MONEY = BigDecimal.valueOf(1000L); private static final Card one = new Card(CardType.CLOVER, CardNumber.FOUR); private static final Card two = new Card(CardType.CLOVER, CardNumber.JACK); - private static final Cards CARDS = new Cards(one, two); + private static final Cards CARDS = new Cards(Arrays.asList(one, two)); @Test @DisplayName("참여자는 이름과 배팀 금액, 카드 패를 가집니다.") diff --git a/src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java index 105b5a12..6584b2de 100644 --- a/src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/member/ParticipantsTest.java @@ -24,18 +24,14 @@ void setUp() { 카드덱 = new OneCards(new LinkedList<>(CARD_LIST)); } - private Cards getCards() { - return new Cards(카드덱.pollCard(), 카드덱.pollCard()); - } - @Test @DisplayName("게임에 참여자들이 입장한다.") void participants_create() { Assertions.assertDoesNotThrow( () -> new Participants(Arrays.asList( - new Participant("tis", BigDecimal.TEN, getCards()), - new Participant("me", BigDecimal.valueOf(20_000), getCards()), - new Participant("yolo", BigDecimal.valueOf(30_000_000), getCards()) + new Participant("tis", BigDecimal.TEN, 카드덱), + new Participant("me", BigDecimal.valueOf(20_000), 카드덱), + new Participant("yolo", BigDecimal.valueOf(30_000_000), 카드덱) ) ) ); @@ -48,9 +44,9 @@ void participants_distribute() { int size = 카드덱.getCardList().size(); Participants participants = new Participants(Arrays.asList( - new Participant("tis", BigDecimal.TEN, getCards()), - new Participant("me", BigDecimal.valueOf(20_000), getCards()), - new Participant("yolo", BigDecimal.valueOf(30_000_000), getCards()) + new Participant("tis", BigDecimal.TEN, 카드덱), + new Participant("me", BigDecimal.valueOf(20_000), 카드덱), + new Participant("yolo", BigDecimal.valueOf(30_000_000), 카드덱) )); // when diff --git a/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java b/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java index e18d34b8..7675feda 100644 --- a/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java @@ -1,12 +1,10 @@ package nextstep.blackjack.blackjack.onecards; -import nextstep.blackjack.blackjack.onecards.Card; -import nextstep.blackjack.blackjack.onecards.CardNumber; -import nextstep.blackjack.blackjack.onecards.CardType; -import nextstep.blackjack.blackjack.onecards.Cards; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.Arrays; + import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; @@ -23,35 +21,35 @@ class CardsTest { @DisplayName("카드 패는 최소 두 장이 들어간다.") void cards_atLeast_two() { assertDoesNotThrow( - () -> new Cards(CLOVER_FOUR, CLOVER_THREE) + () -> new Cards(Arrays.asList(CLOVER_FOUR, CLOVER_THREE)) ); } @Test @DisplayName("카드패의 숫자 합을 출력한다.") void sumCards() { - Cards cards = new Cards(CLOVER_FOUR, CLOVER_THREE); + Cards cards = new Cards(Arrays.asList(CLOVER_FOUR, CLOVER_THREE)); assertThat(cards.sumAll()).isEqualTo(SEVEN); } @Test @DisplayName("Ace가 두장이면 12이다.") void sumCards_ace_and_ace() { - Cards cards = new Cards(CLOVER_ACE, HEART_ACE); + Cards cards = new Cards(Arrays.asList(CLOVER_ACE, HEART_ACE)); assertThat(cards.sumAll()).isEqualTo(TWELVE); } @Test @DisplayName("에이스와 잭이면 합이 21이다.") void sumCards_ace_and_jack() { - Cards cards = new Cards(CLOVER_ACE, CLOVER_JACK); + Cards cards = new Cards(Arrays.asList(CLOVER_ACE, CLOVER_JACK)); assertThat(cards.sumAll()).isEqualTo(21); } @Test @DisplayName("에이스가 두 장이고 잭이 한 장이면 12이다.") void sumCards_ace_and_ace_and_jack() { - Cards cards = new Cards(CLOVER_ACE, CLOVER_JACK); + Cards cards = new Cards(Arrays.asList(CLOVER_ACE, CLOVER_JACK)); Cards newCards = cards.putCard(HEART_ACE); From 4ff70920c2b57a16d701542bc03412ea22713b12 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 21:17:15 +0900 Subject: [PATCH 27/37] =?UTF-8?q?Refact=20:=20Participant=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/member/Participant.java | 6 +++++- .../blackjack/member/Participants.java | 8 ++++++++ .../{ => service}/BlackjackGame.java | 19 ++++++++++++++++--- .../blackjack/onecards/CardsTest.java | 4 ++++ 4 files changed, 33 insertions(+), 4 deletions(-) rename src/main/java/nextstep/blackjack/blackjack/{ => service}/BlackjackGame.java (70%) diff --git a/src/main/java/nextstep/blackjack/blackjack/member/Participant.java b/src/main/java/nextstep/blackjack/blackjack/member/Participant.java index 8bc28363..dfb50ef0 100644 --- a/src/main/java/nextstep/blackjack/blackjack/member/Participant.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Participant.java @@ -8,7 +8,7 @@ public class Participant { private final String username; private final BigDecimal bettingMoney; - private final Cards cards; + private Cards cards; public Participant(String username, BigDecimal bettingMoney, Cards cards) { if (username == null || username.trim().isEmpty()) { @@ -39,4 +39,8 @@ public BigDecimal getBettingMoney() { public Cards getCards() { return cards; } + + public void updateCards(Cards cards) { + this.cards = cards; + } } diff --git a/src/main/java/nextstep/blackjack/blackjack/member/Participants.java b/src/main/java/nextstep/blackjack/blackjack/member/Participants.java index c64324bb..543e7333 100644 --- a/src/main/java/nextstep/blackjack/blackjack/member/Participants.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Participants.java @@ -2,6 +2,7 @@ import nextstep.blackjack.blackjack.onecards.OneCards; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -20,4 +21,11 @@ public List getParticipants() { public void distribute(OneCards oneCards) { participants.forEach(participant -> participant.getCards().putCard(oneCards.pollCard())); } + + public BigDecimal sumBattingMoney() { + return getParticipants().stream() + .map(Participant::getBettingMoney) + .reduce(BigDecimal::add) + .orElse(BigDecimal.ZERO); + } } diff --git a/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackGame.java similarity index 70% rename from src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java rename to src/main/java/nextstep/blackjack/blackjack/service/BlackjackGame.java index 856779fa..fb69f6bc 100644 --- a/src/main/java/nextstep/blackjack/blackjack/BlackjackGame.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackGame.java @@ -1,13 +1,15 @@ -package nextstep.blackjack.blackjack; +package nextstep.blackjack.blackjack.service; import nextstep.blackjack.blackjack.member.Dealer; import nextstep.blackjack.blackjack.member.Participant; import nextstep.blackjack.blackjack.member.Participants; +import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; import nextstep.blackjack.blackjack.utils.IOService; import java.math.BigDecimal; +import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; @@ -42,14 +44,25 @@ private Participants enter(OneCards oneCards) { } private void getResult(Dealer dealer, Participants participants) { + Map map = new HashMap<>(); + participants.getParticipants().forEach(participant -> + map.put(participant.getUsername(), participant.getCards().sumAll()) + ); + + map.put("dealer", dealer.getCards().sumAll()); + + BigDecimal money = participants.sumBattingMoney(); + + ioService.outputResult(map, money); } private void weatherToAcceptCard(Participants participants, OneCards oneCards) { participants.getParticipants().stream() .filter(participant -> participant.getCards().isOver21()) .forEach(participant -> { - while (ioService.weatherToAcceptCard(participant.getUsername()) && participant.getCards().isOver21()) { - participant.getCards().putCard(oneCards.pollCard()); + while (participant.getCards().isOver21() && ioService.weatherToAcceptCard(participant.getUsername(), participant.getCards().sumAll())) { + Cards cards = participant.getCards().putCard(oneCards.pollCard()); + participant.updateCards(cards); } }); } diff --git a/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java b/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java index 7675feda..75c89ed0 100644 --- a/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/onecards/CardsTest.java @@ -1,5 +1,9 @@ package nextstep.blackjack.blackjack.onecards; +import nextstep.blackjack.blackjack.onecards.Card; +import nextstep.blackjack.blackjack.onecards.CardNumber; +import nextstep.blackjack.blackjack.onecards.CardType; +import nextstep.blackjack.blackjack.onecards.Cards; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 3c1fc7b2e206a2a046972915b01a687640dfb117 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Thu, 1 Sep 2022 21:17:29 +0900 Subject: [PATCH 28/37] =?UTF-8?q?Feat=20:=20IO,=20Main=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=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 --- README.md | 5 +- .../nextstep/blackjack/blackjack/Main.java | 13 +++++ .../blackjack/blackjack/utils/IOService.java | 48 +++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 src/main/java/nextstep/blackjack/blackjack/Main.java create mode 100644 src/main/java/nextstep/blackjack/blackjack/utils/IOService.java diff --git a/README.md b/README.md index fd38c532..f697156a 100644 --- a/README.md +++ b/README.md @@ -68,9 +68,6 @@ - 카드를 참여자와 딜러에게 두 장씩 분배한다. - 참여자에게 카드 한 장 분배 - 카드덱에서 꺼내 참여자에게 카드를 분배한다. - - 진행 여부 판단 - - 참여자들의 카드를 확인해 진행 여부를 판단한다. - - 카드 패의 합이 21이 나온 딜러나 참여자가 있다면 게임을 종료한다. - - 분배금 분배 + - 게임 결과를 발표한다. - 참여자들과 딜러의 카드 패를 확인한다. - 배팅 금액 정보를 기반으로 금액을 분배한다. diff --git a/src/main/java/nextstep/blackjack/blackjack/Main.java b/src/main/java/nextstep/blackjack/blackjack/Main.java new file mode 100644 index 00000000..569b7a66 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/Main.java @@ -0,0 +1,13 @@ +package nextstep.blackjack.blackjack; + +import nextstep.blackjack.blackjack.service.BlackjackGame; +import nextstep.blackjack.blackjack.utils.IOService; + +public class Main { + public static void main(String[] args) { + IOService ioService = new IOService(); + BlackjackGame blackjackGame = new BlackjackGame(ioService); + + blackjackGame.start(); + } +} diff --git a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java new file mode 100644 index 00000000..b1e708d6 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java @@ -0,0 +1,48 @@ +package nextstep.blackjack.blackjack.utils; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Scanner; +import java.util.stream.Collectors; + +public class IOService { + private final Scanner scanner = new Scanner(System.in); + private static final String REGEX = ","; + + public Map inputParticipantNameAndBattingMoney() { + List names = inputName(); + return inputBattingMoney(names); + } + + private Map inputBattingMoney(List names) { + Map nameAndBattingMoney = new HashMap<>(); + for (String name : names) { + System.out.println(name + "씨는 얼마를 배팅할 것인지?"); + nameAndBattingMoney.put(name, scanner.nextBigDecimal()); + } + return nameAndBattingMoney; + } + + private List inputName() { + System.out.println("이름을 입력하시오. 단위는 `,` 입니다. "); + return Arrays.stream(scanner.nextLine().split(REGEX)) + .map(String::trim).collect(Collectors.toList()); + } + + public boolean weatherToAcceptCard(String username, int score) { + System.out.println(username + "씨는 카드를 받을건지? (y/n), score : " + score); + return Objects.equals(scanner.nextLine(), "y"); + } + + public void outputResult(Map map, BigDecimal money) { + System.out.println("결과 발표한다."); + for (Map.Entry entry : map.entrySet()) { + System.out.println(entry.getKey() + " : " + entry.getValue()); + } + System.out.println("총 상금은 " + money.toString()); + } +} From bce2d1800553e54cef8750d9930d50097f1b4629 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:09:10 +0900 Subject: [PATCH 29/37] =?UTF-8?q?Refact=20:=20Cards=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/nextstep/blackjack/blackjack/onecards/Cards.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java index afb91fae..f03586cb 100644 --- a/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java @@ -47,6 +47,14 @@ private Card getCard(Card card) { } public boolean isOver21() { + return sumAll() > 21; + } + + public boolean isNotOver21() { return sumAll() < 21; } + + public boolean is21() { + return sumAll() == 21; + } } From b045fedc2fc62ceab6ba4578ee6355f97d8447fa Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:09:23 +0900 Subject: [PATCH 30/37] =?UTF-8?q?Fix=20:=20=EC=9E=85=EB=A0=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/blackjack/blackjack/utils/IOService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java index b1e708d6..4d033b4a 100644 --- a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java +++ b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java @@ -35,7 +35,7 @@ private List inputName() { public boolean weatherToAcceptCard(String username, int score) { System.out.println(username + "씨는 카드를 받을건지? (y/n), score : " + score); - return Objects.equals(scanner.nextLine(), "y"); + return Objects.equals(scanner.next(), "y"); } public void outputResult(Map map, BigDecimal money) { From 9c1b9af1b6e0d372534acc4df64e959afa9cc731 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:09:56 +0900 Subject: [PATCH 31/37] =?UTF-8?q?Refact=20:=20BlackjackGame=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/blackjack/blackjack/Main.java | 11 ++++-- ...ckGame.java => BlackjackInputService.java} | 36 ++++--------------- .../service/BlackjackOutputService.java | 23 ++++++++++++ 3 files changed, 37 insertions(+), 33 deletions(-) rename src/main/java/nextstep/blackjack/blackjack/service/{BlackjackGame.java => BlackjackInputService.java} (57%) create mode 100644 src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java diff --git a/src/main/java/nextstep/blackjack/blackjack/Main.java b/src/main/java/nextstep/blackjack/blackjack/Main.java index 569b7a66..e0a29180 100644 --- a/src/main/java/nextstep/blackjack/blackjack/Main.java +++ b/src/main/java/nextstep/blackjack/blackjack/Main.java @@ -1,13 +1,18 @@ package nextstep.blackjack.blackjack; -import nextstep.blackjack.blackjack.service.BlackjackGame; +import nextstep.blackjack.blackjack.onecards.OneCards; +import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; +import nextstep.blackjack.blackjack.service.BlackjackInputService; +import nextstep.blackjack.blackjack.service.BlackjackOutputService; import nextstep.blackjack.blackjack.utils.IOService; public class Main { public static void main(String[] args) { + OneCards oneCards = OneCardsGenerator.generateOneCards(); IOService ioService = new IOService(); - BlackjackGame blackjackGame = new BlackjackGame(ioService); - + BlackjackInputService blackjackGame = new BlackjackInputService(ioService, oneCards); + BlackjackOutputService blackjackResult = new BlackjackOutputService(ioService, oneCards); blackjackGame.start(); +// blackjackResult.distributeMoney(members); } } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackGame.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java similarity index 57% rename from src/main/java/nextstep/blackjack/blackjack/service/BlackjackGame.java rename to src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java index fb69f6bc..8cab84eb 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackGame.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java @@ -1,37 +1,27 @@ package nextstep.blackjack.blackjack.service; -import nextstep.blackjack.blackjack.member.Dealer; import nextstep.blackjack.blackjack.member.Participant; import nextstep.blackjack.blackjack.member.Participants; import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; -import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; import nextstep.blackjack.blackjack.utils.IOService; import java.math.BigDecimal; -import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; -public class BlackjackGame { +public class BlackjackInputService { private final IOService ioService; + private final OneCards oneCards; - public BlackjackGame(IOService ioService) { + public BlackjackInputService(IOService ioService, OneCards oneCards) { this.ioService = ioService; + this.oneCards = oneCards; } public void start() { - OneCards oneCards = OneCardsGenerator.generateOneCards(); - Participants participants = enter(oneCards); - - Dealer dealer = new Dealer(oneCards); - - participants.distribute(oneCards); - weatherToAcceptCard(participants, oneCards); - - getResult(dealer, participants); } private Participants enter(OneCards oneCards) { @@ -43,24 +33,10 @@ private Participants enter(OneCards oneCards) { ); } - private void getResult(Dealer dealer, Participants participants) { - Map map = new HashMap<>(); - participants.getParticipants().forEach(participant -> - map.put(participant.getUsername(), participant.getCards().sumAll()) - ); - - map.put("dealer", dealer.getCards().sumAll()); - - BigDecimal money = participants.sumBattingMoney(); - - ioService.outputResult(map, money); - } - private void weatherToAcceptCard(Participants participants, OneCards oneCards) { - participants.getParticipants().stream() - .filter(participant -> participant.getCards().isOver21()) + participants.getParticipants() .forEach(participant -> { - while (participant.getCards().isOver21() && ioService.weatherToAcceptCard(participant.getUsername(), participant.getCards().sumAll())) { + while (participant.getCards().isNotOver21() && ioService.weatherToAcceptCard(participant.getUsername(), participant.getCards().sumAll())) { Cards cards = participant.getCards().putCard(oneCards.pollCard()); participant.updateCards(cards); } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java new file mode 100644 index 00000000..981476a8 --- /dev/null +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java @@ -0,0 +1,23 @@ +package nextstep.blackjack.blackjack.service; + +import nextstep.blackjack.blackjack.member.Dealer; +import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.onecards.OneCards; +import nextstep.blackjack.blackjack.utils.IOService; + +import java.util.Map; + +public class BlackjackOutputService { + private final IOService ioService; + private final OneCards oneCards; + + public BlackjackOutputService(IOService ioService, OneCards oneCards) { + this.ioService = ioService; + this.oneCards = oneCards; + } + + public void distributeMoney(Map members) { + Dealer dealer = new Dealer(oneCards); + + } +} From d3483acf7af9150a56ef3181b22260f83157577b Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:14:37 +0900 Subject: [PATCH 32/37] =?UTF-8?q?Docs=20:=20Dealer=20=EC=A3=BC=EC=84=9D=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 --- src/main/java/nextstep/blackjack/blackjack/member/Dealer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java index 56565358..be7e000e 100644 --- a/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java @@ -9,6 +9,10 @@ public class Dealer { private static final int CRITERION = 16; private final Cards cards; + /** + * 딜러는 카드값이 CRITERION을 넘지 않으면 카드를 한 장 더 뽑는다.* + * @param oneCards + */ public Dealer(OneCards oneCards) { Cards cards = new Cards(Arrays.asList(oneCards.pollCard(), oneCards.pollCard())); From e26737bb15808b349a3fbb50e67ca8d35f2e4b0d Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:22:50 +0900 Subject: [PATCH 33/37] =?UTF-8?q?Refact=20:=20OneCards=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/blackjack/blackjack/Main.java | 18 +++++----- .../service/BlackjackInputService.java | 36 +++++++++++++------ .../service/BlackjackOutputService.java | 15 ++++---- 3 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/main/java/nextstep/blackjack/blackjack/Main.java b/src/main/java/nextstep/blackjack/blackjack/Main.java index e0a29180..e88a102e 100644 --- a/src/main/java/nextstep/blackjack/blackjack/Main.java +++ b/src/main/java/nextstep/blackjack/blackjack/Main.java @@ -1,18 +1,20 @@ package nextstep.blackjack.blackjack; -import nextstep.blackjack.blackjack.onecards.OneCards; -import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; +import nextstep.blackjack.blackjack.member.Dealer; +import nextstep.blackjack.blackjack.member.Participants; import nextstep.blackjack.blackjack.service.BlackjackInputService; import nextstep.blackjack.blackjack.service.BlackjackOutputService; import nextstep.blackjack.blackjack.utils.IOService; public class Main { + private final static IOService ioService = new IOService(); + private final static BlackjackInputService blackjackGame = new BlackjackInputService(ioService); + private final static BlackjackOutputService blackjackResult = new BlackjackOutputService(ioService); + public static void main(String[] args) { - OneCards oneCards = OneCardsGenerator.generateOneCards(); - IOService ioService = new IOService(); - BlackjackInputService blackjackGame = new BlackjackInputService(ioService, oneCards); - BlackjackOutputService blackjackResult = new BlackjackOutputService(ioService, oneCards); - blackjackGame.start(); -// blackjackResult.distributeMoney(members); + Dealer dealer = blackjackGame.enterDealer(); + Participants participants = blackjackGame.enter(); + blackjackGame.weatherToAcceptCard(participants); + blackjackResult.distributeMoney(participants, dealer); } } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java index 8cab84eb..3ddff29c 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java @@ -1,9 +1,11 @@ package nextstep.blackjack.blackjack.service; +import nextstep.blackjack.blackjack.member.Dealer; import nextstep.blackjack.blackjack.member.Participant; import nextstep.blackjack.blackjack.member.Participants; import nextstep.blackjack.blackjack.onecards.Cards; import nextstep.blackjack.blackjack.onecards.OneCards; +import nextstep.blackjack.blackjack.onecards.OneCardsGenerator; import nextstep.blackjack.blackjack.utils.IOService; import java.math.BigDecimal; @@ -11,20 +13,19 @@ import java.util.stream.Collectors; public class BlackjackInputService { + private final static OneCards oneCards = OneCardsGenerator.generateOneCards(); private final IOService ioService; - private final OneCards oneCards; - public BlackjackInputService(IOService ioService, OneCards oneCards) { + public BlackjackInputService(IOService ioService) { this.ioService = ioService; - this.oneCards = oneCards; } - public void start() { - Participants participants = enter(oneCards); - weatherToAcceptCard(participants, oneCards); - } - - private Participants enter(OneCards oneCards) { + /** + * 참여자들을 입력받고 금액을 입력받는다.* + * + * @return Participants + */ + public Participants enter() { Map participantNameAndBatting = ioService.inputParticipantNameAndBattingMoney(); return new Participants( participantNameAndBatting.entrySet().stream() @@ -33,7 +34,12 @@ private Participants enter(OneCards oneCards) { ); } - private void weatherToAcceptCard(Participants participants, OneCards oneCards) { + /** + * 참여자들에게 카드를 받을 지 묻는다. 21 이상이면 카드를 받을 수 없다.* + * + * @param participants + */ + public void weatherToAcceptCard(Participants participants) { participants.getParticipants() .forEach(participant -> { while (participant.getCards().isNotOver21() && ioService.weatherToAcceptCard(participant.getUsername(), participant.getCards().sumAll())) { @@ -43,8 +49,18 @@ private void weatherToAcceptCard(Participants participants, OneCards oneCards) { }); } + /** + * 딜러에게 카드를 준다.* + * + * @return Dealer + */ + public Dealer enterDealer() { + return new Dealer(oneCards); + } + private Participant getParticipant(OneCards oneCards, String username, BigDecimal battingMoney) { return new Participant(username, battingMoney, oneCards); } + } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java index 981476a8..1542dd79 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java @@ -1,23 +1,22 @@ package nextstep.blackjack.blackjack.service; import nextstep.blackjack.blackjack.member.Dealer; -import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.member.Participants; import nextstep.blackjack.blackjack.onecards.OneCards; import nextstep.blackjack.blackjack.utils.IOService; -import java.util.Map; - public class BlackjackOutputService { private final IOService ioService; - private final OneCards oneCards; - public BlackjackOutputService(IOService ioService, OneCards oneCards) { + public BlackjackOutputService(IOService ioService) { this.ioService = ioService; - this.oneCards = oneCards; } - public void distributeMoney(Map members) { - Dealer dealer = new Dealer(oneCards); + /** + * 참여자들을 입력 받아 결과를 반환한다.* + * @param members + */ + public void distributeMoney(Participants members, Dealer dealer) { } } From f5942efae6b8498865ee034eefe6c00566617351 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 17:23:29 +0900 Subject: [PATCH 34/37] =?UTF-8?q?Refact=20:=20BlackjackInputService=20->?= =?UTF-8?q?=20BlackjackGameService=20=EC=9D=B4=EB=A6=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/blackjack/blackjack/Main.java | 4 ++-- .../{BlackjackInputService.java => BlackjackGameService.java} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/main/java/nextstep/blackjack/blackjack/service/{BlackjackInputService.java => BlackjackGameService.java} (95%) diff --git a/src/main/java/nextstep/blackjack/blackjack/Main.java b/src/main/java/nextstep/blackjack/blackjack/Main.java index e88a102e..f1c4aedb 100644 --- a/src/main/java/nextstep/blackjack/blackjack/Main.java +++ b/src/main/java/nextstep/blackjack/blackjack/Main.java @@ -2,13 +2,13 @@ import nextstep.blackjack.blackjack.member.Dealer; import nextstep.blackjack.blackjack.member.Participants; -import nextstep.blackjack.blackjack.service.BlackjackInputService; +import nextstep.blackjack.blackjack.service.BlackjackGameService; import nextstep.blackjack.blackjack.service.BlackjackOutputService; import nextstep.blackjack.blackjack.utils.IOService; public class Main { private final static IOService ioService = new IOService(); - private final static BlackjackInputService blackjackGame = new BlackjackInputService(ioService); + private final static BlackjackGameService blackjackGame = new BlackjackGameService(ioService); private final static BlackjackOutputService blackjackResult = new BlackjackOutputService(ioService); public static void main(String[] args) { diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackGameService.java similarity index 95% rename from src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java rename to src/main/java/nextstep/blackjack/blackjack/service/BlackjackGameService.java index 3ddff29c..3183addc 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackInputService.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackGameService.java @@ -12,11 +12,11 @@ import java.util.Map; import java.util.stream.Collectors; -public class BlackjackInputService { +public class BlackjackGameService { private final static OneCards oneCards = OneCardsGenerator.generateOneCards(); private final IOService ioService; - public BlackjackInputService(IOService ioService) { + public BlackjackGameService(IOService ioService) { this.ioService = ioService; } From d7155f06595f965e42adeea2851c46f59951e7da Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 21:51:23 +0900 Subject: [PATCH 35/37] =?UTF-8?q?Feat=20:=20BlackjackOutputService=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackjack/blackjack/member/Dealer.java | 4 + .../blackjack/blackjack/onecards/Cards.java | 12 +- .../service/BlackjackOutputService.java | 110 ++++++++++++++- .../service/BlackjackOutputServiceTest.java | 125 ++++++++++++++++++ 4 files changed, 245 insertions(+), 6 deletions(-) create mode 100644 src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java diff --git a/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java index be7e000e..9d442cf2 100644 --- a/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java +++ b/src/main/java/nextstep/blackjack/blackjack/member/Dealer.java @@ -9,6 +9,10 @@ public class Dealer { private static final int CRITERION = 16; private final Cards cards; + public Dealer(Cards cards) { + this.cards = cards; + } + /** * 딜러는 카드값이 CRITERION을 넘지 않으면 카드를 한 장 더 뽑는다.* * @param oneCards diff --git a/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java index f03586cb..ed3406ed 100644 --- a/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java +++ b/src/main/java/nextstep/blackjack/blackjack/onecards/Cards.java @@ -6,6 +6,8 @@ import java.util.Optional; public class Cards { + private static final int DEFAULT_SIZE = 2; + private static final int MAX_SCORE = 21; private final List cards; public Cards(final List cards) { @@ -46,15 +48,19 @@ private Card getCard(Card card) { .orElseThrow(() -> new IllegalArgumentException("Card는 Null일 수 없습니다.")); } + public boolean isCountTwo() { + return cards.size() == DEFAULT_SIZE; + } + public boolean isOver21() { - return sumAll() > 21; + return sumAll() > MAX_SCORE; } public boolean isNotOver21() { - return sumAll() < 21; + return sumAll() < MAX_SCORE; } public boolean is21() { - return sumAll() == 21; + return sumAll() == MAX_SCORE; } } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java index 1542dd79..92ed4b80 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java @@ -1,10 +1,18 @@ package nextstep.blackjack.blackjack.service; import nextstep.blackjack.blackjack.member.Dealer; +import nextstep.blackjack.blackjack.member.Participant; import nextstep.blackjack.blackjack.member.Participants; -import nextstep.blackjack.blackjack.onecards.OneCards; import nextstep.blackjack.blackjack.utils.IOService; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + public class BlackjackOutputService { private final IOService ioService; @@ -14,9 +22,105 @@ public BlackjackOutputService(IOService ioService) { /** * 참여자들을 입력 받아 결과를 반환한다.* - * @param members + * + * @param participants */ - public void distributeMoney(Participants members, Dealer dealer) { + public Map distributeMoney(Participants participants, Dealer dealer) { + Map members = new HashMap<>(); + + List participants_cards_21 = participants.getParticipants().stream() + .filter(participant -> participant.getCards().is21()) + .collect(Collectors.toList()); + + + int maxParticipant = participants.getParticipants().stream() + .max(Comparator.comparingLong(value -> value.getCards().sumAll())) + .map(participant -> participant.getCards().sumAll()) + .orElse(0); + + if (dealer.getCards().isOver21()) { + participants.getParticipants() + .forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney())); + + BigDecimal dealerProfit = participants.getParticipants().stream() + .map(Participant::getBettingMoney) + .reduce(BigDecimal::add) + .orElse(BigDecimal.ZERO) + .negate(); + + members.put("dealer", dealerProfit); + return members; + } + + if (participants_cards_21.stream().anyMatch(participant -> participant.getCards().isCountTwo())) { + List winners = participants_cards_21.stream() + .filter(participant -> participant.getCards().isCountTwo()) + .collect(Collectors.toList()); + + List looser = participants.getParticipants().stream() + .filter(participant -> !winners.contains(participant)) + .collect(Collectors.toList()); + + winners.forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().multiply(BigDecimal.valueOf(1.5)).setScale(0, RoundingMode.FLOOR))); + looser.forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().negate())); + + BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); + members.put("dealer", dealerProfit); + return members; + } + + if (dealer.getCards().is21() && !participants_cards_21.isEmpty()) { + participants_cards_21.forEach(participant -> + members.put(participant.getUsername(), participant.getBettingMoney()) + ); + + BigDecimal winnersMoney = participants_cards_21.stream() + .map(Participant::getBettingMoney) + .reduce(BigDecimal::add) + .orElse(BigDecimal.ZERO); + + List participants_cards_not_21 = participants.getParticipants().stream() + .filter(participant -> !participant.getCards().is21()) + .collect(Collectors.toList()); + + participants_cards_not_21.forEach(participant -> + members.put(participant.getUsername(), participant.getBettingMoney().negate()) + ); + + BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); + members.put("dealer", dealerProfit); + + return members; + } + + if ((dealer.getCards().is21() && participants_cards_21.isEmpty()) || (dealer.getCards().sumAll() > maxParticipant)) { + participants.getParticipants() + .forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().negate())); + + BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); + members.put("dealer", dealerProfit); + return members; + } + + + if (dealer.getCards().sumAll() <= maxParticipant) { + List winner = participants.getParticipants().stream() + .filter(participant -> participant.getCards().sumAll() == maxParticipant) + .collect(Collectors.toList()); + + List looser = participants.getParticipants().stream() + .filter(participant -> participant.getCards().sumAll() != maxParticipant) + .collect(Collectors.toList()); + + winner.forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney())); + looser.forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().negate())); + + BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); + members.put("dealer", dealerProfit); + + return members; + } + return new HashMap<>(); } } diff --git a/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java b/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java new file mode 100644 index 00000000..c77d9d71 --- /dev/null +++ b/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java @@ -0,0 +1,125 @@ +package nextstep.blackjack.blackjack.service; + +import nextstep.blackjack.blackjack.member.Dealer; +import nextstep.blackjack.blackjack.member.Participant; +import nextstep.blackjack.blackjack.member.Participants; +import nextstep.blackjack.blackjack.onecards.Card; +import nextstep.blackjack.blackjack.onecards.CardNumber; +import nextstep.blackjack.blackjack.onecards.CardType; +import nextstep.blackjack.blackjack.onecards.Cards; +import nextstep.blackjack.blackjack.utils.IOService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +class BlackjackOutputServiceTest { + + + private static final Cards 합_21_카드_3장 = new Cards(Arrays.asList(new Card(CardType.CLOVER, CardNumber.ACE), new Card(CardType.DIAMOND, CardNumber.ACE), new Card(CardType.DIAMOND, CardNumber.NINE))); + private static final Cards 합_21_카드_2장 = new Cards(Arrays.asList(new Card(CardType.CLOVER, CardNumber.JACK), new Card(CardType.DIAMOND, CardNumber.ACE))); + private static final Cards 합_24_카드 = new Cards(Arrays.asList(new Card(CardType.CLOVER, CardNumber.EIGHT), new Card(CardType.DIAMOND, CardNumber.EIGHT), new Card(CardType.HEART, CardNumber.EIGHT))); + private static final Cards 합이_18인_카드 = new Cards(Arrays.asList(new Card(CardType.CLOVER, CardNumber.JACK), new Card(CardType.DIAMOND, CardNumber.EIGHT))); + private static final Cards 합이_16인_카드 = new Cards(Arrays.asList(new Card(CardType.CLOVER, CardNumber.JACK), new Card(CardType.DIAMOND, CardNumber.SIX))); + private static final Participant 합이_21_인_사용자 = new Participant("첫 번째 참여자", BigDecimal.valueOf(20_000L), 합_21_카드_3장); + private static final Participant 한_번에_합_21_인_사용자 = new Participant("첫 번째 참여자", BigDecimal.valueOf(20_000L), 합_21_카드_2장); + private static final Participant 합이_18_인_사용자 = new Participant("세 번째 참여자", BigDecimal.valueOf(20_000L), 합이_18인_카드); + private static final Participant 합이_16_인_사용자 = new Participant("두 번째 참여자", BigDecimal.valueOf(20_000L), 합이_16인_카드); + + private BlackjackOutputService outputService; + + @BeforeEach + void setUp() { + outputService = new BlackjackOutputService(new IOService()); + } + + @Test + @DisplayName("딜러와 참여자 한 명의 카드 합이 같으면 배팅 금액을 돌려받고, 나머지 참여자는 금액을 잃는다..") + void getResult_winner_dealer_and_participants() { + // given + Dealer dealer = new Dealer(합_21_카드_3장); + Participants participants = new Participants(Arrays.asList(합이_16_인_사용자, 합이_18_인_사용자, 합이_21_인_사용자)); + + // when + Map 결과 = outputService.distributeMoney(participants, dealer); + + // then + assertThat(결과.get("dealer")).isEqualTo(BigDecimal.valueOf(20_000L)); + assertThat(결과.get(합이_21_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(20_000L)); + assertThat(결과.get(합이_16_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + assertThat(결과.get(합이_18_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + } + + @Test + @DisplayName("우승자가 딜러인 경우 배팅 금액을 전부 가져가고 참여자들은 모두 잃는다.") + void getResult_winner_dealer() { + // given + Dealer dealer = new Dealer(합_21_카드_3장); + Participants participants = new Participants(Arrays.asList(합이_18_인_사용자, 합이_16_인_사용자)); + + // when + Map 결과 = outputService.distributeMoney(participants, dealer); + + // then + assertThat(결과.get("dealer")).isEqualTo(BigDecimal.valueOf(40_000L)); + assertThat(결과.get(합이_16_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + assertThat(결과.get(합이_18_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + } + + + @Test + @DisplayName("딜러 카드 합이 21을 초과하는 경우 모든 참여자에게 배팅 금액만큼 지불한다.") + void getResult_over_dealer() { + // given + Dealer dealer = new Dealer(합_24_카드); + Participants participants = new Participants(Arrays.asList(합이_16_인_사용자, 합이_18_인_사용자, 합이_21_인_사용자)); + + // when + Map 결과 = outputService.distributeMoney(participants, dealer); + + // then + assertThat(결과.get("dealer")).isEqualTo(BigDecimal.valueOf(-60_000L)); + assertThat(결과.get(합이_16_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(20_000L)); + assertThat(결과.get(합이_18_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(20_000L)); + assertThat(결과.get(합이_21_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(20_000L)); + } + + @Test + @DisplayName("참여자의 처음 두 장 합이 21인 경우 1.5 배의 배팅 금액을 받고, 그 외 참여자는 돈을 잃는다.") + void getResult_winner_first_blackjack() { + // given + Dealer dealer = new Dealer(합이_18인_카드); + Participants participants = new Participants(Arrays.asList(합이_16_인_사용자, 합이_18_인_사용자, 한_번에_합_21_인_사용자)); + + // when + Map 결과 = outputService.distributeMoney(participants, dealer); + + // then + assertThat(결과.get("dealer")).isEqualTo(BigDecimal.valueOf(10_000L)); + assertThat(결과.get(합이_16_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + assertThat(결과.get(합이_18_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + assertThat(결과.get(한_번에_합_21_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(30_000L)); + } + + @Test + @DisplayName("우승자가 참여자인 경우 배팅 금액 만큼 딜러에게 받아가고 그 외 참여자는 돈을 잃는다.") + void getResult_winner_participants() { + // given + Dealer dealer = new Dealer(합이_16인_카드); + Participants participants = new Participants(Arrays.asList(합이_16_인_사용자, 합이_18_인_사용자)); + + // when + Map 결과 = outputService.distributeMoney(participants, dealer); + + // then + assertThat(결과.get("dealer")).isEqualTo(BigDecimal.ZERO); + assertThat(결과.get(합이_16_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(-20_000L)); + assertThat(결과.get(합이_18_인_사용자.getUsername())).isEqualTo(BigDecimal.valueOf(20_000L)); + } + +} From 9d94f146c310ec6955ac19a4c8d7a2b5e0ea14c6 Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 21:53:18 +0900 Subject: [PATCH 36/37] =?UTF-8?q?Refact=20:=20BlackjackOutputService=20=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/nextstep/blackjack/blackjack/Main.java | 7 ++++++- .../blackjack/service/BlackjackOutputService.java | 6 ------ .../nextstep/blackjack/blackjack/utils/IOService.java | 8 +++----- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/nextstep/blackjack/blackjack/Main.java b/src/main/java/nextstep/blackjack/blackjack/Main.java index f1c4aedb..8e1ab7d2 100644 --- a/src/main/java/nextstep/blackjack/blackjack/Main.java +++ b/src/main/java/nextstep/blackjack/blackjack/Main.java @@ -6,6 +6,9 @@ import nextstep.blackjack.blackjack.service.BlackjackOutputService; import nextstep.blackjack.blackjack.utils.IOService; +import java.math.BigDecimal; +import java.util.Map; + public class Main { private final static IOService ioService = new IOService(); private final static BlackjackGameService blackjackGame = new BlackjackGameService(ioService); @@ -15,6 +18,8 @@ public static void main(String[] args) { Dealer dealer = blackjackGame.enterDealer(); Participants participants = blackjackGame.enter(); blackjackGame.weatherToAcceptCard(participants); - blackjackResult.distributeMoney(participants, dealer); + Map result = blackjackResult.distributeMoney(participants, dealer); + ioService.outputResult(result); + } } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java index 92ed4b80..08c31b01 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java @@ -3,7 +3,6 @@ import nextstep.blackjack.blackjack.member.Dealer; import nextstep.blackjack.blackjack.member.Participant; import nextstep.blackjack.blackjack.member.Participants; -import nextstep.blackjack.blackjack.utils.IOService; import java.math.BigDecimal; import java.math.RoundingMode; @@ -14,11 +13,6 @@ import java.util.stream.Collectors; public class BlackjackOutputService { - private final IOService ioService; - - public BlackjackOutputService(IOService ioService) { - this.ioService = ioService; - } /** * 참여자들을 입력 받아 결과를 반환한다.* diff --git a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java index 4d033b4a..3f2c629c 100644 --- a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java +++ b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java @@ -38,11 +38,9 @@ public boolean weatherToAcceptCard(String username, int score) { return Objects.equals(scanner.next(), "y"); } - public void outputResult(Map map, BigDecimal money) { - System.out.println("결과 발표한다."); - for (Map.Entry entry : map.entrySet()) { - System.out.println(entry.getKey() + " : " + entry.getValue()); + public void outputResult(Map result) { + for (Map.Entry entry : result.entrySet()) { + System.out.println(entry.getKey() + " : " + entry.getValue() + "원"); } - System.out.println("총 상금은 " + money.toString()); } } From a2cdc07b47eab6214aa6ada0cfdd89030988d57d Mon Sep 17 00:00:00 2001 From: tis <92219795+this-is-spear@users.noreply.github.com> Date: Mon, 12 Sep 2022 22:01:07 +0900 Subject: [PATCH 37/37] =?UTF-8?q?Refact=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextstep/blackjack/blackjack/Main.java | 7 +++-- .../service/BlackjackOutputService.java | 27 +++++++++++-------- .../blackjack/blackjack/utils/IOService.java | 6 +++++ .../service/BlackjackOutputServiceTest.java | 3 +-- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/main/java/nextstep/blackjack/blackjack/Main.java b/src/main/java/nextstep/blackjack/blackjack/Main.java index 8e1ab7d2..0f7a5e5a 100644 --- a/src/main/java/nextstep/blackjack/blackjack/Main.java +++ b/src/main/java/nextstep/blackjack/blackjack/Main.java @@ -12,14 +12,17 @@ public class Main { private final static IOService ioService = new IOService(); private final static BlackjackGameService blackjackGame = new BlackjackGameService(ioService); - private final static BlackjackOutputService blackjackResult = new BlackjackOutputService(ioService); + private final static BlackjackOutputService blackjackResult = new BlackjackOutputService(); public static void main(String[] args) { Dealer dealer = blackjackGame.enterDealer(); Participants participants = blackjackGame.enter(); blackjackGame.weatherToAcceptCard(participants); + + Map scores = blackjackResult.getResult(participants, dealer); Map result = blackjackResult.distributeMoney(participants, dealer); - ioService.outputResult(result); + ioService.outputScores(scores); + ioService.outputResult(result); } } diff --git a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java index 08c31b01..857cd5e3 100644 --- a/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java +++ b/src/main/java/nextstep/blackjack/blackjack/service/BlackjackOutputService.java @@ -14,6 +14,8 @@ public class BlackjackOutputService { + public static final String DEALER = "dealer"; + /** * 참여자들을 입력 받아 결과를 반환한다.* * @@ -26,8 +28,8 @@ public Map distributeMoney(Participants participants, Dealer .filter(participant -> participant.getCards().is21()) .collect(Collectors.toList()); - int maxParticipant = participants.getParticipants().stream() + .filter(participant -> participant.getCards().sumAll() <= 21) .max(Comparator.comparingLong(value -> value.getCards().sumAll())) .map(participant -> participant.getCards().sumAll()) .orElse(0); @@ -42,7 +44,7 @@ public Map distributeMoney(Participants participants, Dealer .orElse(BigDecimal.ZERO) .negate(); - members.put("dealer", dealerProfit); + members.put(DEALER, dealerProfit); return members; } @@ -59,7 +61,7 @@ public Map distributeMoney(Participants participants, Dealer looser.forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().negate())); BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); - members.put("dealer", dealerProfit); + members.put(DEALER, dealerProfit); return members; } @@ -68,11 +70,6 @@ public Map distributeMoney(Participants participants, Dealer members.put(participant.getUsername(), participant.getBettingMoney()) ); - BigDecimal winnersMoney = participants_cards_21.stream() - .map(Participant::getBettingMoney) - .reduce(BigDecimal::add) - .orElse(BigDecimal.ZERO); - List participants_cards_not_21 = participants.getParticipants().stream() .filter(participant -> !participant.getCards().is21()) .collect(Collectors.toList()); @@ -82,7 +79,7 @@ public Map distributeMoney(Participants participants, Dealer ); BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); - members.put("dealer", dealerProfit); + members.put(DEALER, dealerProfit); return members; } @@ -92,7 +89,7 @@ public Map distributeMoney(Participants participants, Dealer .forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().negate())); BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); - members.put("dealer", dealerProfit); + members.put(DEALER, dealerProfit); return members; } @@ -110,11 +107,19 @@ public Map distributeMoney(Participants participants, Dealer looser.forEach(participant -> members.put(participant.getUsername(), participant.getBettingMoney().negate())); BigDecimal dealerProfit = members.values().stream().reduce(BigDecimal::add).orElse(BigDecimal.ZERO).negate(); - members.put("dealer", dealerProfit); + members.put(DEALER, dealerProfit); return members; } return new HashMap<>(); } + + public Map getResult(Participants participants, Dealer dealer) { + Map scores = new HashMap<>(); + participants.getParticipants().forEach(participant -> scores.put(participant.getUsername(), participant.getCards().sumAll())); + scores.put(DEALER, dealer.getCards().sumAll()); + + return scores; + } } diff --git a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java index 3f2c629c..6c1f5cd4 100644 --- a/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java +++ b/src/main/java/nextstep/blackjack/blackjack/utils/IOService.java @@ -38,6 +38,12 @@ public boolean weatherToAcceptCard(String username, int score) { return Objects.equals(scanner.next(), "y"); } + public void outputScores(Map scores) { + for (Map.Entry entry : scores.entrySet()) { + System.out.println(entry.getKey() + " : " + entry.getValue() + "점"); + } + } + public void outputResult(Map result) { for (Map.Entry entry : result.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue() + "원"); diff --git a/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java b/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java index c77d9d71..9e0b951f 100644 --- a/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java +++ b/src/test/java/nextstep/blackjack/blackjack/service/BlackjackOutputServiceTest.java @@ -7,7 +7,6 @@ import nextstep.blackjack.blackjack.onecards.CardNumber; import nextstep.blackjack.blackjack.onecards.CardType; import nextstep.blackjack.blackjack.onecards.Cards; -import nextstep.blackjack.blackjack.utils.IOService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -35,7 +34,7 @@ class BlackjackOutputServiceTest { @BeforeEach void setUp() { - outputService = new BlackjackOutputService(new IOService()); + outputService = new BlackjackOutputService(); } @Test