-
Notifications
You must be signed in to change notification settings - Fork 388
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단계 - 블랙잭 구현] 현구막(최현구) 미션 제출합니다. #147
Changes from all commits
7253882
f080ffc
8e9d573
048c307
598aa92
ad90477
6d6d18a
7761340
6c9311a
be25491
1cc6048
336fa85
14f8a2b
ec5ea9b
54b595c
6d5dd92
3ff5f52
410f23d
9d11355
730f1c8
401d5cb
109882a
5bc9fd7
749ea1c
8dc738c
dfa2844
f6f3334
83cd6f6
f9e301c
7729e99
832ba0d
822610f
c9c614f
5bc2a30
ceab5ad
4390fd6
ae33e6e
d5b9258
23c0fe7
110209b
00b7a36
f11621e
66744d0
45913ec
d466c3a
6855220
db5bd0c
3845fb1
15da9a6
fd465b6
cd17b80
07ea032
3d8c0ef
8110b0c
a7bb0b9
b2bd489
55b789d
8cd8b02
ddc902f
b0af6a5
1a7ec15
742b87d
813ddad
55b0fac
08fb3b1
dc56f69
c5c958a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package blackjack; | ||
|
||
import blackjack.controller.BlackjackController; | ||
|
||
public class Application { | ||
|
||
public static void main(String[] args) { | ||
BlackjackController blackjackController = new BlackjackController(); | ||
blackjackController.play(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
package blackjack.controller; | ||
|
||
import blackjack.domain.BlackjackManager; | ||
import blackjack.domain.DtoAssembler; | ||
import blackjack.domain.participant.Dealer; | ||
import blackjack.domain.participant.Players; | ||
import blackjack.view.InputView; | ||
import blackjack.view.OutputView; | ||
import blackjack.view.dto.ParticipantDto; | ||
import blackjack.view.dto.ResultDto; | ||
import java.util.List; | ||
|
||
public class BlackjackController { | ||
|
||
public void play() { | ||
Dealer dealer = new Dealer(); | ||
Players players = new Players(InputView.getPlayerNames()); | ||
BlackjackManager blackjackManager = new BlackjackManager(dealer, players); | ||
|
||
initDrawCardsDealerAndAllPlayers(blackjackManager); | ||
hitOrStayAllPlayers(blackjackManager); | ||
hitDealerUntilOverLimitScore(blackjackManager); | ||
printCardsWithScoreOfDealerAndAllPlayers(blackjackManager); | ||
printBlackjackResult(blackjackManager); | ||
} | ||
|
||
private void initDrawCardsDealerAndAllPlayers(BlackjackManager blackjackManager) { | ||
blackjackManager.initDrawCards(); | ||
ParticipantDto dealerInitStatus = DtoAssembler | ||
.createDealerInitStatusDto(blackjackManager.getDealer()); | ||
List<ParticipantDto> playerStatuses = DtoAssembler | ||
.createPlayerStatusDtos(blackjackManager.getPlayers()); | ||
OutputView.printInitStatuses(dealerInitStatus, playerStatuses); | ||
} | ||
|
||
private void hitOrStayAllPlayers(BlackjackManager blackjackManager) { | ||
while (!blackjackManager.isFinishedAllPlayers()) { | ||
hitOrStayCurrentPlayer(blackjackManager); | ||
blackjackManager.passTurnToNextPlayer(); | ||
} | ||
blackjackManager.passTurnToNextPlayer(); | ||
} | ||
|
||
private void hitOrStayCurrentPlayer(BlackjackManager blackjackManager) { | ||
if (!blackjackManager.isFinishedCurrentPlayer()) { | ||
blackjackManager.hitOrStayCurrentPlayer( | ||
InputView.getHitOrStay(blackjackManager.getCurrentPlayerName())); | ||
OutputView.printPlayerStatus( | ||
DtoAssembler.createPlayerStatusDto(blackjackManager.getCurrentPlayer())); | ||
} | ||
} | ||
|
||
private void hitDealerUntilOverLimitScore(BlackjackManager blackjackManager) { | ||
OutputView.printNewLine(); | ||
while (!blackjackManager.isFinishedDealer()) { | ||
hitOrStayDealer(blackjackManager); | ||
} | ||
OutputView.printNewLine(); | ||
} | ||
|
||
private void hitOrStayDealer(BlackjackManager blackjackManager) { | ||
if (blackjackManager.isDealerScoreOverThenLimit()) { | ||
blackjackManager.stayDealer(); | ||
return; | ||
} | ||
blackjackManager.hitDealer(); | ||
OutputView.printDealerHit(); | ||
} | ||
|
||
private void printCardsWithScoreOfDealerAndAllPlayers(BlackjackManager blackjackManager) { | ||
OutputView | ||
.printStatusWithScore(DtoAssembler.createDealerStatusDto(blackjackManager.getDealer())); | ||
DtoAssembler.createPlayerStatusDtos(blackjackManager.getPlayers()) | ||
.forEach(OutputView::printStatusWithScore); | ||
} | ||
|
||
private void printBlackjackResult(BlackjackManager blackjackManager) { | ||
Dealer dealer = blackjackManager.getDealer(); | ||
Players players = blackjackManager.getPlayers(); | ||
ResultDto dealerResult = DtoAssembler.createDealerResultDto(dealer, players); | ||
List<ResultDto> playerResultDtos = DtoAssembler.createPlayerResultDtos(dealer, players); | ||
OutputView.printBlackjackResult(dealerResult, playerResultDtos); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
package blackjack.domain; | ||
|
||
import blackjack.domain.carddeck.CardDeck; | ||
import blackjack.domain.participant.Dealer; | ||
import blackjack.domain.participant.Player; | ||
import blackjack.domain.participant.Players; | ||
|
||
public class BlackjackManager { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 해당 객체의 필요성을 잘 모르겠어요. 카드를 나눠주는 행위는 컨트롤러에서 수행 가능할 것 같고 get 메소드들은 playerResult 에서 가능할 것 같은데 그럼 playerResult 를 객체로 만드는것은 어떤가요? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. CardDeck을 딜러가 아닌 |
||
|
||
private final CardDeck cardDeck; | ||
private final Dealer dealer; | ||
private final Players players; | ||
|
||
public BlackjackManager(final Dealer dealer, final Players players) { | ||
this(CardDeck.newShuffledDeck(), dealer, players); | ||
} | ||
|
||
public BlackjackManager(final CardDeck cardDeck, final Dealer dealer, final Players players) { | ||
this.cardDeck = cardDeck; | ||
this.dealer = dealer; | ||
this.players = players; | ||
} | ||
|
||
public void initDrawCards() { | ||
this.dealer.initDraw(this.cardDeck); | ||
this.players.initDraw(this.cardDeck); | ||
} | ||
|
||
public void hitOrStayCurrentPlayer(boolean isPlayerHit) { | ||
if (isPlayerHit) { | ||
this.players.drawFirstOrderPlayer(this.cardDeck.draw()); | ||
return; | ||
} | ||
this.players.stayFirstOrderPlayer(); | ||
} | ||
|
||
public void passTurnToNextPlayer() { | ||
this.players.passTurnToNextPlayer(); | ||
} | ||
|
||
public boolean isFinishedCurrentPlayer() { | ||
return this.players.isFinishedCurrentPlayer(); | ||
} | ||
|
||
public boolean isFinishedAllPlayers() { | ||
return this.players.isAllPlayerFinished(); | ||
} | ||
|
||
public void hitDealer() { | ||
this.dealer.draw(this.cardDeck.draw()); | ||
} | ||
|
||
public void stayDealer() { | ||
this.dealer.stay(); | ||
} | ||
|
||
public boolean isDealerScoreOverThenLimit() { | ||
return this.dealer.isOverThenLimitScore(); | ||
} | ||
|
||
public boolean isFinishedDealer() { | ||
return this.dealer.isFinished(); | ||
} | ||
|
||
public Players getPlayers() { | ||
return this.players; | ||
} | ||
|
||
public Player getCurrentPlayer() { | ||
return this.players.getFirstOrderPlayer(); | ||
} | ||
|
||
public String getCurrentPlayerName() { | ||
return this.players.getFirstOrderPlayerName(); | ||
} | ||
|
||
public Dealer getDealer() { | ||
return this.dealer; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
package blackjack.domain; | ||
|
||
import blackjack.domain.carddeck.Card; | ||
import blackjack.domain.participant.Dealer; | ||
import blackjack.domain.participant.Player; | ||
import blackjack.domain.participant.Players; | ||
import blackjack.view.dto.CardDto; | ||
import blackjack.view.dto.ParticipantDto; | ||
import blackjack.view.dto.ResultDto; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
public class DtoAssembler { | ||
|
||
private static final String DELIMITER = ", "; | ||
|
||
public static ParticipantDto createDealerInitStatusDto(final Dealer dealer) { | ||
return new ParticipantDto( | ||
createCardDtos(dealer.getInitCard()), | ||
dealer.getScoreToInt() | ||
); | ||
} | ||
|
||
public static ParticipantDto createDealerStatusDto(Dealer dealer) { | ||
return new ParticipantDto( | ||
createCardDtos(dealer.getCards()), | ||
dealer.getScoreToInt() | ||
); | ||
} | ||
|
||
public static List<ParticipantDto> createPlayerStatusDtos(final Players players) { | ||
return players.toList() | ||
.stream() | ||
.map(DtoAssembler::createPlayerStatusDto) | ||
.collect(Collectors.toList()) | ||
; | ||
} | ||
|
||
public static ParticipantDto createPlayerStatusDto(final Player player) { | ||
return new ParticipantDto( | ||
player.getName(), | ||
createCardDtos(player.getCards()), | ||
player.getScoreToInt() | ||
); | ||
} | ||
|
||
private static List<CardDto> createCardDtos(final List<Card> cards) { | ||
return cards.stream() | ||
.map(card -> new CardDto(card.getNumberName() + card.getPatternName())) | ||
.collect(Collectors.toList()) | ||
; | ||
} | ||
|
||
public static ResultDto createDealerResultDto(final Dealer dealer, Players players) { | ||
List<Result> results = getResults(dealer, players); | ||
return new ResultDto( | ||
getResultString(results, Result.WIN) + DELIMITER | ||
+ getResultString(results, Result.LOSE) + DELIMITER | ||
+ getResultString(results, Result.DRAW) | ||
); | ||
} | ||
|
||
private static List<Result> getResults(final Dealer dealer, final Players players) { | ||
return players.toList() | ||
.stream() | ||
.map(player -> player.judgeByDealerState(dealer)) | ||
.map(Result::reverse) | ||
.collect(Collectors.toList()); | ||
} | ||
|
||
private static String getResultString(final List<Result> results, final Result result) { | ||
return results.stream() | ||
.filter(compareResult -> compareResult.equals(result)) | ||
.count() + result.getResult(); | ||
} | ||
|
||
public static List<ResultDto> createPlayerResultDtos(final Dealer dealer, | ||
final Players players) { | ||
return players.toList() | ||
.stream() | ||
.map(player -> new ResultDto(player.getName(), | ||
player.judgeByDealerState(dealer).getResult())) | ||
.collect(Collectors.toList()); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package blackjack.domain; | ||
|
||
public enum Result { | ||
|
||
WIN("승"), | ||
LOSE("패"), | ||
DRAW("무"); | ||
|
||
private final String result; | ||
|
||
Result(final String result) { | ||
this.result = result; | ||
} | ||
|
||
public Result reverse() { | ||
if (this == WIN) { | ||
return LOSE; | ||
} | ||
if (this == LOSE) { | ||
return WIN; | ||
} | ||
return DRAW; | ||
} | ||
|
||
public String getResult() { | ||
return this.result; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
해당 로직이 blackjackManager 밖에 나와 있을 필요가 있나요 ?
딜러가 모든 패를 받고 출력을 해도 될 것 같아요
현재
변경
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아... 출력 예시만 따라서 구현을 했는데, 더 유연하게 생각해볼 수 있었네요. 😮😮😮