From 4d14987d099e40c74085e2ab183236cd2b1bb5a1 Mon Sep 17 00:00:00 2001 From: oliviarla Date: Sat, 13 Aug 2022 22:27:34 +0900 Subject: [PATCH 1/4] feat: apply lambda, stream, Optional --- src/main/java/nextstep/fp/Lambda.java | 31 +++++++------------ src/main/java/nextstep/fp/StreamStudy.java | 7 +++-- .../java/nextstep/optional/Expression.java | 11 +++---- src/main/java/nextstep/optional/User.java | 4 ++- src/main/java/nextstep/optional/Users.java | 8 ++--- src/test/java/nextstep/fp/CarTest.java | 14 ++------- 6 files changed, 28 insertions(+), 47 deletions(-) diff --git a/src/main/java/nextstep/fp/Lambda.java b/src/main/java/nextstep/fp/Lambda.java index bd68fe1c..dce72e76 100644 --- a/src/main/java/nextstep/fp/Lambda.java +++ b/src/main/java/nextstep/fp/Lambda.java @@ -27,30 +27,23 @@ public void run() { } public static int sumAll(List numbers) { - int total = 0; - for (int number : numbers) { - total += number; - } - return total; + return numbers.stream().reduce(Integer::sum).get(); + } + + public interface Conditional { + boolean test(Integer number); } + public static int sumAll(List numbers, + Conditional c) { + // c.test(number)를 활용해 구현할 수 있다. + return numbers.stream().filter(c::test).reduce(Integer::sum).get(); + } public static int sumAllEven(List numbers) { - int total = 0; - for (int number : numbers) { - if (number % 2 == 0) { - total += number; - } - } - return total; + return sumAll(numbers, (integer)->{return integer%2==0;}); } public static int sumAllOverThree(List numbers) { - int total = 0; - for (int number : numbers) { - if (number > 3) { - total += number; - } - } - return total; + return sumAll(numbers, (integer)->{return integer>3;}); } } diff --git a/src/main/java/nextstep/fp/StreamStudy.java b/src/main/java/nextstep/fp/StreamStudy.java index b446983a..86b66d53 100644 --- a/src/main/java/nextstep/fp/StreamStudy.java +++ b/src/main/java/nextstep/fp/StreamStudy.java @@ -5,6 +5,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -28,6 +29,7 @@ public static void printLongestWordTop100() throws IOException { List words = Arrays.asList(contents.split("[\\P{L}]+")); // TODO 이 부분에 구현한다. + 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) { @@ -39,6 +41,7 @@ public static long sumAll(List numbers) { } public static long sumOverThreeAndDouble(List numbers) { - return 0; + return doubleNumbers(numbers.stream().filter(x -> x>3).collect(Collectors.toList())) + .stream().reduce(Integer::sum).get(); } -} \ No newline at end of file +} diff --git a/src/main/java/nextstep/optional/Expression.java b/src/main/java/nextstep/optional/Expression.java index 1c98cd6a..2ca322a0 100644 --- a/src/main/java/nextstep/optional/Expression.java +++ b/src/main/java/nextstep/optional/Expression.java @@ -1,5 +1,8 @@ package nextstep.optional; +import java.util.Arrays; +import java.util.Optional; + enum Expression { PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/"); @@ -14,12 +17,6 @@ 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(v -> matchExpression(v, expression)).findFirst().orElseThrow(() -> new IllegalArgumentException(String.format("%s는 사칙연산에 해당하지 않는 표현식입니다.", expression))); } } diff --git a/src/main/java/nextstep/optional/User.java b/src/main/java/nextstep/optional/User.java index 9614c2f4..e7fcc660 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 false; + return Optional.ofNullable(user).map(x -> x.getAge()).filter(x -> x >=30 && x <= 45).isPresent(); } @Override diff --git a/src/main/java/nextstep/optional/Users.java b/src/main/java/nextstep/optional/Users.java index 6293040d..42183b7c 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); @@ -13,11 +14,6 @@ public class Users { new User("honux", 45)); User getUser(String name) { - for (User user : users) { - if (user.matchName(name)) { - return user; - } - } - return DEFAULT_USER; + return users.stream().filter(user -> user.matchName(name)).findAny().orElse(DEFAULT_USER); } } diff --git a/src/test/java/nextstep/fp/CarTest.java b/src/test/java/nextstep/fp/CarTest.java index 1ab1106f..9ab4e3bd 100644 --- a/src/test/java/nextstep/fp/CarTest.java +++ b/src/test/java/nextstep/fp/CarTest.java @@ -8,24 +8,14 @@ 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(() -> {return 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(() ->{return false;}); assertThat(actual).isEqualTo(new Car("pobi", 0)); } } From 95518c6adaf66a4b434dfba07238202e0070a846 Mon Sep 17 00:00:00 2001 From: oliviarla Date: Wed, 31 Aug 2022 23:04:19 +0900 Subject: [PATCH 2/4] =?UTF-8?q?FEAT:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/blackjack/README.md | 32 +++++++++++++++++++ src/main/java/blackjack/domain/card/Card.java | 14 ++++++++ .../blackjack/domain/card/CardFactory.java | 31 ++++++++++++++++++ .../java/blackjack/domain/card/Cards.java | 25 +++++++++++++++ .../java/blackjack/domain/person/Dealer.java | 9 ++++++ .../java/blackjack/domain/person/Person.java | 22 +++++++++++++ .../java/blackjack/domain/person/Player.java | 5 +++ 7 files changed, 138 insertions(+) create mode 100644 src/main/java/blackjack/README.md create mode 100644 src/main/java/blackjack/domain/card/Card.java create mode 100644 src/main/java/blackjack/domain/card/CardFactory.java create mode 100644 src/main/java/blackjack/domain/card/Cards.java create mode 100644 src/main/java/blackjack/domain/person/Dealer.java create mode 100644 src/main/java/blackjack/domain/person/Person.java create mode 100644 src/main/java/blackjack/domain/person/Player.java diff --git a/src/main/java/blackjack/README.md b/src/main/java/blackjack/README.md new file mode 100644 index 00000000..2f3ef89f --- /dev/null +++ b/src/main/java/blackjack/README.md @@ -0,0 +1,32 @@ +# 블랙잭 +## 게임 규칙 +- 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽이 배팅 금액을 획득 +- 딜러와 플레이어는 1:1로 경기 진행 +- 게임 시작 시 모두에게 2장의 카드를 지급 + - 플레이어 + - 2장의 카드 합이 21 미만일 경우 추가로 1장씩 뽑을 수 있음 + - 카드 추가로 뽑아 21 초과 시 배팅금액 모두 상실 + - 딜러 + - 2장의 카드 합이 16 이하이면 카드 1장 추가 + - 2장의 카드 합이 17 이상이면 동작 없음 +- 딜러가 21 초과 시 남은 플레이어는 무조건 승리해 배팅 금액 획득 + +## 설계 + +### domain +- Person + - Cards cards + - Dealer + - income + - Player + - int betAmount + - +- CardFactory + - createCard() +- Card + - String name + - int value +- Cards + - pickCard() + - getAllCards() + - getTotal() \ No newline at end of file diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java new file mode 100644 index 00000000..195383e8 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Card.java @@ -0,0 +1,14 @@ +package blackjack.domain.card; + +public class Card { + private final String name; + + public Card(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Card{}"; + } +} diff --git a/src/main/java/blackjack/domain/card/CardFactory.java b/src/main/java/blackjack/domain/card/CardFactory.java new file mode 100644 index 00000000..26e77a2e --- /dev/null +++ b/src/main/java/blackjack/domain/card/CardFactory.java @@ -0,0 +1,31 @@ +package blackjack.domain.card; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +public class CardFactory { + private final List cardPool; + + public CardFactory() { + this.cardPool = new ArrayList<>(); + makeCardPool(); + } + + private void makeCardPool() { + List figures = Arrays.asList("스페이드", "클로버", "하트", "다이아몬드"); + List values = Arrays.asList("2","3","4","5","6","7","8","9","K","Q","J","A"); + for (String figure:figures) { + for (String value:values) { + this.cardPool.add(value+figure); + } + } + } + + public Card createCard(){ + int index = new Random().nextInt(this.cardPool.size()); + String card = cardPool.get(index); + return new Card(card); + } +} diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java new file mode 100644 index 00000000..d56dee87 --- /dev/null +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -0,0 +1,25 @@ +package blackjack.domain.card; + +import java.util.List; + +public class Cards { + private CardFactory cardFactory; + private static List cardList; + + public String getAllCards() { + return cardList.toString(); + } + + public void getMoreCard() { + cardList.add(cardFactory.createCard()); + } + + public int getAceValue() { + //total 값이 10 이하이면 A=11, 10 이상이면 A=1 + return 0; + } + + public int getTotal(){ + return 0; + } +} diff --git a/src/main/java/blackjack/domain/person/Dealer.java b/src/main/java/blackjack/domain/person/Dealer.java new file mode 100644 index 00000000..7e51920f --- /dev/null +++ b/src/main/java/blackjack/domain/person/Dealer.java @@ -0,0 +1,9 @@ +package blackjack.domain.person; + +public class Dealer extends Person{ + private static int income; + + public Boolean match(Player player){ + return this.getTotal() > player.getTotal(); + } +} diff --git a/src/main/java/blackjack/domain/person/Person.java b/src/main/java/blackjack/domain/person/Person.java new file mode 100644 index 00000000..3dbb51cc --- /dev/null +++ b/src/main/java/blackjack/domain/person/Person.java @@ -0,0 +1,22 @@ +package blackjack.domain.person; + +import blackjack.domain.card.Cards; + +public abstract class Person { + private static final int MAX_NUM = 21; + private static Cards cards; + + protected int getTotal() { + return cards.getTotal(); + } + + public void getMoreCard() { + cards.getMoreCard(); + } + + public Boolean exceedMAX() { + return this.getTotal() > MAX_NUM; + } + + +} diff --git a/src/main/java/blackjack/domain/person/Player.java b/src/main/java/blackjack/domain/person/Player.java new file mode 100644 index 00000000..571a671f --- /dev/null +++ b/src/main/java/blackjack/domain/person/Player.java @@ -0,0 +1,5 @@ +package blackjack.domain.person; + +public class Player extends Person{ + +} From 1737995b67127bb9001f68dada4a10b64753d647 Mon Sep 17 00:00:00 2001 From: oliviarla Date: Mon, 12 Sep 2022 21:56:35 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EA=B9=8C=EC=A7=80=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackJackApplication.java | 34 ++++++++ src/main/java/blackjack/README.md | 79 +++++++++++++++---- src/main/java/blackjack/domain/card/Card.java | 19 ++++- .../blackjack/domain/card/CardFactory.java | 22 +++--- .../java/blackjack/domain/card/Cards.java | 29 ++++--- .../java/blackjack/domain/person/Dealer.java | 22 +++++- .../blackjack/domain/person/Participants.java | 71 +++++++++++++++++ .../java/blackjack/domain/person/Person.java | 24 ++++-- .../java/blackjack/domain/person/Player.java | 33 ++++++++ .../java/blackjack/domain/person/Status.java | 7 ++ .../blackjack/service/DistributeMoney.java | 5 ++ src/main/java/blackjack/view/InputView.java | 50 ++++++++++++ .../java/blackjack/domain/card/CardTest.java | 45 +++++++++++ .../blackjack/domain/person/DealerTest.java | 31 ++++++++ 14 files changed, 425 insertions(+), 46 deletions(-) create mode 100644 src/main/java/blackjack/BlackJackApplication.java create mode 100644 src/main/java/blackjack/domain/person/Participants.java create mode 100644 src/main/java/blackjack/domain/person/Status.java create mode 100644 src/main/java/blackjack/service/DistributeMoney.java create mode 100644 src/main/java/blackjack/view/InputView.java create mode 100644 src/test/java/blackjack/domain/card/CardTest.java create mode 100644 src/test/java/blackjack/domain/person/DealerTest.java diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java new file mode 100644 index 00000000..eab23766 --- /dev/null +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -0,0 +1,34 @@ +package blackjack; + +import blackjack.domain.person.Dealer; +import blackjack.domain.person.Participants; +import blackjack.domain.person.Player; +import blackjack.view.InputView; + +import java.util.List; + +public class BlackJackApplication { + private static final InputView inputView = new InputView(); + + public static void main(String[] args) throws Exception { + // player name과 배팅 금액 설정 후 객체 생성 + List players = inputView.makePlayers(); + Participants participants = new Participants(players); + + // 모두에게 카드 2장 할당 + participants.initCards(); + + // player에게 카드 추가로 뽑을지 여부 선택하도록 함 + participants.getMoreCard(inputView); + + // 모두의 카드 패, 총점 출력 + System.out.println(participants.getAllCards()); + + System.out.println(participants.getResultCards()); +// // 승패 여부 가린 후 최종 수익 계산 +// participants.match(); +// +// // 최종 수익 출력 +// participants.getIncomes(); + } +} diff --git a/src/main/java/blackjack/README.md b/src/main/java/blackjack/README.md index 2f3ef89f..398bf858 100644 --- a/src/main/java/blackjack/README.md +++ b/src/main/java/blackjack/README.md @@ -9,24 +9,69 @@ - 딜러 - 2장의 카드 합이 16 이하이면 카드 1장 추가 - 2장의 카드 합이 17 이상이면 동작 없음 +- 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다. +- 딜러와 플레이어가 모두 두 카드 합이 21인 경우 플레이어는 베팅한 금액을 돌려받는다. - 딜러가 21 초과 시 남은 플레이어는 무조건 승리해 배팅 금액 획득 ## 설계 +### CardFactory +상태 +- cardPool을 가진다. + +행동 +- cardPool을 생성하여 보관한다. +- cardPool에서 한 개의 card를 꺼내주고, 중복 방지를 위해 제거한다. + +### Card +상태 +- 모양과 숫자를 가진다. + +행동 +- K,Q,J라면 10을, 2~9 사이라면 해당 값을, A라면 1을 반환한다. + - +) A일 경우에 값을 11로 갖는 경우 체크는 Cards에서 대신한다. + +### Cards +상태 +- 카드 목록을 가진다. +- 새로운 카드를 가져올 수 있는 cardFactory를 가진다. +- 카드 전체의 값을 저장한다. + +행동 +- 카드 목록에 카드를 추가할 수 있다. +- 카드 전체의 값을 반환할 수 있다. + +### Person +상태 +- Cards 객체 보유하여 카드 목록과 카드의 총점 정보를 가진다. +- 게임의 승패여부를 가짐 + +행동 +- 카드 총점을 반환할 수 있다. +- 새 카드를 뽑을 수 있는지 판별한다. + +### Dealer +상태 +- 플레이어별 게임 결과에 따른 총 수익 금액을 가진다. + +행동 +- 16이하라면 새 카드를 뽑는다. +- 수익 금액을 증감한다. +- 21 초과 시 무조건 Lose + +### Player +상태 +- 배팅 금액을 가진다. +- 수익 금액을 가진다. + +행동 +- 딜러와 매칭하여 승패를 가린 후 Status 변경 +- Status에 따라 수익 금액을 증감한다. + +### Participants +상태 +- 참가자 목록(플레이어들 + 딜러)을 가진다. + +행동 +- 모든 플레이어와 딜러의 승패를 가린다. +- 딜러와 플레이어의 수익 금액을 최종 결정한다. -### domain -- Person - - Cards cards - - Dealer - - income - - Player - - int betAmount - - -- CardFactory - - createCard() -- Card - - String name - - int value -- Cards - - pickCard() - - getAllCards() - - getTotal() \ No newline at end of file diff --git a/src/main/java/blackjack/domain/card/Card.java b/src/main/java/blackjack/domain/card/Card.java index 195383e8..73925053 100644 --- a/src/main/java/blackjack/domain/card/Card.java +++ b/src/main/java/blackjack/domain/card/Card.java @@ -2,13 +2,28 @@ public class Card { private final String name; + private final Character number; - public Card(String name) { + public Card(String name, Character number) { this.name = name; + this.number = number; + } + + public int getNumber() throws Exception { + if(number>= '2' && number <= '9') { + return number-'0'; + } + if(number == 'K' || number == 'Q' || number == 'J') { + return 10; + } + if(number == 'A') { + return 1; //if card's total value is less than 11, then add 10 additionally. + } + throw new Exception("can't return value of number"); } @Override public String toString() { - return "Card{}"; + return number + name; } } diff --git a/src/main/java/blackjack/domain/card/CardFactory.java b/src/main/java/blackjack/domain/card/CardFactory.java index 26e77a2e..862212b6 100644 --- a/src/main/java/blackjack/domain/card/CardFactory.java +++ b/src/main/java/blackjack/domain/card/CardFactory.java @@ -6,26 +6,28 @@ import java.util.Random; public class CardFactory { - private final List cardPool; + private final List cardPool; public CardFactory() { - this.cardPool = new ArrayList<>(); - makeCardPool(); + this.cardPool = initCardPool(); } - private void makeCardPool() { + protected List initCardPool() { + List cardList = new ArrayList<>(); List figures = Arrays.asList("스페이드", "클로버", "하트", "다이아몬드"); - List values = Arrays.asList("2","3","4","5","6","7","8","9","K","Q","J","A"); + List numbers = Arrays.asList('2','3','4','5','6','7','8','9','K','Q','J','A'); for (String figure:figures) { - for (String value:values) { - this.cardPool.add(value+figure); + for (Character number:numbers) { + cardList.add(new Card(figure, number)); } } + return cardList; } - public Card createCard(){ + public Card selectCard(){ int index = new Random().nextInt(this.cardPool.size()); - String card = cardPool.get(index); - return new Card(card); + Card card = cardPool.get(index); + cardPool.remove(index); + return card; } } diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java index d56dee87..cbbfab02 100644 --- a/src/main/java/blackjack/domain/card/Cards.java +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -1,25 +1,36 @@ package blackjack.domain.card; +import java.util.ArrayList; import java.util.List; public class Cards { - private CardFactory cardFactory; - private static List cardList; + private final List cardList; + private Integer total; + + public Cards() { + this.cardList = new ArrayList<>(); + this.total = 0; + } public String getAllCards() { return cardList.toString(); } - public void getMoreCard() { - cardList.add(cardFactory.createCard()); + public void getMoreCard(CardFactory cardFactory) throws Exception { + Card card = cardFactory.selectCard(); + cardList.add(card); + Integer value = card.getNumber(); + if(total < 11 && value==1){ + total += 10; //handle if a number of card is 'A' + } + total += card.getNumber(); } - public int getAceValue() { - //total 값이 10 이하이면 A=11, 10 이상이면 A=1 - return 0; + public int getTotal(){ + return total; } - public int getTotal(){ - return 0; + public int getSize() { + return this.cardList.size(); } } diff --git a/src/main/java/blackjack/domain/person/Dealer.java b/src/main/java/blackjack/domain/person/Dealer.java index 7e51920f..fd18e007 100644 --- a/src/main/java/blackjack/domain/person/Dealer.java +++ b/src/main/java/blackjack/domain/person/Dealer.java @@ -3,7 +3,25 @@ public class Dealer extends Person{ private static int income; - public Boolean match(Player player){ - return this.getTotal() > player.getTotal(); + public Dealer() { + super(); + } + + @Override + public boolean needMoreCard() { + return this.getTotal() <= 16; + } + + @Override + public String getAllCards() { + return "딜러 카드: "+cards.getAllCards(); + } + + public boolean exceedMAX() { + if(this.getTotal() > MAX_NUM){ + this.changeStatus(Status.LOSE); + return true; + } + return false; } } diff --git a/src/main/java/blackjack/domain/person/Participants.java b/src/main/java/blackjack/domain/person/Participants.java new file mode 100644 index 00000000..2ef492a3 --- /dev/null +++ b/src/main/java/blackjack/domain/person/Participants.java @@ -0,0 +1,71 @@ +package blackjack.domain.person; + +import blackjack.domain.card.CardFactory; +import blackjack.view.InputView; + +import java.util.List; + +public class Participants { + private final CardFactory cardFactory; + private final Dealer dealer; + private final List players; + + public Participants(List players) { + this.cardFactory = new CardFactory(); + this.dealer = new Dealer(); + this.players = players; + } + + public void initCards() throws Exception { + dealer.initCards(cardFactory); + for(Player player : players){ + player.initCards(cardFactory); + } + } + + public void getMoreCard(InputView inputView) throws Exception { + //player 카드 추가 할/말 + for(Player player : players){ + while(player.needMoreCard()) { + if(inputView.wantMoreCard(player)) { + player.getMoreCard(cardFactory); + System.out.println(player.getAllCards()); + continue; + } + break; + } + } + + // dealer 카드 한장 추가 할/말 + if(dealer.needMoreCard()){ + dealer.getMoreCard(cardFactory); + System.out.println("딜러는 16이하라 한장의 카드를 더 받았습니다."); + } + } + + public void match() { + + } + + public String getAllCards() { + String ret = ""; + ret += dealer.getAllCards()+"\n"; + for(Player player : players) { + ret += player.getAllCards()+"\n"; + } + return ret; + } + + public String getResultCards() { + String ret = ""; + ret += dealer.getAllCards() + " - 결과: " +dealer.getTotal() + "\n"; + for(Player player : players) { + ret += player.getAllCards() + " - 결과: " +player.getTotal() + "\n"; + } + return ret; + } + + public void getIncomes() { + + } +} diff --git a/src/main/java/blackjack/domain/person/Person.java b/src/main/java/blackjack/domain/person/Person.java index 3dbb51cc..962998dd 100644 --- a/src/main/java/blackjack/domain/person/Person.java +++ b/src/main/java/blackjack/domain/person/Person.java @@ -1,22 +1,34 @@ package blackjack.domain.person; +import blackjack.domain.card.CardFactory; import blackjack.domain.card.Cards; public abstract class Person { - private static final int MAX_NUM = 21; - private static Cards cards; + protected static final int MAX_NUM = 21; + protected final Cards cards = new Cards(); + private Status status = Status.PROCESSING; protected int getTotal() { return cards.getTotal(); } - public void getMoreCard() { - cards.getMoreCard(); + public void changeStatus(Status status) { + this.status = status; } - public Boolean exceedMAX() { - return this.getTotal() > MAX_NUM; + public Status getStatus() { + return status; + } + public void initCards(CardFactory cardFactory) throws Exception { + cards.getMoreCard(cardFactory); + cards.getMoreCard(cardFactory); + } + + public void getMoreCard(CardFactory cardFactory) throws Exception { + cards.getMoreCard(cardFactory); } + public abstract boolean needMoreCard(); + public abstract String getAllCards(); } diff --git a/src/main/java/blackjack/domain/person/Player.java b/src/main/java/blackjack/domain/person/Player.java index 571a671f..60132b29 100644 --- a/src/main/java/blackjack/domain/person/Player.java +++ b/src/main/java/blackjack/domain/person/Player.java @@ -1,5 +1,38 @@ package blackjack.domain.person; public class Player extends Person{ + private final String name; + private final Integer betAmount; + public String getName() { + return name; + } + + public Player(String name, Integer betAmount) { + super(); + this.name = name; + this.betAmount = betAmount; + } + + @Override + public boolean needMoreCard() { + return this.getTotal()<21; + } + + @Override + public String getAllCards(){ + return this.name+"카드: "+cards.getAllCards(); + } + + public Boolean isWin(Dealer dealer){ + if(dealer.getStatus()==Status.LOSE) { + this.changeStatus(Status.WIN); + return true; + } + if(this.getTotal()>21) { + this.changeStatus(Status.LOSE); + return false; + } + return this.getTotal() > dealer.getTotal(); + } } diff --git a/src/main/java/blackjack/domain/person/Status.java b/src/main/java/blackjack/domain/person/Status.java new file mode 100644 index 00000000..f9c53dde --- /dev/null +++ b/src/main/java/blackjack/domain/person/Status.java @@ -0,0 +1,7 @@ +package blackjack.domain.person; + +public enum Status { + PROCESSING, + WIN, + LOSE +} diff --git a/src/main/java/blackjack/service/DistributeMoney.java b/src/main/java/blackjack/service/DistributeMoney.java new file mode 100644 index 00000000..9bf3f248 --- /dev/null +++ b/src/main/java/blackjack/service/DistributeMoney.java @@ -0,0 +1,5 @@ +package blackjack.service; + +public class DistributeMoney { + +} diff --git a/src/main/java/blackjack/view/InputView.java b/src/main/java/blackjack/view/InputView.java new file mode 100644 index 00000000..9c91f3f5 --- /dev/null +++ b/src/main/java/blackjack/view/InputView.java @@ -0,0 +1,50 @@ +package blackjack.view; + +import blackjack.domain.person.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; + +public class InputView { + private final Scanner scanner = new Scanner(System.in); + private static final String regex = ", "; + public List makePlayers(){ + System.out.println("게임에 참여할 사람의 이름을 입력하세요.(쉼표 기준으로 분리)"); + List players = new ArrayList<>(); + String namesRaw = scanner.nextLine(); + List names = Arrays.asList(namesRaw.split(regex)); + List betAmounts = getBetAmounts(names); + + for(int i=0;i getBetAmounts(List names){ + List betAmounts = new ArrayList<>(); + for(String name: names){ + System.out.println(name + "의 배팅 금액은?"); + Integer betAmount = Integer.valueOf(scanner.nextLine()); + betAmounts.add(betAmount); + } + return betAmounts; + } + + public boolean wantMoreCard(Player player) { + System.out.println(player.getName() + "는 한장의 카드를 더 받겠습니까?(예는 y, 아니오는 n)"); + String s = scanner.nextLine(); + + if(!s.equals("y") && !s.equals("n")){ + throw new IllegalArgumentException("y 혹은 n을 입력해야 합니다."); + } + + if(s.equals("y")) { + System.out.println(s); + return true; + } + return false; + } +} diff --git a/src/test/java/blackjack/domain/card/CardTest.java b/src/test/java/blackjack/domain/card/CardTest.java new file mode 100644 index 00000000..5f436b1a --- /dev/null +++ b/src/test/java/blackjack/domain/card/CardTest.java @@ -0,0 +1,45 @@ +package blackjack.domain.card; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CardTest { + CardFactory cardFactory; + @BeforeEach + public void setUp() { + cardFactory = new CardFactory(); + } + + @Test + public void testCardFactory(){ + List cardList = cardFactory.initCardPool(); + assertThat(cardList.size()).isEqualTo(12 * 4); + } + + @Test + void testCards() throws Exception { + Cards cards = new Cards(); + cards.getMoreCard(cardFactory); + cards.getMoreCard(cardFactory); + System.out.println(cards.getAllCards()); + } + + @Test + public void testCardNumber() throws Exception { + Card card = new Card("", 'Q'); + Card card2 = new Card("", '3'); + + assertThat(card.getNumber()).isEqualTo(10); + assertThat(card2.getNumber()).isEqualTo(3); + } + + @Test + public void testCardNumberIfAce() throws Exception { + Card card = new Card("", 'A'); + assertThat(card.getNumber()).isEqualTo(1); + } +} diff --git a/src/test/java/blackjack/domain/person/DealerTest.java b/src/test/java/blackjack/domain/person/DealerTest.java new file mode 100644 index 00000000..a6cc1691 --- /dev/null +++ b/src/test/java/blackjack/domain/person/DealerTest.java @@ -0,0 +1,31 @@ +package blackjack.domain.person; + +import blackjack.domain.card.CardFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DealerTest { + Dealer dealer; + CardFactory cardFactory; + + @BeforeEach + void setUp(){ + dealer = new Dealer(); + cardFactory = new CardFactory(); + } + + @Test + void initTest() throws Exception { + dealer.initCards(cardFactory); + assertThat(dealer.cards.getSize()).isEqualTo(2); + } + + @Test + void getMoreTest() throws Exception { + dealer.getMoreCard(cardFactory); + assertThat(dealer.cards.getSize()).isEqualTo(1); + } + +} From dae489aa8dd3652f1504fa99754eca3b7b81cbf2 Mon Sep 17 00:00:00 2001 From: oliviarla Date: Sun, 18 Sep 2022 11:34:42 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=EB=B8=94=EB=9E=99=EC=9E=AD=20?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/blackjack/BlackJackApplication.java | 13 ++-- .../java/blackjack/domain/card/Cards.java | 2 +- .../java/blackjack/domain/person/Dealer.java | 6 +- .../blackjack/domain/person/Participants.java | 24 ++++--- .../java/blackjack/domain/person/Person.java | 21 ++++-- .../java/blackjack/domain/person/Player.java | 70 ++++++++++++++++--- .../java/blackjack/domain/person/Status.java | 3 +- 7 files changed, 107 insertions(+), 32 deletions(-) diff --git a/src/main/java/blackjack/BlackJackApplication.java b/src/main/java/blackjack/BlackJackApplication.java index eab23766..ad039529 100644 --- a/src/main/java/blackjack/BlackJackApplication.java +++ b/src/main/java/blackjack/BlackJackApplication.java @@ -22,13 +22,12 @@ public static void main(String[] args) throws Exception { participants.getMoreCard(inputView); // 모두의 카드 패, 총점 출력 - System.out.println(participants.getAllCards()); - System.out.println(participants.getResultCards()); -// // 승패 여부 가린 후 최종 수익 계산 -// participants.match(); -// -// // 최종 수익 출력 -// participants.getIncomes(); + + // 승패 여부 가린 후 최종 수익 계산 + participants.match(); + + // 최종 수익 출력 + System.out.println(participants.getIncomes()); } } diff --git a/src/main/java/blackjack/domain/card/Cards.java b/src/main/java/blackjack/domain/card/Cards.java index cbbfab02..2b20485b 100644 --- a/src/main/java/blackjack/domain/card/Cards.java +++ b/src/main/java/blackjack/domain/card/Cards.java @@ -5,7 +5,7 @@ public class Cards { private final List cardList; - private Integer total; + private int total; public Cards() { this.cardList = new ArrayList<>(); diff --git a/src/main/java/blackjack/domain/person/Dealer.java b/src/main/java/blackjack/domain/person/Dealer.java index fd18e007..ba40bcec 100644 --- a/src/main/java/blackjack/domain/person/Dealer.java +++ b/src/main/java/blackjack/domain/person/Dealer.java @@ -1,7 +1,6 @@ package blackjack.domain.person; public class Dealer extends Person{ - private static int income; public Dealer() { super(); @@ -17,6 +16,11 @@ public String getAllCards() { return "딜러 카드: "+cards.getAllCards(); } + @Override + public String getIncome() { + return "딜러: " + this.income +"\n"; + } + public boolean exceedMAX() { if(this.getTotal() > MAX_NUM){ this.changeStatus(Status.LOSE); diff --git a/src/main/java/blackjack/domain/person/Participants.java b/src/main/java/blackjack/domain/person/Participants.java index 2ef492a3..f50e18c5 100644 --- a/src/main/java/blackjack/domain/person/Participants.java +++ b/src/main/java/blackjack/domain/person/Participants.java @@ -44,16 +44,17 @@ public void getMoreCard(InputView inputView) throws Exception { } public void match() { + // 딜러가 21 초과시 모든 플레이어 승리 + if (dealer.getTotal()>21){ + for(Player player : players) { + player.win(dealer); + dealer.changeStatus(Status.LOSE); + } + } - } - - public String getAllCards() { - String ret = ""; - ret += dealer.getAllCards()+"\n"; for(Player player : players) { - ret += player.getAllCards()+"\n"; + player.match(dealer); } - return ret; } public String getResultCards() { @@ -65,7 +66,12 @@ public String getResultCards() { return ret; } - public void getIncomes() { - + public String getIncomes() { + String ret = ""; + ret += dealer.getIncome(); + for(Player player : players) { + ret += player.getIncome(); + } + return ret; } } diff --git a/src/main/java/blackjack/domain/person/Person.java b/src/main/java/blackjack/domain/person/Person.java index 962998dd..aed1af78 100644 --- a/src/main/java/blackjack/domain/person/Person.java +++ b/src/main/java/blackjack/domain/person/Person.java @@ -5,8 +5,15 @@ public abstract class Person { protected static final int MAX_NUM = 21; - protected final Cards cards = new Cards(); - private Status status = Status.PROCESSING; + protected final Cards cards; + protected double income; + private Status status; + + public Person() { + this.cards = new Cards(); + this.income = 0; + this.status = Status.PROCESSING; + } protected int getTotal() { return cards.getTotal(); @@ -20,8 +27,8 @@ public Status getStatus() { return status; } public void initCards(CardFactory cardFactory) throws Exception { - cards.getMoreCard(cardFactory); - cards.getMoreCard(cardFactory); + getMoreCard(cardFactory); + getMoreCard(cardFactory); } public void getMoreCard(CardFactory cardFactory) throws Exception { @@ -31,4 +38,10 @@ public void getMoreCard(CardFactory cardFactory) throws Exception { public abstract boolean needMoreCard(); public abstract String getAllCards(); + + public abstract String getIncome(); + + public void addIncome(double income){ + this.income += income; + } } diff --git a/src/main/java/blackjack/domain/person/Player.java b/src/main/java/blackjack/domain/person/Player.java index 60132b29..f2052f2d 100644 --- a/src/main/java/blackjack/domain/person/Player.java +++ b/src/main/java/blackjack/domain/person/Player.java @@ -24,15 +24,67 @@ public String getAllCards(){ return this.name+"카드: "+cards.getAllCards(); } - public Boolean isWin(Dealer dealer){ - if(dealer.getStatus()==Status.LOSE) { - this.changeStatus(Status.WIN); - return true; - } - if(this.getTotal()>21) { - this.changeStatus(Status.LOSE); - return false; + public void match(Dealer dealer){ + // player의 status가 PROCESSING이라면 승부 시작 + if (this.getStatus() == Status.PROCESSING) { + int thisPlayerScore = this.getTotal(); + int dealerScore = dealer.getTotal(); + + // player total > 21이면 + if(thisPlayerScore>21) { + // player lose, 배팅금액 lose + this.changeStatus(Status.LOSE); + this.addIncome(-this.betAmount); + dealer.addIncome(this.betAmount); + return; + } + + // player total == 21이고, card 개수 2개일 때 + if(thisPlayerScore==21 && this.cards.getSize()==2){ + // player win, 배팅금액 * 1.5배 get + this.changeStatus(Status.LOSE); + this.addIncome(this.betAmount*1.5); + dealer.addIncome(-this.betAmount*1.5); + return; + } + + // player total ==21 && dealer total ==21 + if(thisPlayerScore ==21 && dealerScore==21){ + // player draw, 배팅금액 get + this.changeStatus(Status.DRAW); + this.addIncome(this.betAmount); + dealer.addIncome(-this.betAmount); + return; + } + + // player total > dealer total + if(thisPlayerScore > dealerScore){ + // player win, 배팅금액 get + this.changeStatus(Status.WIN); + this.addIncome(this.betAmount); + dealer.addIncome(-this.betAmount); + return; + } + + // player total < dealer total + if(thisPlayerScore < dealerScore){ + // player lose, 배팅금액 lose + this.changeStatus(Status.LOSE); + this.addIncome(-this.betAmount); + dealer.addIncome(this.betAmount); + return; + } } - return this.getTotal() > dealer.getTotal(); + } + + @Override + public String getIncome() { + return this.name + ": " + this.income +"\n"; + } + + public void win(Dealer dealer) { + this.changeStatus(Status.WIN); + this.addIncome(this.betAmount); + dealer.addIncome(-this.betAmount); } } diff --git a/src/main/java/blackjack/domain/person/Status.java b/src/main/java/blackjack/domain/person/Status.java index f9c53dde..3a880f8c 100644 --- a/src/main/java/blackjack/domain/person/Status.java +++ b/src/main/java/blackjack/domain/person/Status.java @@ -3,5 +3,6 @@ public enum Status { PROCESSING, WIN, - LOSE + LOSE, + DRAW }