- 타이머 : 10분
- 타이머가 울리면 마무리하지 않고 넘기기 (이어서 못치면 사과하기)
- 기능 단위 커밋하기
- SRP
- 모든 변수명에
final
붙이기- 당연히 메서드 파라미터에도
final
을 붙인다.
- 당연히 메서드 파라미터에도
- 모든 원시값과 문자열을 포장한다.
- 일급 컬렉션을 쓴다.
- 객체지향생활체조를 모두 만족한다.
- 9번은 쓰지 않는다 말고 지양한다 수준으로 맞춰본다.
- 모든 클래스에
abstract
혹은final
을 추가한다. - 추상 클래스의 메서드에
abstract
혹은final
을 추가한다.
- 모든 엔티티를 작게 유지한다.
- 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
- 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.
- 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다.
- 단, 카드를 추가로 뽑아 21을 초과할 경우 배팅 금액을 모두 잃게 된다.
- 유저가 bust인 경우, 딜러의 bust와 상관 없이 배팅 금액을 모두 잃는다고 해석한다.
- 처음 두 장의 카드 합이 21일 경우 블랙잭이 되면 베팅 금액의 1.5 배를 딜러에게 받는다.
- 딜러와 플레이어가 모두 동시에 블랙잭인 경우 플레이어는 베팅한 금액을 돌려받는다.
- 딜러가 21을 초과하면 그 시점까지 남아 있던 플레이어들은 가지고 있는 패에 상관 없이 승리해 베팅 금액을 받는다.
-
Card
-
Suit
enum -
Rank
enum - King, Queen, Jack은 각각 10으로 계산한다
-
-
Cards
- Ace가 있는지 확인
- 카드가 Ace인지 확인
- 카드를 받음
-
RandomCardGenerator
-
Card
52장 생성 - 카드 셔플
-
-
Deck
-
RandomGenerator
에게 52장의List<Card>
를 받고shuffle
해서deque
에 저장 -
deque
에서 카드를 한장 제거하고, 그 카드를 리턴한다.
-
-
Score
-
Score
의value
가 입력값보다 작은지 확인 -
Score
가 21보다 작은지 확인 - 보너스 스코어를 더할 수 있는 지 확인
- 다른 스코어를 입력받았을 때 그 차이를 정수로 반환
-
value
에 보너스 스코어를 더해서 반환
-
-
Hand
-
Cards
-
Score
- Bust 인지 확인
- 새로운 카드를 받을 시 점수 추가
- Soft 여부 확인 후 점수 반환
-
-
Name
- 이름이 빈칸인지 여부 검증
- 이름의 길이가 10 이하인지 검증
- 이름이 딜러가 아닌지 검증
-
BetAmount
- 최소 베팅금이 1000 이상인지 확인
- 최소 베팅 단위가 100인지 확인
- 승리했을 경우, 베팅 금액을 반환
- 졌을 경우, 베팅 금액에 -1을 곱한 값을 반환
- 무승부인 경우, 0을 반환
-
PlayerInfo
-
Name
-
BetAmount
- 빌더 패턴을 이용하여 입력값이 다 들어왔을 경우 인스턴스 생성
-
-
Dealer
- 카드를 한장만 공개함
- 16 이하면 무조건 카드를 한장 더 뽑음 / 17점 이상이면 추가 X
- 소프트 17이면 스테이한다.
-
Participant
- 21미만이면 카드를 더 뽑을 건지 묻는다. (21이상이면 묻지않는다.)
- 21 미만이고, 본인이 희망하면 카드를 한장 더 뽑는다.
- 21이상이면 스테이한다.
-
Participants
-
Participant
인스턴스들의 이름 중복 여부를 검증한다. -
Participant
인스턴스들의 메서드 for문을 이용해서 시킨다.
-
-
Players
-
Dealer
-
Participants
-
-
Result : Enum
- 딜러와 참가자의 스코어를 비교한다
- 승패여부를 알려준다
- 딜러와 참가자의 스코어를 비교한다
-
Results
-
ResultType
을 키로 하고 해당하는List<Participant>
를 value로 하는 맵을 갖는다. - 각 리스트와 리스트의 사이즈를 getter로 리턴한다.
-
-
BlackjackGame
- 게임을 시작하면 플레이어와 딜러에게 두 장의 카드를 지급한다.
- 21점을 넘지 않으면 계속해서 카드를 뽑을 수 있다.
- 딜러와 플레이어 중 카드의 합이 21 또는 21에 가장 가까운 숫자를 가지는 쪽을 판별한다.
- 딜러의 점수가 21 초과인 경우, 플레이어의 점수와 상관 없이 모든 플레이어들이 승리하는 것으로 간주한다.
- 딜러와 플레이어의 점수 합이 같은 경우 무승부로 처리한다
-
Command
-
input
을boolean
으로 변환
-
-
InputView
- 플레이어 리스트 입력
- 베팅금액 입력
- 추가 카드 뽑기 여부 확인 입력
-
OutputView
- 플레이어 카드 목록을 출력한다.
- 딜러의 히트/스테이 여부를 출력한다.
- 컨트롤러에서 딜러의 점수가 17 이상일때까지 돌리기.
- 게임을 완료한 후 각 플레이어별로 점수를 출력한다.
- 게임을 완료한 후 각 플레이어별로 승패를 출력한다.
- 플레이어 이름 중복 금지
- 플레이어 이름은 1자 이상 10자 이하
- 플레이어의 점수 총 합이 21인 경우 추가로 카드를 뽑지 못하게 한다.
- 플레이어가 이기면 베팅 금액만큼 수익을 지급한다.
- 플레이어가 지면 베팅 금액을 잃는다. (수익이 -다)
- 플레이어가 비기면 베팅금만 돌려받는다. (수익은 0이다.)
- 베팅금은 최소 1000 이상부터 베팅 가능하다.
- 베팅금은 100 단위로 베팅 가능하다.
- 이름을 받는 시점과 베팅금을 받는 시점이 달라서 빌더 패턴을 이용해서 처리해보았는데 이게 적절한 사용이 맞는지 의심스럽습니다.
- DTO 사용에 대한 논의가 많아서 적용해보았는데 DTOFactory 안에 로직이 들어갔다고 봐야하는지 아닌지 의심스럽습니다.
- 블랙잭 2차 피드백 강의에서 상태패턴을 적용해서 다형성을 극대화했었는데, 이번 PR에 대한 리뷰가 끝나면 해당 구조를 적용해볼까 합니다.