Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
cef9213
Refact : CarTest 리팩토링
this-is-spear Aug 15, 2022
a9888c3
Refact : Lambda 리팩토링
this-is-spear Aug 15, 2022
6eac39f
Refact : StreamStudy 요구사항 1번 해결
this-is-spear Aug 15, 2022
bcd9140
StreamStudy 요구사항 2번 해결
this-is-spear Aug 15, 2022
d57d1ac
Refct : Optional 1번 요구사항 해결
this-is-spear Aug 15, 2022
cac2d45
Refct : Optional 2번 요구사항 해결
this-is-spear Aug 15, 2022
4434455
Refct : Optional 3번 요구사항 해결
this-is-spear Aug 15, 2022
5e0a84b
Refact : Lambda.java 코드 리팩토링
this-is-spear Aug 31, 2022
083322b
Refact : StreamStudy.java 코드 리팩토링
this-is-spear Aug 31, 2022
4096487
Refact: User 리팩토링
this-is-spear Aug 31, 2022
6ca54c8
Refact : Computer 리팩토링
this-is-spear Aug 31, 2022
486d574
Refact : User 리팩토링
this-is-spear Aug 31, 2022
7d783ea
Refact : ComputerStore 리팩토링
this-is-spear Aug 31, 2022
eae04b8
Docs : 블랙잭 모델링
this-is-spear Aug 31, 2022
c675df9
Feat : Card 구현 및 테스트
this-is-spear Aug 31, 2022
fac6f7a
Feat : OneCards 기능 구현 및 테스트
this-is-spear Aug 31, 2022
16ddf56
Feat : 참가자 구현 및 테스트
this-is-spear Aug 31, 2022
ab45912
Feat : Cards 구현 및 테스트
this-is-spear Aug 31, 2022
078122a
Refact : Cards 리팩토링
this-is-spear Aug 31, 2022
1d26d8f
Feat : 딜러 구현 및 테스트
this-is-spear Sep 1, 2022
a4e2280
Refact : OneCards 코드 리팩토링
this-is-spear Sep 1, 2022
eca06c8
Refact : ParticipantsTest -> ParticipantTest 이름 수정
this-is-spear Sep 1, 2022
2b39e03
Feat : Participants 구현 및 테스트
this-is-spear Sep 1, 2022
656e032
Refact : 카드 패키지 응집
this-is-spear Sep 1, 2022
ce9ffa2
Refact : 참여자와 딜러 패키지 이름 수정
this-is-spear Sep 1, 2022
b72fba9
Refact : Cards 생성자 리팩토링
this-is-spear Sep 1, 2022
4ff7092
Refact : Participant 리팩토링
this-is-spear Sep 1, 2022
3c1fc7b
Feat : IO, Main 클래스 구현
this-is-spear Sep 1, 2022
bce2d18
Refact : Cards 리팩토링
this-is-spear Sep 12, 2022
b045fed
Fix : 입력 수정
this-is-spear Sep 12, 2022
9c1b9af
Refact : BlackjackGame 코드 분리
this-is-spear Sep 12, 2022
d3483ac
Docs : Dealer 주석 작성
this-is-spear Sep 12, 2022
e26737b
Refact : OneCards 의존성 수정
this-is-spear Sep 12, 2022
f5942ef
Refact : BlackjackInputService -> BlackjackGameService 이름 수정
this-is-spear Sep 12, 2022
d7155f0
Feat : BlackjackOutputService 구현 및 테스트
this-is-spear Sep 12, 2022
9d94f14
Refact : BlackjackOutputService 의존성 수정
this-is-spear Sep 12, 2022
a2cdc07
Refact : 코드 리팩토링
this-is-spear Sep 12, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 66 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,73 @@
## [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)
- 상태
- 카드패에는 카드가 포함되어 있다.
- 처음 카드패는 최소 두 장의 카드가 존재해야 한다.
- 행위
- 카드패의 숫자 합을 출력한다.
- Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다.
- 카드패와 숫자 합을 출력준다.

### 카드(Card)
- 상태
- 카드는 ACE, 2, 3, 4, 5, 6, 7, 8, 9, 10, King, Queen, Jack 중 하나의 숫자를 가진다.
- 카드덱은 클로버, 하트, 다이아몬드, 스페이드 중 하나의 타입을 가진다.

### 카드덱(OneCard)
- 상태
- 카드덱에는 52 종류의 카드가 저장되어 있다.
- 카드덱이 생성되면 카드덱을 섞는다.
- 행위
- 카드덱에서 카드를 뽑아 건네준다.

### 게임
- 행위
- 이름 등록
- 문자열을 받아 이름을 등록한다.
- 이름은 `,` 단위로 분리한다.
- 배팅 금액 등록
- 순서대로 배팅 금액을 등록한다.
- 배팅 금액은 0 이상의 정수이다.
- 카드를 모두에게 분배한다.
- 카드를 참여자와 딜러에게 두 장씩 분배한다.
- 참여자에게 카드 한 장 분배
- 카드덱에서 꺼내 참여자에게 카드를 분배한다.
- 게임 결과를 발표한다.
- 참여자들과 딜러의 카드 패를 확인한다.
- 배팅 금액 정보를 기반으로 금액을 분배한다.
28 changes: 28 additions & 0 deletions src/main/java/nextstep/blackjack/blackjack/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package nextstep.blackjack.blackjack;

import nextstep.blackjack.blackjack.member.Dealer;
import nextstep.blackjack.blackjack.member.Participants;
import nextstep.blackjack.blackjack.service.BlackjackGameService;
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);
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<String, Integer> scores = blackjackResult.getResult(participants, dealer);
Map<String, BigDecimal> result = blackjackResult.distributeMoney(participants, dealer);

ioService.outputScores(scores);
ioService.outputResult(result);
}
}
37 changes: 37 additions & 0 deletions src/main/java/nextstep/blackjack/blackjack/member/Dealer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package nextstep.blackjack.blackjack.member;

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(Cards cards) {
this.cards = cards;
}

/**
* 딜러는 카드값이 CRITERION을 넘지 않으면 카드를 한 장 더 뽑는다.*
* @param oneCards
*/
public Dealer(OneCards oneCards) {
Cards cards = new Cards(Arrays.asList(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;
}
}
46 changes: 46 additions & 0 deletions src/main/java/nextstep/blackjack/blackjack/member/Participant.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package nextstep.blackjack.blackjack.member;

import nextstep.blackjack.blackjack.onecards.Cards;
import nextstep.blackjack.blackjack.onecards.OneCards;

import java.math.BigDecimal;

public class Participant {
private final String username;
private final BigDecimal bettingMoney;
private 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 Participant(String username, BigDecimal bettingMoney, OneCards oneCards) {
this(username, bettingMoney, new Cards(oneCards));
}

public String getUsername() {
return username;
}

public BigDecimal getBettingMoney() {
return bettingMoney;
}

public Cards getCards() {
return cards;
}

public void updateCards(Cards cards) {
this.cards = cards;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package nextstep.blackjack.blackjack.member;

import nextstep.blackjack.blackjack.onecards.OneCards;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class Participants {

private final List<Participant> participants;

public Participants(List<Participant> participants) {
this.participants = participants;
}

public List<Participant> getParticipants() {
return new ArrayList<>(participants);
}

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);
}
}
39 changes: 39 additions & 0 deletions src/main/java/nextstep/blackjack/blackjack/onecards/Card.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package nextstep.blackjack.blackjack.onecards;

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 CardNumber getCardNumber() {
return cardNumber;
}

public String name() {
return cardNumber.number() + cardType.getType();
}

@Override
public String toString() {
return cardNumber.number() + 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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package nextstep.blackjack.blackjack.onecards;

public enum CardNumber {
ACE("A", 1),
TWO("2", 2),
THREE("3", 3),
FOUR("4", 4),
FIVE("5", 5),
SIX("6", 6),
SEVEN("7", 7),
EIGHT("8", 8),
NINE("9", 9),
TEN("10", 10),
KING("K", 10),
QUEEN("Q", 10),
JACK("J", 10);
private final String cardNumber;
private final int score;

CardNumber(String cardNumber, int score) {
this.cardNumber = cardNumber;
this.score = score;
}

String number() {
return cardNumber;
}

int score() {
return score;
}

boolean isAce() {
return this.equals(CardNumber.ACE);
}

@Override
public String toString() {
return cardNumber;
}
}
23 changes: 23 additions & 0 deletions src/main/java/nextstep/blackjack/blackjack/onecards/CardType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package nextstep.blackjack.blackjack.onecards;

public enum CardType {
HEART("하트"),
DIAMOND("다이아몬드"),
CLOVER("클로버"),
SPADE("스페이드");

private final String cardType;

CardType(String cardType) {
this.cardType = cardType;
}

String getType() {
return cardType;
}

@Override
public String toString() {
return cardType;
}
}
Loading