Skip to content

junpakPark/java-blackjack

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

java-blackjack

페어프로그래밍을 위한 규칙

  • 타이머 : 10분
  • 타이머가 울리면 마무리하지 않고 넘기기 (이어서 못치면 사과하기)
  • 기능 단위 커밋하기

이번 미션의 목표

  • SRP
  • 모든 변수명에 final 붙이기
    • 당연히 메서드 파라미터에도 final을 붙인다.
  • 모든 원시값과 문자열을 포장한다.
  • 일급 컬렉션을 쓴다.
  • 객체지향생활체조를 모두 만족한다.
    • 9번은 쓰지 않는다 말고 지양한다 수준으로 맞춰본다.
  • 모든 클래스에 abstract 혹은 final을 추가한다.
  • 추상 클래스의 메서드에 abstract 혹은 final을 추가한다.

추가된 프로그래밍 요구 사항

  • 모든 엔티티를 작게 유지한다.
  • 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
  • 딜러와 플레이어에서 발생하는 중복 코드를 제거해야 한다.

2단계 추가된 기능 요구사항

  • 플레이어는 게임을 시작할 때 배팅 금액을 정해야 한다.
  • 단, 카드를 추가로 뽑아 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

    • Scorevalue가 입력값보다 작은지 확인
    • 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

    • inputboolean으로 변환
  • InputView

    • 플레이어 리스트 입력
    • 베팅금액 입력
    • 추가 카드 뽑기 여부 확인 입력
  • OutputView

    • 플레이어 카드 목록을 출력한다.
    • 딜러의 히트/스테이 여부를 출력한다.
    • 컨트롤러에서 딜러의 점수가 17 이상일때까지 돌리기.
    • 게임을 완료한 후 각 플레이어별로 점수를 출력한다.
    • 게임을 완료한 후 각 플레이어별로 승패를 출력한다.

기능 요구 사항 분석 후 추가 고려 사항

  • 플레이어 이름 중복 금지
  • 플레이어 이름은 1자 이상 10자 이하
  • 플레이어의 점수 총 합이 21인 경우 추가로 카드를 뽑지 못하게 한다.
  • 플레이어가 이기면 베팅 금액만큼 수익을 지급한다.
  • 플레이어가 지면 베팅 금액을 잃는다. (수익이 -다)
  • 플레이어가 비기면 베팅금만 돌려받는다. (수익은 0이다.)
  • 베팅금은 최소 1000 이상부터 베팅 가능하다.
  • 베팅금은 100 단위로 베팅 가능하다.

질문 사항

  • 이름을 받는 시점과 베팅금을 받는 시점이 달라서 빌더 패턴을 이용해서 처리해보았는데 이게 적절한 사용이 맞는지 의심스럽습니다.
  • DTO 사용에 대한 논의가 많아서 적용해보았는데 DTOFactory 안에 로직이 들어갔다고 봐야하는지 아닌지 의심스럽습니다.
  • 블랙잭 2차 피드백 강의에서 상태패턴을 적용해서 다형성을 극대화했었는데, 이번 PR에 대한 리뷰가 끝나면 해당 구조를 적용해볼까 합니다.

About

블랙잭 미션 저장소

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors