-
Notifications
You must be signed in to change notification settings - Fork 278
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
3단계 - 블랙잭(딜러) #566
Open
jonghoonok
wants to merge
9
commits into
next-step:jonghoonok
Choose a base branch
from
jonghoonok:step3
base: jonghoonok
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
3단계 - 블랙잭(딜러) #566
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
287bbff
feat : 딜러에게도 카드를 분배한다
826b9e8
feat : 딜러와의 점수를 비교해 결과를 표시한다
c9c6bde
피드백 반영 : 딜러가 카드 받을 수 있는지 여부를 감추기
f0cc8cf
피드백 반영 : 플레이어가 카드 받을 수 있는지 여부를 감추기
521e560
피드백 반영 : 플레이어와 딜러의 게임결과 설정하는 메소드명 변경
5c9b3c5
피드백 반영 : 일급 컬렉션 Players에 위임 사용
3e4aa37
피드백 반영 : GameResultCalculator 테스트 작성
7547274
피드백 반영 : Cards에도 위임 적용
c8d1741
피드백 반영 : Distributor 테스트 작성
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
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,6 @@ | ||
package blackjack | ||
|
||
enum class GameResult(val description: String) { | ||
WIN("승"), | ||
LOSE("패") | ||
} |
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 blackjack | ||
|
||
import blackjack.domain.Dealer | ||
import blackjack.domain.Players | ||
|
||
object GameResultCalculator { | ||
// 딜러와 각 플레이어의 점수를 비교해서 승패를 판별하고 기록함 | ||
// 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리한다 | ||
fun setResult(dealer: Dealer, players: Players) { | ||
val scoreOfDealer = dealer.getScore() | ||
val isDealerLose = scoreOfDealer > BlackJackGame.MAX_SCORE | ||
players.forEach { | ||
val scoreOfPlayer = it.getScore() | ||
it.setGameResult(isDealerLose || scoreOfPlayer > scoreOfDealer) | ||
dealer.setGameResult(!isDealerLose && scoreOfDealer > scoreOfPlayer) | ||
} | ||
} | ||
} |
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 |
---|---|---|
@@ -1,39 +1,34 @@ | ||
package blackjack.domain | ||
|
||
import blackjack.GameResult | ||
import blackjack.domain.card.Card | ||
import blackjack.domain.card.CardDeck | ||
import kotlin.random.Random | ||
import blackjack.domain.card.Cards | ||
|
||
class Dealer( | ||
private val cardDeck: CardDeck | ||
) { | ||
class Dealer(name: String, cards: Cards = Cards()) : Player(name, cards) { | ||
private var isFinished = false | ||
val gameResults = mutableListOf<GameResult>() | ||
|
||
/** | ||
* 플레이어들에게 2장씩 카드를 분배함 | ||
*/ | ||
fun dealOutCards(players: Players) { | ||
repeat(DEAL_OUT_CARD_AMOUNT){ | ||
players.players.forEach{ dealOutCard(it) } | ||
constructor(cards: Cards = Cards()) : this(DEALER_DISPLAY_NAME, cards) | ||
|
||
// 17점이 넘으면 호출되어도 더 이상 카드를 추가하지 않는다 | ||
override fun addCard(card: Card) { | ||
if (isReceivableNewCard()) { | ||
super.addCard(card) | ||
} else { | ||
isFinished = true | ||
} | ||
} | ||
|
||
/** | ||
* 플레이어들에게 1장씩 카드를 분배함 | ||
*/ | ||
fun dealOutCard(player: Player) { | ||
player.cards.addCard(peekCard()) | ||
override fun setGameResult(win: Boolean) { | ||
gameResults.add(if (win) GameResult.WIN else GameResult.LOSE) | ||
} | ||
|
||
/** | ||
* 카드덱에서 랜덤한 카드를 1장 꺼냄 | ||
*/ | ||
private fun peekCard(): Card { | ||
val random = Random.Default | ||
val randomIndex = random.nextInt(cardDeck.cards.size) | ||
return cardDeck.peekCard(randomIndex) | ||
override fun isReceivableNewCard(): Boolean { | ||
return !isFinished && getScore() < LIMIT_SCORE | ||
} | ||
|
||
companion object { | ||
const val DEAL_OUT_CARD_AMOUNT = 2 | ||
private const val DEALER_DISPLAY_NAME = "딜러" | ||
private const val LIMIT_SCORE = 17 | ||
} | ||
} |
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,40 @@ | ||
package blackjack.domain | ||
|
||
import blackjack.domain.card.Card | ||
import blackjack.domain.card.CardDeck | ||
import kotlin.random.Random | ||
|
||
class Distributor( | ||
private val cardDeck: CardDeck | ||
) { | ||
|
||
/** | ||
* 딜러와 플레이어들에게 2장씩 카드를 분배함 | ||
*/ | ||
fun dealOutCards(dealer: Dealer, players: Players) { | ||
repeat(DEAL_OUT_CARD_AMOUNT) { | ||
dealOutCard(dealer) | ||
players.forEach { dealOutCard(it) } | ||
} | ||
} | ||
|
||
/** | ||
* 플레이어들에게 1장씩 카드를 분배함 | ||
*/ | ||
fun dealOutCard(player: Player) { | ||
player.addCard(peekCard()) | ||
} | ||
|
||
/** | ||
* 카드덱에서 랜덤한 카드를 1장 꺼냄 | ||
*/ | ||
private fun peekCard(): Card { | ||
val random = Random.Default | ||
val randomIndex = random.nextInt(cardDeck.cards.size) | ||
return cardDeck.peekCard(randomIndex) | ||
} | ||
|
||
companion object { | ||
const val DEAL_OUT_CARD_AMOUNT = 2 | ||
} | ||
} |
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 |
---|---|---|
@@ -1,17 +1,33 @@ | ||
package blackjack.domain | ||
|
||
import blackjack.BlackJackGame | ||
import blackjack.GameResult | ||
import blackjack.domain.card.Card | ||
import blackjack.domain.card.Cards | ||
|
||
data class Player( | ||
open class Player( | ||
val name: String, | ||
val cards: Cards = Cards() | ||
) { | ||
lateinit var gameResult: GameResult | ||
|
||
override fun toString(): String { | ||
return name | ||
} | ||
|
||
open fun addCard(card: Card) { | ||
cards.addCard(card) | ||
} | ||
|
||
fun getScore(): Int { | ||
return cards.getScore() | ||
} | ||
|
||
open fun isReceivableNewCard(): Boolean { | ||
return getScore() < BlackJackGame.MAX_SCORE | ||
} | ||
|
||
open fun setGameResult(win: Boolean) { | ||
gameResult = if (win) GameResult.WIN else GameResult.LOSE | ||
} | ||
} |
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 |
---|---|---|
@@ -1,7 +1,3 @@ | ||
package blackjack.domain | ||
|
||
data class Players( | ||
val names: List<String> | ||
) { | ||
val players: List<Player> = names.map { Player(it) } | ||
} | ||
data class Players(private val players: List<Player>) : List<Player> by players |
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
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
CardDeck에 테스트를 작성해주시긴 했지만 이 클래스를 호출한 뒤 dealer나 players에 카드가 정상적으로 분배 되었는지 등을 테스트해볼 수 있을 것 같습니다.