-
Notifications
You must be signed in to change notification settings - Fork 389
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[1단계 - 블랙잭 게임 실행] 히이로(문제웅) 미션 제출합니다. (#447)
- Loading branch information
1 parent
b467f6f
commit b679262
Showing
37 changed files
with
1,388 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
import controller.BlackJackGameController; | ||
import view.InputView; | ||
import view.OutputView; | ||
|
||
public class Application { | ||
public static void main(String[] args) { | ||
InputView inputview = new InputView(); | ||
OutputView outputView = new OutputView(); | ||
BlackJackGameController blackJackGameController = new BlackJackGameController(inputview, outputView); | ||
blackJackGameController.run(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
package controller; | ||
|
||
import domain.DrawCommand; | ||
import domain.card.Card; | ||
import domain.card.GameDeck; | ||
import domain.card.ShuffleDeckGenerator; | ||
import domain.game.BlackJackGame; | ||
import domain.game.GameResult; | ||
import domain.user.Dealer; | ||
import domain.user.Name; | ||
import domain.user.Names; | ||
import domain.user.Player; | ||
import domain.user.PlayerStatus; | ||
import domain.user.User; | ||
import java.util.HashMap; | ||
import java.util.LinkedHashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.stream.Collectors; | ||
import view.InputView; | ||
import view.OutputView; | ||
|
||
public class BlackJackGameController { | ||
private final InputView inputView; | ||
private final OutputView outputView; | ||
|
||
public BlackJackGameController(InputView inputView, OutputView outputView) { | ||
this.inputView = inputView; | ||
this.outputView = outputView; | ||
} | ||
|
||
public void run() { | ||
BlackJackGame blackJackGame = setUp(); | ||
playGame(blackJackGame); | ||
} | ||
|
||
private BlackJackGame setUp() { | ||
GameDeck gameDeck = new GameDeck(new ShuffleDeckGenerator()); | ||
Dealer dealer = new Dealer(gameDeck.drawForFirstTurn()); | ||
List<Player> players = setUpPlayers(gameDeck); | ||
showSetUpResult(dealer, players); | ||
return new BlackJackGame(players, dealer, gameDeck); | ||
} | ||
|
||
private List<Player> setUpPlayers(GameDeck gameDeck) { | ||
return readUsersName().stream() | ||
.map(name -> new Player(name, gameDeck.drawForFirstTurn())) | ||
.collect(Collectors.toList()); | ||
} | ||
|
||
private List<Name> readUsersName() { | ||
outputView.printInputPlayerNameMessage(); | ||
Names names = new Names(inputView.readPlayersName()); | ||
return names.getNames(); | ||
} | ||
|
||
private void showSetUpResult(Dealer dealer, List<Player> players) { | ||
HashMap<String, List<Card>> setUpResult = new LinkedHashMap<>(); | ||
setUpResult.put("딜러", dealer.getCards().subList(0, 1)); | ||
players.forEach(player -> setUpResult.put(player.getName(), player.getCards())); | ||
outputView.printSetUpResult(setUpResult); | ||
} | ||
|
||
private void playGame(BlackJackGame blackJackGame) { | ||
progressPlayersTurn(blackJackGame); | ||
progressDealerTurn(blackJackGame); | ||
showUsersCardResult(blackJackGame); | ||
GameResult gameResult = new GameResult(blackJackGame.getPlayerNames()); | ||
gameResult.saveResults(blackJackGame.getDealer(), blackJackGame.getPlayers()); | ||
showFinalResult(gameResult); | ||
} | ||
|
||
private void progressPlayersTurn(BlackJackGame blackJackGame) { | ||
List<Player> players = blackJackGame.getPlayers(); | ||
for (Player player : players) { | ||
progressPlayerTurn(blackJackGame, player); | ||
} | ||
} | ||
|
||
private void progressPlayerTurn(BlackJackGame blackJackGame, Player player) { | ||
while (player.isUserStatus(PlayerStatus.NORMAL) && readDrawCommand(player).equals(DrawCommand.DRAW)) { | ||
blackJackGame.drawOneMoreCardForPlayer(player); | ||
showDrawResult(player); | ||
} | ||
if (player.isUserStatus(PlayerStatus.NORMAL)) { | ||
showDrawResult(player); | ||
} | ||
} | ||
|
||
private DrawCommand readDrawCommand(Player player) { | ||
outputView.printAskOneMoreCardMessage(player.getName()); | ||
return inputView.readDrawCommand(); | ||
} | ||
|
||
private void showDrawResult(Player player) { | ||
outputView.printPlayerDrawResult(player.getName(), player.getCards()); | ||
} | ||
|
||
private void progressDealerTurn(BlackJackGame blackJackGame) { | ||
blackJackGame.drawCardUntilOverSixteen(); | ||
|
||
Dealer dealer = blackJackGame.getDealer(); | ||
int dealerDrawCount = dealer.getCards().size() - 2; | ||
|
||
if (dealerDrawCount > 0) { | ||
outputView.printDealerDrawResult(dealerDrawCount); | ||
} | ||
} | ||
|
||
private void showUsersCardResult(BlackJackGame blackJackGame) { | ||
Map<User, List<Card>> userResult = new LinkedHashMap<>(); | ||
userResult.put(blackJackGame.getDealer(), blackJackGame.getDealer().getCards()); | ||
blackJackGame.getPlayers().forEach(player -> userResult.put(player, player.getCards())); | ||
outputView.printUsersCardResult(userResult); | ||
} | ||
|
||
private void showFinalResult(GameResult gameResult) { | ||
outputView.printFinalResult(gameResult.getDealerResult(), gameResult.getPlayerResults()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package domain; | ||
|
||
import java.util.Map; | ||
import java.util.function.Function; | ||
import java.util.stream.Collectors; | ||
import java.util.stream.Stream; | ||
|
||
public enum DrawCommand { | ||
DRAW("y"), | ||
STOP("n"); | ||
|
||
private static final Map<String, DrawCommand> inputDrawCommandMap = Stream.of(values()) | ||
.collect(Collectors.toMap(DrawCommand::getCommand, Function.identity())); | ||
|
||
private final String command; | ||
|
||
DrawCommand(String command) { | ||
this.command = command; | ||
} | ||
|
||
public static DrawCommand of(String inputCommand) { | ||
if(inputDrawCommandMap.containsKey(inputCommand)) { | ||
return inputDrawCommandMap.get(inputCommand); | ||
} | ||
throw new IllegalArgumentException("[ERROR] 카드 드로우 커맨드는 y,n 둘 중 하나입니다."); | ||
} | ||
|
||
private String getCommand() { | ||
return command; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package domain; | ||
|
||
public enum Number { | ||
ACE(11, "A"), | ||
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(10, "J"), | ||
QUEEN(10, "Q"), | ||
KING(10, "K"); | ||
|
||
private final int score; | ||
private final String number; | ||
|
||
Number(int score, String number) { | ||
this.score = score; | ||
this.number = number; | ||
} | ||
|
||
public int getScore() { | ||
return score; | ||
} | ||
|
||
public String getNumber() { | ||
return number; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package domain; | ||
|
||
public enum Pattern { | ||
HEART("하트"), | ||
DIAMOND("다이아몬드"), | ||
CLOVER("클로버"), | ||
SPADE("스페이드"); | ||
|
||
private final String pattern; | ||
|
||
Pattern(String pattern) { | ||
this.pattern = pattern; | ||
} | ||
|
||
public String getPattern() { | ||
return pattern; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package domain.card; | ||
|
||
public interface Card { | ||
int getScore(); | ||
|
||
String getSymbol(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package domain.card; | ||
|
||
import domain.Number; | ||
import domain.Pattern; | ||
|
||
public enum CloverCard implements Card { | ||
CLOVER_ACE(Pattern.CLOVER, Number.ACE), | ||
CLOVER_TWO(Pattern.CLOVER, Number.TWO), | ||
CLOVER_THREE(Pattern.CLOVER, Number.THREE), | ||
CLOVER_FOUR(Pattern.CLOVER, Number.FOUR), | ||
CLOVER_FIVE(Pattern.CLOVER, Number.FIVE), | ||
CLOVER_SIX(Pattern.CLOVER, Number.SIX), | ||
CLOVER_SEVEN(Pattern.CLOVER, Number.SEVEN), | ||
CLOVER_EIGHT(Pattern.CLOVER, Number.EIGHT), | ||
CLOVER_NINE(Pattern.CLOVER, Number.NINE), | ||
CLOVER_TEN(Pattern.CLOVER, Number.TEN), | ||
CLOVER_JACK(Pattern.CLOVER, Number.JACK), | ||
CLOVER_QUEEN(Pattern.CLOVER, Number.QUEEN), | ||
CLOVER_KING(Pattern.CLOVER, Number.KING); | ||
|
||
private final Pattern pattern; | ||
private final Number number; | ||
|
||
CloverCard(Pattern pattern, Number number) { | ||
this.pattern = pattern; | ||
this.number = number; | ||
} | ||
|
||
@Override | ||
public String getSymbol() { | ||
return number.getNumber() + pattern.getPattern(); | ||
} | ||
|
||
@Override | ||
public int getScore() { | ||
return number.getScore(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package domain.card; | ||
|
||
import java.util.List; | ||
|
||
public interface DeckGenerator { | ||
public abstract List<Card> generate(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package domain.card; | ||
|
||
import domain.Number; | ||
import domain.Pattern; | ||
|
||
public enum DiamondCard implements Card { | ||
DIAMOND_ACE(Pattern.DIAMOND, Number.ACE), | ||
DIAMOND_TWO(Pattern.DIAMOND, Number.TWO), | ||
DIAMOND_THREE(Pattern.DIAMOND, Number.THREE), | ||
DIAMOND_FOUR(Pattern.DIAMOND, Number.FOUR), | ||
DIAMOND_FIVE(Pattern.DIAMOND, Number.FIVE), | ||
DIAMOND_SIX(Pattern.DIAMOND, Number.SIX), | ||
DIAMOND_SEVEN(Pattern.DIAMOND, Number.SEVEN), | ||
DIAMOND_EIGHT(Pattern.DIAMOND, Number.EIGHT), | ||
DIAMOND_NINE(Pattern.DIAMOND, Number.NINE), | ||
DIAMOND_TEN(Pattern.DIAMOND, Number.TEN), | ||
DIAMOND_JACK(Pattern.DIAMOND, Number.JACK), | ||
DIAMOND_QUEEN(Pattern.DIAMOND, Number.QUEEN), | ||
DIAMOND_KING(Pattern.DIAMOND, Number.KING); | ||
|
||
private final Pattern pattern; | ||
private final Number number; | ||
|
||
DiamondCard(Pattern pattern, Number number) { | ||
this.pattern = pattern; | ||
this.number = number; | ||
} | ||
|
||
@Override | ||
public String getSymbol() { | ||
return number.getNumber() + pattern.getPattern(); | ||
} | ||
|
||
@Override | ||
public int getScore() { | ||
return number.getScore(); | ||
} | ||
} |
Oops, something went wrong.