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에 대한 리뷰가 끝나면 해당 구조를 적용해볼까 합니다.