Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# java-blackjack

블랙잭 미션 저장소
## 기능 요구 사항

## [미션 리드미](https://github.com/talmood/private-mission-README/tree/main/%EB%AF%B8%EC%85%98%204%20-%20%EB%B8%94%EB%9E%99%EC%9E%AD)
- 카드의 숫자 계산은 카드 숫자를 기본으로 하며, 예외로 Ace는 1 또는 11로 계산할 수 있으며, King, Queen, Jack은 각각 10으로 계산한다.
- 게임을 시작하면 플레이어는 두 장의 카드를 지급 받으며, 두 장의 카드 숫자를 합쳐 21을 초과하지 않으면서 21에 가깝게 만들면 이긴다. 21을 넘지 않을 경우 원한다면 얼마든지 카드를 계속 뽑을 수 있다.
- 딜러는 처음에 받은 2장의 합계가 16이하이면 반드시 1장의 카드를 추가로 받아야 하고, 17점 이상이면 추가로 받을 수 없다.
- 게임을 완료한 후 각 플레이어별로 승패를 출력한다.

## 구현 목록

- [x] 게임의 참여할 사람을 입력받는다.
- [x] 딜러와 플레이어들이 카드를 나눠 받는다.
- [x] 딜러와 플레이어들이 추가 카드를 나눠 갖는다.
- [x] 딜러와 플레이어들의 결과를 출력한다.
- [x] 최종 결과를 출력한다.
23 changes: 23 additions & 0 deletions src/main/java/BlackjackApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import Controller.BlackjackSimulatorRunner;
import domain.game.BlackjackSimulator;
import view.input.ConsoleInputReader;
import view.input.ConsoleInputView;
import view.input.InputReader;
import view.input.InputView;
import view.output.ConsoleOutputView;
import view.output.ConsoleOutputWriter;
import view.output.OutputView;
import view.output.OutputWriter;

public class BlackjackApplication {

public static void main(String[] args) {
InputReader inputReader = new ConsoleInputReader();
OutputWriter outputWriter = new ConsoleOutputWriter();
InputView inputView = new ConsoleInputView(inputReader, outputWriter);
OutputView outputView = new ConsoleOutputView(outputWriter);

BlackjackSimulatorRunner blackjackSimulatorRunner = new BlackjackSimulatorRunner(new BlackjackSimulator(inputView, outputView));
blackjackSimulatorRunner.run();
}
}
21 changes: 21 additions & 0 deletions src/main/java/Controller/BlackjackSimulatorRunner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package Controller;

import domain.game.BlackjackGame;
import domain.game.BlackjackSimulator;

public class BlackjackSimulatorRunner {

private final BlackjackSimulator blackjackSimulator;

public BlackjackSimulatorRunner(BlackjackSimulator blackjackSimulator) {
this.blackjackSimulator = blackjackSimulator;
}

public void run() {
BlackjackGame notPlayedGame = blackjackSimulator.createNotPlayedGame();
BlackjackGame initializeHandOutGame = blackjackSimulator.InitialHandOutGame(notPlayedGame);
BlackjackGame handOutPlayersGame = blackjackSimulator.handOutPlayers(initializeHandOutGame);
BlackjackGame handOutDealerGame = blackjackSimulator.handOutDealer(handOutPlayersGame);
blackjackSimulator.decideWinOrLose(handOutDealerGame);
}
}
45 changes: 45 additions & 0 deletions src/main/java/domain/game/BlackjackGame.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package domain.game;

import domain.participant.*;
import domain.trumpcard.TrumpCardDeck;
import domain.validator.ObjectsValidator;

import java.util.List;

public class BlackjackGame {

private final BlackjackParticipants blackjackParticipants;
private final TrumpCardDeck trumpCardDeck;

public BlackjackGame(BlackjackParticipants blackjackParticipants, TrumpCardDeck trumpCardDeck) {
ObjectsValidator.validateNotNull(blackjackParticipants, trumpCardDeck);
this.blackjackParticipants = blackjackParticipants;
this.trumpCardDeck = trumpCardDeck;
}

public BlackjackGame(BlackjackGame blackjackGame) {
ObjectsValidator.validateNotNull(blackjackGame);
this.blackjackParticipants = blackjackGame.blackjackParticipants;
this.trumpCardDeck = blackjackGame.trumpCardDeck;
}

public List<BlackjackParticipant> fetchBlackjackParticipants() {
return this.blackjackParticipants.fetchBlackjackParticipants();
}

public List<BlackjackPlayer> fetchBlackjackPlayers() {
return this.blackjackParticipants.findPlayers().fetchBlackjackPlayers();
}

public BlackjackDealer findDealer() {
return this.blackjackParticipants.findDealer();
}

public BlackjackPlayers findPlayers() {
return this.blackjackParticipants.findPlayers();
}

public TrumpCardDeck getTrumpCardDeck() {
return trumpCardDeck;
}
}
32 changes: 32 additions & 0 deletions src/main/java/domain/game/BlackjackGameCreator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package domain.game;

import domain.participant.BlackjackDealer;
import domain.participant.BlackjackParticipants;
import domain.participant.BlackjackPlayerName;
import domain.participant.BlackjackPlayers;
import domain.trumpcard.TrumpCardDeck;
import domain.validator.ObjectsValidator;
import view.input.InputView;
import view.input.dto.PlayersInput;

import java.util.List;

public class BlackjackGameCreator {

private final InputView inputView;

public BlackjackGameCreator(InputView inputView) {
ObjectsValidator.validateNotNull(inputView);
this.inputView = inputView;
}

public BlackjackGame create() {
PlayersInput playersInput = inputView.viewPlayers();
List<BlackjackPlayerName> blackjackPlayerNames = playersInput.toBlackjackPlayerNames();
BlackjackPlayers blackjackPlayers = BlackjackPlayers.fromNamesWithEmptyCards(blackjackPlayerNames);
BlackjackDealer blackjackDealer = BlackjackDealer.createWithEmptyCards();
TrumpCardDeck trumpCardDeck = new TrumpCardDeck();

return new BlackjackGame(BlackjackParticipants.of(blackjackDealer, blackjackPlayers), trumpCardDeck);
}
}
59 changes: 59 additions & 0 deletions src/main/java/domain/game/BlackjackSimulator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package domain.game;

import domain.handouter.*;
import domain.validator.ObjectsValidator;
import domain.winorlose.BlackjackWinOrLoseDecider;
import domain.winorlose.FinalWinOrLose;
import view.input.InputView;
import view.output.OutputView;
import view.output.dto.BlackjackResultOutputs;
import view.output.dto.FinalWinOrLoseOutput;
import view.output.dto.InitialHandOutOutput;

public class BlackjackSimulator {

private static final int INITIAL_HANDOUT_COUNT = 2;

private final InputView inputView;

private final OutputView outputView;

public BlackjackSimulator(InputView inputView, OutputView outputView) {
ObjectsValidator.validateNotNull(inputView, outputView);
this.inputView = inputView;
this.outputView = outputView;
}

public BlackjackGame createNotPlayedGame() {
BlackjackGameCreator blackjackGameCreator = new BlackjackGameCreator(inputView);
return blackjackGameCreator.create();
}

public BlackjackGame InitialHandOutGame(BlackjackGame blackjackGame) {
HandOutCount handOutCount = new HandOutCount(INITIAL_HANDOUT_COUNT);
BlackjackHandOuter blackjackInitialHandOuter = new BlackjackInitialHandOuter(blackjackGame, handOutCount);
BlackjackGame initialHandOutGame = blackjackInitialHandOuter.handOut();
outputView.viewInitialHandOut(InitialHandOutOutput.of(handOutCount, initialHandOutGame));

return initialHandOutGame;
}

public BlackjackGame handOutPlayers(BlackjackGame blackjackGame) {
BlackjackHandOuter blackjackPlayersHandOuter = new BlackjackPlayersHandOuter(blackjackGame, inputView, outputView);
return blackjackPlayersHandOuter.handOut();
}

public BlackjackGame handOutDealer(BlackjackGame blackjackGame) {
BlackjackHandOuter blackjackDealerHandOuter = new BlackjackDealerHandOuter(blackjackGame, outputView);
BlackjackGame dealerHandOutGame = blackjackDealerHandOuter.handOut();
outputView.viewBlackjackResult(BlackjackResultOutputs.from(dealerHandOutGame));

return dealerHandOutGame;
}

public void decideWinOrLose(BlackjackGame blackjackGame) {
BlackjackWinOrLoseDecider blackjackWinOrLoseDecider = new BlackjackWinOrLoseDecider(blackjackGame);
FinalWinOrLose winOrLose = blackjackWinOrLoseDecider.decide();
outputView.viewFinalWinOrLose(FinalWinOrLoseOutput.from(winOrLose));
}
}
48 changes: 48 additions & 0 deletions src/main/java/domain/handouter/BlackjackDealerHandOuter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package domain.handouter;

import domain.game.BlackjackGame;
import domain.participant.BlackjackDealer;
import domain.participant.BlackjackParticipant;
import domain.participant.BlackjackParticipants;
import domain.trumpcard.TrumpCard;
import domain.trumpcard.TrumpCardDeck;
import domain.validator.ObjectsValidator;
import domain.winorlose.BlackjackPoint;
import view.output.OutputView;
import view.output.dto.HandOutDealerOutput;

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

public class BlackjackDealerHandOuter implements BlackjackHandOuter {

private static final int DEALER_HAND_OUT_THRESHOLD = 17;

private final BlackjackGame blackjackGame;

private final OutputView outputView;

public BlackjackDealerHandOuter(BlackjackGame blackjackGame, OutputView outputView) {
ObjectsValidator.validateNotNull(blackjackGame, outputView);
this.blackjackGame = blackjackGame;
this.outputView = outputView;
}

@Override
public BlackjackGame handOut() {
List<BlackjackParticipant> receivedParticipants = new ArrayList<>(this.blackjackGame.fetchBlackjackPlayers());
BlackjackDealer dealer = this.blackjackGame.findDealer();
BlackjackPoint blackjackPoint = dealer.calculatePoint();
TrumpCardDeck trumpCardDeck = this.blackjackGame.getTrumpCardDeck();

if (blackjackPoint.isLowerThan(new BlackjackPoint(DEALER_HAND_OUT_THRESHOLD))) {
TrumpCard trumpCard = trumpCardDeck.fetchTopOne();
trumpCardDeck = trumpCardDeck.takeOutTopOne();
dealer = dealer.receiveCard(trumpCard);
this.outputView.viewHandOutDealer(new HandOutDealerOutput(DEALER_HAND_OUT_THRESHOLD - 1));
}

receivedParticipants.add(dealer);
return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck);
}
}
8 changes: 8 additions & 0 deletions src/main/java/domain/handouter/BlackjackHandOuter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package domain.handouter;

import domain.game.BlackjackGame;

public interface BlackjackHandOuter {

BlackjackGame handOut();
}
51 changes: 51 additions & 0 deletions src/main/java/domain/handouter/BlackjackInitialHandOuter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package domain.handouter;

import domain.game.BlackjackGame;
import domain.participant.BlackjackParticipant;
import domain.participant.BlackjackParticipants;
import domain.trumpcard.TrumpCard;
import domain.trumpcard.TrumpCardDeck;
import domain.validator.ObjectsValidator;

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

public class BlackjackInitialHandOuter implements BlackjackHandOuter {

private final BlackjackGame blackjackGame;

private final HandOutCount handOutCount;

public BlackjackInitialHandOuter(BlackjackGame blackjackGame, HandOutCount handOutCount) {
ObjectsValidator.validateNotNull(blackjackGame, handOutCount);
this.blackjackGame = blackjackGame;
this.handOutCount = handOutCount;
}

@Override
public BlackjackGame handOut() {
BlackjackGame blackjackGame = new BlackjackGame(this.blackjackGame);

for (int i = 0; i < handOutCount.handOutCount(); i++) {
blackjackGame = this.handOutAllParticipants(blackjackGame);
}

return blackjackGame;
}

private BlackjackGame handOutAllParticipants(BlackjackGame blackjackGame) {
ArrayList<BlackjackParticipant> receivedParticipants = new ArrayList<>();
TrumpCardDeck trumpCardDeck = blackjackGame.getTrumpCardDeck();

List<BlackjackParticipant> participants = blackjackGame.fetchBlackjackParticipants();

for (BlackjackParticipant participant : participants) {
TrumpCard trumpCard = trumpCardDeck.fetchTopOne();
trumpCardDeck = trumpCardDeck.takeOutTopOne();
BlackjackParticipant receiveParticipant = participant.receiveCard(trumpCard);
receivedParticipants.add(receiveParticipant);
}

return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck);
}
}
62 changes: 62 additions & 0 deletions src/main/java/domain/handouter/BlackjackPlayersHandOuter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package domain.handouter;

import domain.game.BlackjackGame;
import domain.participant.BlackjackParticipant;
import domain.participant.BlackjackParticipants;
import domain.participant.BlackjackPlayer;
import domain.participant.BlackjackPlayerName;
import domain.trumpcard.TrumpCard;
import domain.trumpcard.TrumpCardDeck;
import domain.validator.ObjectsValidator;
import view.input.InputView;
import view.input.dto.HandOutPlayerInput;
import view.input.dto.HandOutPlayerRequest;
import view.output.OutputView;
import view.output.dto.HandOutPlayerOutput;

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

public class BlackjackPlayersHandOuter implements BlackjackHandOuter {

private final BlackjackGame blackjackGame;

private final InputView inputView;

private final OutputView outputView;

public BlackjackPlayersHandOuter(BlackjackGame blackjackGame, InputView inputView, OutputView outputView) {
ObjectsValidator.validateNotNull(blackjackGame, inputView, outputView);
this.blackjackGame = blackjackGame;
this.inputView = inputView;
this.outputView = outputView;
}

@Override
public BlackjackGame handOut() {
List<BlackjackParticipant> receivedParticipants = new ArrayList<>();
TrumpCardDeck trumpCardDeck = this.blackjackGame.getTrumpCardDeck();
List<BlackjackPlayer> blackjackPlayers = this.blackjackGame.fetchBlackjackPlayers();

for (BlackjackPlayer blackjackPlayer : blackjackPlayers) {
BlackjackPlayerName blackjackPlayerName = blackjackPlayer.getBlackjackPlayerName();

while (this.isHandOut(blackjackPlayerName, this.inputView)) {
TrumpCard trumpCard = trumpCardDeck.fetchTopOne();
trumpCardDeck = trumpCardDeck.takeOutTopOne();
blackjackPlayer = blackjackPlayer.receiveCard(trumpCard);
this.outputView.viewHandOutPlayer(HandOutPlayerOutput.of(blackjackPlayerName, blackjackPlayer));
}
receivedParticipants.add(blackjackPlayer);
}

receivedParticipants.add(this.blackjackGame.findDealer());

return new BlackjackGame(new BlackjackParticipants(receivedParticipants), trumpCardDeck);
}

private boolean isHandOut(BlackjackPlayerName blackjackPlayerName, InputView inputView) {
HandOutPlayerInput handOutPlayerInput = inputView.viewHandOutCardForPlayer(HandOutPlayerRequest.from(blackjackPlayerName));
return handOutPlayerInput.isHandOut();
}
}
14 changes: 14 additions & 0 deletions src/main/java/domain/handouter/HandOutCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package domain.handouter;

public record HandOutCount(int handOutCount) {

public HandOutCount {
this.validateGreaterThanZero(handOutCount);
}

private void validateGreaterThanZero(int handOutCount) {
if (handOutCount <= 0) {
throw new IllegalArgumentException("나눠주는 카드는 1장 이상이어야 합니다.");
}
}
}
Loading