Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[1단계 - 블랙잭] 기론(김규철) 미션 제출합니다. #226

Merged
merged 77 commits into from
Mar 16, 2022
Merged
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
5aa725d
test: 테스트 작성
Juhyung990122 Mar 8, 2022
67807ba
feat: 추상클래스 Car 생성
Juhyung990122 Mar 8, 2022
ee1a9fe
feat: 종류별 자동차 도메인 구현
Juhyung990122 Mar 8, 2022
b28bbe9
feat: 연료 계산 및 주입 기능 구현
Juhyung990122 Mar 8, 2022
7161dc5
docs: 기능 요구 사항 작성
Juhyung990122 Mar 8, 2022
2ffc15c
feat: 참가자 이름 입력 기능 구현
Juhyung990122 Mar 9, 2022
6592e9d
feat: 유저 도메인 생성
Juhyung990122 Mar 9, 2022
6f32dec
feat: 카드, 카드팩토리 도메인 생성 및 캐싱
Juhyung990122 Mar 9, 2022
ec380dd
feat: Player,Dealer 도메인 생성 및 Dto변환 구현
Juhyung990122 Mar 9, 2022
65ea3ec
feat: 카드 넘버에 이름 추가
Juhyung990122 Mar 9, 2022
807fbf7
feat: CardDto 변환로직 구현 및 UserDto 리턴타입 수정
Juhyung990122 Mar 9, 2022
898beda
feat: 딜러와 참가자 카드 출력 기능 구현
Juhyung990122 Mar 9, 2022
bd394f5
feat: player 생성 및 카드 분배 기능 구현
Juhyung990122 Mar 9, 2022
f7f5050
feat: 딜러 카드 공개 로직 추가
Juhyung990122 Mar 9, 2022
66f520b
feat: 한장의 카드 받는 기능 구현
Juhyung990122 Mar 9, 2022
ea9fa87
refactor: 뷰의 책임을 컨트롤러로 이전
Juhyung990122 Mar 9, 2022
ac35b89
test: 카드분배기능 테스트 작성
Juhyung990122 Mar 10, 2022
05827d6
feat: 카드 추가 기능 구현
Juhyung990122 Mar 10, 2022
8750ed4
feat: 카드 추가 질의 기능 구현
Juhyung990122 Mar 10, 2022
0542747
feat: 플레이어 소지 카드 출력 구현
Juhyung990122 Mar 10, 2022
002889e
chore: 안내메세지 추가
Juhyung990122 Mar 10, 2022
bf87a2e
feat: 카드 리스트를 일급컬렉션으로 변환
Juhyung990122 Mar 10, 2022
b39dc59
feat: 카드 점수 계산 기능 구현
Juhyung990122 Mar 10, 2022
e4e796a
refactor: 접근제어자 수정
Juhyung990122 Mar 10, 2022
a64fdc1
test: Cards 테스트 추가
Juhyung990122 Mar 10, 2022
3557611
feat: 딜러 카드 추가 조건 구현
Juhyung990122 Mar 10, 2022
f58dd8f
feat: 최종 결과 출력 기능 구현
Juhyung990122 Mar 10, 2022
07a3b75
refactor: 미사용 코드 삭제
Juhyung990122 Mar 10, 2022
8c7ee51
feat: 최종 승패 출력 기능 구현
Juhyung990122 Mar 10, 2022
e76aa89
feat: 결과 DTO 생성
Juhyung990122 Mar 10, 2022
8159fe2
feat: 승패 판단 로직 수정
Juhyung990122 Mar 10, 2022
afaf8e5
test: 승패 판정 테스트 작성
Juhyung990122 Mar 10, 2022
314393a
feat: 입력 검증 로직 구현
Juhyung990122 Mar 10, 2022
b3c44d5
refactor: Controller 구조개선 및 Dealer 도메인 수정
Juhyung990122 Mar 10, 2022
ef0935d
feat: 카드 추가 로직 입력 형식 검증
Juhyung990122 Mar 10, 2022
0ac0ff6
refactor: 승패 판단 로직 수정
Juhyung990122 Mar 10, 2022
8cae334
refactor: 패키지 분리 및 코드포멧팅
Juhyung990122 Mar 10, 2022
2393038
refactor: 변수에 final 적용 및 매서드에 람다식 적용
Gyuchool Mar 12, 2022
dbc2aa8
refactor: public 상수 private으로 변경 및 매직넘버 제거
Gyuchool Mar 12, 2022
6e80286
refactor: 처음 카드들 초기화 하는 매서드 네이밍 수정
Gyuchool Mar 12, 2022
da8abdd
refactor: cards 도메인에 맞는 자료구조 변경 및 부생성자 생성
Gyuchool Mar 12, 2022
3ed5fe1
refactor: players일급 컬렉션 추가
Gyuchool Mar 12, 2022
c6a1387
refactor: controller가 하는 일 줄이도록 수정
Gyuchool Mar 12, 2022
b42b547
refactor: 방어적 복사 적용
Gyuchool Mar 12, 2022
3f646fc
test: 유저 입력한 만큼 참가자 생성되는지 테스트
Gyuchool Mar 12, 2022
f7af5bb
refactor: convention에 맞게 수정
Gyuchool Mar 12, 2022
5cb9d5a
refactor: ace찾는 로직 get함수 제거
Gyuchool Mar 13, 2022
d100e02
refactor: indent 2 제거
Gyuchool Mar 13, 2022
56ad261
refactor: CARD_CACHE 자료구조 Queue로 변경
Gyuchool Mar 14, 2022
d8586d9
refactor: 덱에서 캐싱 제거
Gyuchool Mar 14, 2022
ba13f67
refactor: 정적 팩토리 메서드 네이밍 수정
Gyuchool Mar 14, 2022
d03126b
refactor: ace찾는 매서드 및 네이밍 수정
Gyuchool Mar 14, 2022
6ea48e5
fix: 게임 규칙에 맞게 21이 넘으면 카드를 더 받을지 안 물어보도록 수정
Gyuchool Mar 14, 2022
2d334d3
refactor: dealer도 cardFactory를 통해서 카드 받도록 수정
Gyuchool Mar 14, 2022
2e80acc
refactor: y와 n 매직 넘버 제거
Gyuchool Mar 14, 2022
83b7f5b
refactor: dealer카드를 더 받는지 확인하는 매서드 네이밍 수정
Gyuchool Mar 14, 2022
5d622a5
refactor: get함수 제거
Gyuchool Mar 14, 2022
87a951e
test: 통계 테스트 추가
Gyuchool Mar 14, 2022
4022d7d
refactor: 디렉토리 이름 변경 및 카드에 캐싱 적용
Gyuchool Mar 15, 2022
79540cd
refactor: drawOneCard를 통한 initCards매서드 수정
Gyuchool Mar 15, 2022
1268c7b
refactor: 매서드 분리 및 매서드 메서드 네이밍 수정
Gyuchool Mar 15, 2022
08781bb
refactor: bustLine검증 책임 cards로 이전
Gyuchool Mar 15, 2022
3b9a5e5
refactor: 우승자 결정 로직 PlayerResult로 옮김
Gyuchool Mar 15, 2022
51f79ec
fix: 블랙잭 규칙에 맞게 수정
Gyuchool Mar 15, 2022
178d91b
refactor: hit일때 boolean값을 반환하도록 수정
Gyuchool Mar 15, 2022
2eb9509
refactor: 네이밍 수정
Gyuchool Mar 15, 2022
e8c5cc1
refactor: dealer Cards를 받아 생성하도록 수정
Gyuchool Mar 15, 2022
dc38f44
test: UserTest 추가
Gyuchool Mar 15, 2022
2d4c447
refactor: 딜러 승패무 횟수 얻는 로직 수정
Gyuchool Mar 15, 2022
63786b2
refactor: 승패 로직 수정
Gyuchool Mar 15, 2022
860426a
refactor: Card를 VO로 만든다.
Gyuchool Mar 15, 2022
10ec7f0
refactor: 무승부일때 로직 수정 및 코드 포멧팅
Gyuchool Mar 15, 2022
bee8566
refactor: dealer lose할 경우의 수 추가
Gyuchool Mar 15, 2022
ebe0b74
Revert "refactor: dealer lose할 경우의 수 추가"
Gyuchool Mar 15, 2022
3e8852b
refactor: result Test 추가 및 dealer lose 경우의 수 추가
Gyuchool Mar 15, 2022
91dbac5
refactor: 접근 지정자 private으로 수정
Gyuchool Mar 15, 2022
2a85843
refactor: add 반환 타입 boolean으로 변경
Gyuchool Mar 15, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,29 @@
## 우아한테크코스 코드리뷰

- [온라인 코드 리뷰 과정](https://github.com/woowacourse/woowacourse-docs/blob/master/maincourse/README.md)

## 기능 요구 사항
### 입력
- 참가자의 이름 입력받는 기능
- [예외] 입력이 null일떄
- [예외] 입력이 비어있을때
- 참가자에게 카드를 더 받겠는지 묻는 기능
- [예외] y,n이 아닌경우

### 출력
- 참가자 이름들 출력 기능
- 딜러 및 참가자들이 가지고 있는 카드 출력
- 딜러의 승패 및 참가자들 승패 여부 출력

### 계산
- 딜러 카드 숫자 합 계산 : 16이하이면 카드를 더 받는다는 메시지 출력
- 참가자들이 가지고 있는 카드들의 합 계산 기능

### 카드 배분
- 딜러와 참가자들 2장씩 카드 나눠 갖도록 기능 구현

### 참가자
- 카드를 더 받을지 선택하는 기능
- 카드의 합이 21을 넘어갈 경우 딜러에게 패배한다.
-

12 changes: 12 additions & 0 deletions src/main/java/BlackJack/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package BlackJack;

import BlackJack.controller.BlackjackController;

public class Application {
public static void main(String[] args) {
BlackjackController blackjackController = new BlackjackController();
blackjackController.run();

}

}
58 changes: 58 additions & 0 deletions src/main/java/BlackJack/controller/BlackjackController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package BlackJack.controller;

import BlackJack.domain.Card.CardFactory;
import BlackJack.domain.User.Dealer;
import BlackJack.domain.User.Player;
import BlackJack.domain.User.Players;
import BlackJack.dto.DealerResultDto;
import BlackJack.dto.PlayerResultsDto;
import BlackJack.dto.UserDto;
import BlackJack.view.InputView;
import BlackJack.view.OutputView;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class BlackjackController {
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

public void run() {
CardFactory cardFactory = new CardFactory();
List<String> inputPlayerNames = InputView.inputPlayerNames();
Dealer dealer = new Dealer(cardFactory);
Players players = Players.create(inputPlayerNames, cardFactory);
OutputView.printDrawMessage(inputPlayerNames);
OutputView.printTotalUserCards(convertToUserDtos(dealer, players));

OutputView.printTotalResult(playGame(dealer, players, cardFactory));

Map<String, String> statistics = players.getStatistics(dealer);
OutputView.printFinalResult(PlayerResultsDto.from(statistics), DealerResultDto.from(dealer, players.size()));
}

private List<UserDto> playGame(Dealer dealer, Players players, CardFactory cardFactory) {
players.getPlayers().forEach(player -> askOneMoreCard(player, cardFactory));
while (dealer.canOneMoreCard()) {
OutputView.printAddDealerCard();
dealer.addCard(cardFactory);
}
return convertToUserDtos(dealer, players);

}

private void askOneMoreCard(Player player, CardFactory cardFactory) {
while (!player.isBust() && InputView.askOneMoreCard(player.getName())) {
player.addCard(cardFactory);
OutputView.printPlayerCard(UserDto.from(player));
}
}

private List<UserDto> convertToUserDtos(Dealer dealer, Players players) {
List<UserDto> userDtos = new ArrayList<>();
userDtos.add(UserDto.from(dealer));
players.getPlayers().stream()
.map(UserDto::from)
.forEach(userDtos::add);
return userDtos;
}
}
25 changes: 25 additions & 0 deletions src/main/java/BlackJack/domain/Card/Card.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package BlackJack.domain.Card;

public class Card {

private final Shape shape;
private final Number number;

public Card(Shape shape, Number number) {
this.shape = shape;
this.number = number;
}

public Shape getShape() {
return shape;
}

public Number getNumber() {
return number;
}

public boolean isAce(){
return number.isAce();
}

}
34 changes: 34 additions & 0 deletions src/main/java/BlackJack/domain/Card/CardFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package BlackJack.domain.Card;

import java.util.*;

public class CardFactory {

private final Queue<Card> deck;

public CardFactory() {
List<Card> cards = new ArrayList<>();
Arrays.stream(Shape.values())
.forEach(shape -> Arrays.stream(Number.values())
.map(number -> new Card(shape, number))
.forEach(cards::add));
Collections.shuffle(cards);
deck = new LinkedList<>(cards);
}
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

public Cards initCards() {
List<Card> cards = new ArrayList<>();
cards.add(deck.poll());
cards.add(deck.poll());
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

return new Cards(cards);
}

public Card drawOneCard() {
return deck.poll();
}
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

public int size() {
return deck.size();
}
}
54 changes: 54 additions & 0 deletions src/main/java/BlackJack/domain/Card/Cards.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package BlackJack.domain.Card;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Cards {
public static final int BUST_LINE = 21;
private static final int EXTRA_SCORE = 10;

private final Set<Card> cards;

public Cards(List<Card> deck) {
this(new HashSet<>(deck));
}

public Cards(Set<Card> deck) {
this.cards = new HashSet<>(deck);
}
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

public Set<Card> getCards() {
return new HashSet<>(cards);
}

public void add(Card card) {
cards.add(card);
}

public int calculateScore() {
int score = cards.stream()
.mapToInt(card -> card.getNumber().getValue())
.sum();

return addAceScore(score);
}

private int addAceScore(int score) {
long countAce = cards.stream()
.filter(Card::isAce)
.count();

for (int i = 0; i < countAce; i++) {
score = getScore(score);
}
return score;
}

private int getScore(int score) {
if (score + EXTRA_SCORE <= BUST_LINE) {
score += EXTRA_SCORE;
}
return score;
}
}
37 changes: 37 additions & 0 deletions src/main/java/BlackJack/domain/Card/Number.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package BlackJack.domain.Card;

public enum Number {
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),
JACK("J", 10),
QUEEN("Q", 10),
KING("K", 10);

private final String denomination;
private final int value;

Number(String denomination, int value) {
this.denomination = denomination;
this.value = value;
}

public String getDenomination() {
return denomination;
}

public int getValue() {
return value;
}

public boolean isAce(){
return this == ACE;
}
}
19 changes: 19 additions & 0 deletions src/main/java/BlackJack/domain/Card/Shape.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package BlackJack.domain.Card;

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

private final String shapeName;

Shape(String shapeName) {
this.shapeName = shapeName;
}

public String getShapeName() {
return shapeName;
}

}
17 changes: 17 additions & 0 deletions src/main/java/BlackJack/domain/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package BlackJack.domain;

public enum Result {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

결과를 구하는 로직이 여기 저기 흩어져 있어요. 결과와 관련된 로직을 Result에서 관리해볼까요?

WIN("승"),
DRAW("무"),
LOSE("패");

private final String value;

Result(String value) {
this.value = value;
}

public String getValue() {
return value;
}
}
54 changes: 54 additions & 0 deletions src/main/java/BlackJack/domain/User/Dealer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package BlackJack.domain.User;

import BlackJack.domain.Card.CardFactory;
import BlackJack.domain.Result;

public class Dealer extends User {

private static final int DEALER_ADD_CARD_LIMIT = 16;

private int dealerLoseCount = 0;
private int dealerDrawCount = 0;

public Dealer(CardFactory cardFactory) {
super("딜러", cardFactory.initCards());
}

public boolean canOneMoreCard() {
return cards.calculateScore() <= DEALER_ADD_CARD_LIMIT;
}

public Result compare(Player player) {
if (isWin(player)) {
return Result.LOSE;
}
if (isLose(player)) {
dealerLoseCount++;
return Result.WIN;
}
dealerDrawCount++;
return Result.DRAW;
}
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

private boolean isWin(Player player) {
return player.isBust() || (this.isGreaterScoreThan(player) && !this.isBust());
}

private boolean isLose(Player player) {
return this.isBust() || (player.isGreaterScoreThan(this) && !player.isBust());
}

public int getDealerLoseCount() {
return dealerLoseCount;
}

public int getDealerDrawCount() {
return dealerDrawCount;
}

@Override
public void addCard(CardFactory cardFactory) {
cards.add(cardFactory.drawOneCard());
}
jnsorn marked this conversation as resolved.
Show resolved Hide resolved

}
16 changes: 16 additions & 0 deletions src/main/java/BlackJack/domain/User/Player.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package BlackJack.domain.User;

import BlackJack.domain.Card.CardFactory;
import BlackJack.domain.Card.Cards;

public class Player extends User {
public Player(String name, Cards cards) {
super(name, cards);
}

@Override
public void addCard(CardFactory cardFactory) {
cards.add(cardFactory.drawOneCard());
}

}