Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
0169491
docs: 구현해야할 기능 목록 추가
seongbeenkim Jul 25, 2021
73b0cc1
feat: 플레이어 이름 입력 및 공백 또는 null 체크
seongbeenkim Jul 25, 2021
ac07009
feat: 카드 한 장에 이름과 값을 체크해서 생성하는 테스트 코드 및 기능 구현
seongbeenkim Jul 25, 2021
e378c98
feat: 카드 한 장의 점수를 반환하는 테스트 및 기능 구현
seongbeenkim Jul 26, 2021
6b566fc
feat: 카드 52개 생성되는 테스트 및 기능 구현
seongbeenkim Jul 26, 2021
7052997
feat: 초기 2장의 카드 지급, 추가 카드 지급 테스트 및 기능 구현
seongbeenkim Jul 26, 2021
d57570d
feat: 더 이상 카드를 반환할 수 없는 경우 예외 발생 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
16becf5
feat: 플레이어(딜러 제외) 추가 카드 요청 입력 기능 추가
seongbeenkim Jul 28, 2021
2885dbb
feat: 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림 출력 기능 구현
seongbeenkim Jul 28, 2021
245b7c5
feat: 플레이어가 추가 카드 발급받는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
5e00eda
feat: 플레이어가 추가 카드 발급받는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
ed21358
feat: 플레이어가 가진 카드 합을 반환하는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
022020f
feat: 참가자 이름 리스트로 등록하면 게임에 참가자들이 생성되는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
4dd158f
feat: 카드가 Ace인지 확인하는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
926367e
feat: 카드의 합을 21을 기준으로 Ace 1 또는 11로 설정하는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
7c1f065
feat: 카드의 합이 21을 초과할 경우 참을 반환하는 테스트 및 기능 구현
seongbeenkim Jul 28, 2021
eef0805
초기화
seongbeenkim Jul 29, 2021
05c1689
feat: 카드 점수 enum 속성 getter 테스트 및 기능 구현
seongbeenkim Jul 29, 2021
32ba1ac
feat: 카드 무늬 enum 속성 getter 테스트 및 기능 구현
seongbeenkim Jul 29, 2021
099cfce
feat: 카드 점수 enum 객체가 Ace인지 확인하는 테스트 및 기능 구현
seongbeenkim Jul 29, 2021
78109d2
feat: 카드 한 장 객체에 대한 테스트 및 기능 구현
seongbeenkim Jul 29, 2021
dd35ba8
feat: 카드 덱에서 카드 1장, 2장 반환하는 테스트 및 기능 구현
seongbeenkim Jul 29, 2021
d1c6199
feat: 게임 참여자들이 받는 카드 목록에 대한 테스트 및 기능 구현
seongbeenkim Jul 31, 2021
335f55c
feat: 게임 참여자들이 받는 카드 목록에 카드 한 장 추가하는 테스트 및 기능 구현
seongbeenkim Jul 31, 2021
3b64f71
feat: 참여 상태(Running) 테스트 및 기능 구현
seongbeenkim Jul 31, 2021
bb05ebb
feat: 종료 상태(Finished) 테스트 및 기능 구현
seongbeenkim Jul 31, 2021
2ba425f
feat: 시작 상태(Started) 테스트 및 기능 구현
seongbeenkim Jul 31, 2021
0a7d336
feat: 모든 상태에서 카드 합 반환, 카드 목록 반환 기능 중복 코드 제거를 위한 Init 추상 클래스 추가 및 Star…
seongbeenkim Aug 1, 2021
4859fd6
feat: 인자로 받은 카드의 합을 비교하는 테스트 및 기능 구현
seongbeenkim Aug 1, 2021
c07c6c6
feat: 결과 점수 enum 구현
seongbeenkim Aug 1, 2021
0352558
feat: State 인터페이스에 결과 요청 함수 추가 및 적용
seongbeenkim Aug 1, 2021
4787fa3
feat: BlackJack, Burst, Stay 상태 테스트 및 구현
seongbeenkim Aug 1, 2021
0a5c219
style: 상태 관련 클래스 패키지 변경
seongbeenkim Aug 1, 2021
a046ee8
feat: 플레이어 테스트 및 구현
seongbeenkim Aug 1, 2021
7175ca3
refactor: private -> protected 접근제어자 변경
seongbeenkim Aug 1, 2021
7178c1e
feat: 게임 참여자(플레이어, 딜러)들이 가지는 공통 메서드, 변수 분리
seongbeenkim Aug 1, 2021
9fdf92b
feat: 딜러 테스트 및 구현
seongbeenkim Aug 1, 2021
a5696a4
feat: 딜러가 추가 카드 발급 후 17 이상 21 이하의 합을 가질 경우 Stay 상태로 변경되는 테스트 및 기능 구현
seongbeenkim Aug 1, 2021
b353012
style: 카드 관련 클래스 패키지 변경
seongbeenkim Aug 1, 2021
29d45ee
feat: 입력 뷰, 출력 뷰, 컨트롤러 생성
seongbeenkim Aug 1, 2021
c48cfc1
feat: GameSystem에서 참여자 이름 반환하는 테스트 및 기능 구현
seongbeenkim Aug 1, 2021
7267872
feat: 딜러, 플레이어들의 모든 카드 반환하는 테스트 및 기능 구현
seongbeenkim Aug 2, 2021
35e1746
feat: 카드의 값 이름(끗수) 반환하는 테스트 및 기능 추가
seongbeenkim Aug 3, 2021
1973163
refactor: GivenCards -> List<Card>로 반환하게 수정
seongbeenkim Aug 3, 2021
7cb3787
feat: 딜러, 플레이어의 처음 카드 2장을 전달하는 DTO 추가
seongbeenkim Aug 3, 2021
506fb75
feat: 딜러, 플레이어들이 처음 받은 카드 2장을 출력하는 기능 추가
seongbeenkim Aug 3, 2021
863cc93
feat: 모든 플레이어가 종료되었는지에 대한 여부를 반환하는 테스트 및 기능 추가
seongbeenkim Aug 3, 2021
2792e83
feat: 참여 종료상태가 아닌 플레이어 중 먼저 입력 받았던 플레이어의 이름을 반환하는 테스트 및 기능 구현
seongbeenkim Aug 3, 2021
d7d4e0d
feat: 인자로 전달받은 플레이어의 카드를 추가하는 테스트 및 기능 구현
seongbeenkim Aug 3, 2021
7d6f168
feat: 딜러의 카드를 추가하는 테스트 및 기능 구현
seongbeenkim Aug 3, 2021
c1c9137
refactor: 플레이어의 카드 추가 시 카드 추가 응답을 인자도 받아오게 수정
seongbeenkim Aug 3, 2021
bf12f9e
refactor: isFinished -> allPlayersFinished 이름 변경
seongbeenkim Aug 3, 2021
16109f3
feat: 플레이어(딜러 제외) 추가 카드 요청하는 기능 추가
seongbeenkim Aug 3, 2021
a601843
refactor: Player 객체 -> Person 객체로 수정
seongbeenkim Aug 3, 2021
d68db1d
refactor: 인자로 받은 값보다 합이 작거나 같은 지 확인하는 기능 추가
seongbeenkim Aug 3, 2021
c560333
feat: 딜러 종료 여부 반환하는 테스트 및 기능 구현
seongbeenkim Aug 3, 2021
adf3110
feat: 딜러의 추가 카드 지급 여부 결과 출력 기능 구현
seongbeenkim Aug 3, 2021
3dc4b10
refactor: 블랙잭 상수 Dealer -> GameSystem으로 이동
seongbeenkim Aug 3, 2021
36211ae
refactor: FirstTwoCardsResponse -> CardsResponse로 이름 변경
seongbeenkim Aug 3, 2021
42f113a
feat: 딜러, 플레이어들의 카드 반환하는 DealerAndPlayerCardsResponse 생성
seongbeenkim Aug 3, 2021
2abc494
feat: 추가 요청 후 플레이어의 카드를 출력하는 기능 추가
seongbeenkim Aug 3, 2021
80be38b
feat: 각 플레이어(딜러 포함)의 총 카드의 합을 반환하는 기능 추가
seongbeenkim Aug 3, 2021
47eb909
refactor: result -> compare 이름 변경
seongbeenkim Aug 3, 2021
23a37d0
feat: 총 카드의 합이 21인지 확인하는 테스트 및 기능 추가
seongbeenkim Aug 3, 2021
2759710
feat: 카드 추가 발급 시 카드의 합 21일 경우 Stay 상태 반환하는 테스트 및 기능 구현
seongbeenkim Aug 3, 2021
d6cc2ce
feat: Stay 상태에서 합 비교시 인자로 받아온 카드의 합이 21을 초과할 경우에 대한 테스트 및 조건 추가
seongbeenkim Aug 3, 2021
e145190
feat: 플레이어들의 승패 결과를 반환하는 테스트 및 기능 구현
seongbeenkim Aug 3, 2021
c434047
feat: 최종 승패 결과 출력 기능 추가
seongbeenkim Aug 3, 2021
035c28d
feat: GameSystem의 플레이어 관련 기능 Players로 위임
seongbeenkim Aug 3, 2021
db0aa56
refactor: Players에서 반환하는 객체 List<Card> -> GivenCards로 수정
seongbeenkim Aug 4, 2021
6f5254a
refactor: 카드 캐싱 적용
seongbeenkim Aug 7, 2021
bab3a7b
refactor: Deck 캐싱 적용
seongbeenkim Aug 7, 2021
ef17f16
feat: GameSystem 생성자 추가
seongbeenkim Aug 7, 2021
af9c002
refactor: 외부에서 new 키워드로 GameSystem 생성하지 못하게 수정
seongbeenkim Aug 8, 2021
27b59a8
refactor: 사용하지 않는 변수 제거
seongbeenkim Aug 8, 2021
fb7caf3
style: dto 패키지 경로 수정
seongbeenkim Aug 8, 2021
e3dac27
style: dto 패키지 경로 수정
seongbeenkim Aug 8, 2021
fe515c5
refactor: @CsvSource String -> Enum 값으로 전달하게 수정
seongbeenkim Aug 8, 2021
ca4a947
refactor: unmodifiableCollection 적용
seongbeenkim Aug 9, 2021
8a80512
refactor: 불필요한 상태 제거
seongbeenkim Aug 12, 2021
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
194 changes: 194 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1 +1,195 @@
# java-blackjack

# 규칙
Blackjack : 처음 두 장의 카드 합 21 => 승
Bust : 카드 합 21 초과 => 패
Push : 플레이어, 딜러 카드 합이 같음 => 무승부
Hit : 플레이어의 카드 2장의 합이 21을 초과하지 않을 경우, 추가 카드를 요청
Stay : 플레이어가 추가 카드를 원하지 않음, 딜러는 카드 합 17 이상이면 추가 카드를 얻을 수 없음

# 구현해야 할 기능 목록
- [x] 입력
- [x] 플레이어 이름
- [x] 플레이어(딜러 제외) 추가 카드 요청 여부

- [x] 출력
- [x] 각 플레이어(딜러 포함)에게 2장의 카드 지급 알림
- [x] 각 플레이어(딜러 포함)가 가진 카드
- [x] 추가 요청 후 플레이어의 카드
- [x] 추가 카드가 발급되지 않았고 3장 이상일 경우 출력 X
- [x] 딜러의 추가 카드 지급 여부 결과
- [x] 각 플레이어(딜러 포함)의 총 카드의 합
- [x] 최종 승패 결과

- [x] 상태 (State)
- 기능
- [x] 추가 카드 발급
- [x] 추가 카드 발급 거부
- [x] 모든 카드 합 반환
- [x] 참여 종료 여부 반환
- [x] 발급받은 카드 목록 반환
- [x] 결과 요청

- [x] 시작 상태 (Init)
- 기능
- [x] 발급받은 카드 목록 반환
- [x] 모든 카드 합 반환

- [x] 참여 상태 (Running)
- 기능
- [x] 참여 종료 여부 거짓으로 반환
- [x] ERROR : 결과 요청할 경우

- [x] 카드 추가 받은 상태 (Hit)
- 기능
- [x] 추가 카드 발급
- [x] 카드의 합 21을 초과할 경우 Burst 상태 반환
- [x] 카드의 합 21 미만일 경우 Hit 상태 반환
- [x] 카드의 합 21일 경우 Stay 상태 반환
- [x] Stay 상태 반환

- [x] 종료 상태 (Finished)
- 기능
- [x] 참여 종료 여부 참으로 반환
- [x] ERROR : 추가 카드 발급 시
- [x] ERROR : 추가 카드 발급 거부 시

- [x] 처음 카드 두 장의 합이 21인 상태 (Blackjack)
- 기능
- [x] 승리 결과 (1) 반환
- [x] 모든 카드의 합이 21인 상태 (Burst)
- 기능
- [x] 패배 결과 (-1) 반환

- [x] 카드 발급 거부 후 참여가 종료된 상태 (Stay)
- 기능
- [x] 결과 반환
- [x] 승리 결과 (1) 반환
- [x] 자신의 합이 더 클 경우
- [x] 인자로 받아온 카드의 합이 21을 초과할 경우
- [x] 자신의 합이 더 작을 경우 패배 결과 (-1) 반환
- [x] 자신의 합과 같을 경우 무승부 결과 (0) 반환

- [x] 사람 (Person)
- 기능
- [x] 초기 상태 주입
- [x] 카드 추가 발급
- [x] 카드 추가 발급 거부
- [x] 카드 목록 반환
- [x] 카드 합 반환
- [x] 이름 반환
- [x] 종료 여부 반환

- [x] 게임 참여자 (Gamer)
- 기능
- [x] 카드 추가 발급 거부
- [x] 카드 목록 반환
- [x] 카드 합 반환
- [x] 이름 반환
- [x] 종료 여부 반환

- [x] 플레이어 (Player)
- 속성
- [x] 이름
- [x] 카드 목록

- 기능
- [x] 초기 상태 주입
- [x] 카드 2장의 합 21일 경우 Blackjack 상태
- [x] 카드 2장의 합 21 미만일 경우 Hit 상태
- [x] 카드 추가 발급
- [x] 카드의 합 21 초과할 경우 Burst 상태 반환
- [x] 카드의 합 21 미만일 경우 Hit 상태 반환
- [x] 카드의 합 21일 경우 Stay 상태 반환

- [x] 딜러 (Dealer)
- 속성
- [x] 이름
- [x] 카드 목록

- 기능
- [x] 초기 상태 주입
- [x] 카드 2장의 합 21일 경우 Blackjack 상태
- [x] 카드 2장의 합 16 이하일 경우 Hit 상태
- [x] 카드 2장의 합 16 초과일 경우 Stay 상태
- [x] 카드 추가 발급
- [x] 17 이상 21 이하일 경우, Stay 상태로 변경
- [x] 종료 여부 반환
- [x] Blackjack이 아니며, 17 이상 21 이하일 경우 참으로 반환
- [x] 카드
- 속성
- [x] 점수
- [x] 무늬

- 기능
- [x] 카드의 값 반환
- [x] 카드의 값 이름 반환
- [x] ACE인지 확인

- [x] 점수 enum
- 속성
- [x] 점수 이름(끗수)
- [x] 점수

- 기능
- [x] 점수 이름 반환
- [x] 점수 반환
- [x] ACE인지 확인

- [x] 무늬 enum
- 속성
- [x] 무늬

- 기능
- [x] 무늬 이름 반환

- [x] 결과 enum
- 속성
- [x] 포인트

- 기능
- [x] 포인트 반환

- [x] 현재까지 받은 카드 목록
- 속성
- [x] 현재까지 받은 카드 목록

- 기능
- [x] Ace 포함하는지 확인
- [x] 두 장의 카드 합 21인지 확인
- [x] 총 카드의 합이 21인지 확인
- [x] 모든 카드 합이 21을 초과하는지 확인
- [x] 21을 기준으로 Ace 1 또는 11로 설정
- [x] 카드 목록 반환
- [x] 인자로 받은 카드 추가
- [x] 인자로 받은 카드보다 합이 큰 지 확인
- [x] 인자로 받은 카드보다 합이 작은 지 확인
- [x] 인자로 받은 값보다 합이 작거나 같은 지 확인

- [x] 카드 덱
- 속성
- [x] 카드 52장

- 기능
- [x] 52장 카드 생성
- [x] 처음 2장 카드 반환
- [x] 추가 카드 반환

- [x] 게임 시스템
- 속성
- [x] 딜러
- [x] 플레이어 목록

- 기능
- [x] 플레이어들의 이름 반환
- [x] 플레이어들의 모든 카드 반환
- [x] 딜러의 모든 카드 반환
- [x] 모든 플레이어가 참여 종료했는지 확인
- [x] 참여 종료 상태가 아닌 플레이어 중 먼저 입력받은 플레이어 이름 반환
- [x] 입력받은 이름의 플레이어 추가 카드 발급
- [x] ERROR : y 또는 n이 아닌 응답을 전달받을 경우
- [x] 딜러 추가 카드 발급
- [x] 딜러 종료 여부 반환
- [x] 딜러 점수 반환
- [x] 플레이어들의 점수 반환
- [x] 플레이어들의 승패 결과 반환
14 changes: 14 additions & 0 deletions src/main/java/blackjack/Blackjack.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package blackjack;

import blackjack.controller.BlackjackController;
import blackjack.view.InputView;
import blackjack.view.OutputView;

public class Blackjack {
public static void main(String[] args) {
InputView inputView = new InputView();
OutputView outputView = new OutputView();
BlackjackController blackjackController = new BlackjackController(inputView, outputView);
blackjackController.run();
}
}
57 changes: 57 additions & 0 deletions src/main/java/blackjack/controller/BlackjackController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package blackjack.controller;

import blackjack.controller.dto.CardsResponse;
import blackjack.controller.dto.DealerAndPlayerCardsResponse;
import blackjack.domain.GameSystem;
import blackjack.view.InputView;
import blackjack.view.OutputView;

import java.util.List;

public class BlackjackController {
private final InputView inputView;
private final OutputView outputView;

public BlackjackController(final InputView inputView, final OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}

public void run() {
GameSystem gameSystem = setup(inputView.getPlayerNames());
playerMode(gameSystem);
dealerMode(gameSystem);
printResult(gameSystem);
}

private GameSystem setup(final List<String> playerNames) {
GameSystem gameSystem = GameSystem.create(playerNames);
outputView.printGameStart(gameSystem.getPlayerNames());
DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards());
outputView.printFirstTwoCards(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse);
return gameSystem;
}

private void playerMode(final GameSystem gameSystem) {
while (!gameSystem.allPlayersFinished()) {
String currentPlayer = gameSystem.getCurrentPlayer();
String answer = inputView.getAnswerForAnotherCard(currentPlayer);
gameSystem.hit(answer, currentPlayer);
CardsResponse cardsResponse = new CardsResponse(gameSystem.getCards(currentPlayer));
outputView.printPlayerCards(currentPlayer, cardsResponse, answer);
}
}

private void dealerMode(final GameSystem gameSystem) {
while (!gameSystem.isDealerFinished()) {
outputView.printDealerGetAnotherCard();
gameSystem.hit();
}
}

private void printResult(final GameSystem gameSystem) {
DealerAndPlayerCardsResponse dealerAndPlayerCardsResponse = new DealerAndPlayerCardsResponse(gameSystem.getDealerCards(), gameSystem.getPlayerCards());
outputView.printCardsAndScores(gameSystem.getPlayerNames(), dealerAndPlayerCardsResponse, gameSystem.getDealerScore(), gameSystem.getPlayerScores());
outputView.printResults(gameSystem.getPlayerNames(), gameSystem.getResults());
}
}
19 changes: 19 additions & 0 deletions src/main/java/blackjack/controller/dto/CardResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package blackjack.controller.dto;

public class CardResponse {
private final String denomination;
private final String suit;

public CardResponse(final String denomination, final String suit) {
this.denomination = denomination;
this.suit = suit;
}

public String getDenomination() {
return denomination;
}

public String getSuit() {
return suit;
}
}
20 changes: 20 additions & 0 deletions src/main/java/blackjack/controller/dto/CardsResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package blackjack.controller.dto;

import blackjack.domain.card.Card;

import java.util.List;
import java.util.stream.Collectors;

public class CardsResponse {
private final List<Card> cards;

public CardsResponse(final List<Card> cards) {
this.cards = cards;
}

public List<CardResponse> getCards() {
return cards.stream()
.map(card -> new CardResponse(card.getDenomination(), card.getSuit()))
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package blackjack.controller.dto;

import blackjack.domain.card.Card;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class DealerAndPlayerCardsResponse {
private final List<Card> dealerCards;
private final List<List<Card>> playerCards;

public DealerAndPlayerCardsResponse(final List<Card> dealerCards, final List<List<Card>> playerCards) {
this.dealerCards = dealerCards;
this.playerCards = new ArrayList<>(playerCards);
}

public CardsResponse getDealerCards() {
return new CardsResponse(dealerCards);
}

public List<CardsResponse> getAllPlayerCards() {
return playerCards.stream()
.map(CardsResponse::new)
.collect(Collectors.toList());
}
}
Loading