/java-blackjack

블랙잭 미션 저장소

Primary LanguageJava

java-blackjack

블랙잭 미션 저장소

우아한테크코스 코드리뷰

Git commit 메세지

접두어로 docs, test, feat, fix, refactor, chore 사용 example feat: 사용자 입력 후 도메인 사용

기능 목록

  • 생성 시점에서 카드를 섞는다.
  • 카드를 뽑을 수 있다.
  • 카드가 존재하지 않을 경우, 예외가 발생한다.

플레이어들

  • 승패를 계산해서 반환한다.
    • 딜러는 모든 플레이어와 결과를 계산한다.
    • 플레이어는 딜러와의 결과만을 계산한다.
    • 딜러가 bust되었을 경우
      • 21이하 참가자는 모든 1승
      • bust된 참가자는 패로 기록한다.
    • 딜러가 21 이하인데, 플레이어랑 다른 겨우
      • 참가자는 숫자를 비교하여 21에 가까운 사람이 승리한다.
      • 딜러와 참가자의 수가 같은 경우, 패로 기록한다.
      • bust된 참가자는 패로 기록한다.
    • 딜러와 플레이어의 점수가 같은 경우
      • 블랙잭인 사람이 승리한다.
      • 그래도 무승부일 경우는 무승부로 판정한다.

딜러

  • 참가자가 카드를 뽑는다.
  • 딜러의 손패는 한장만 반환한다.
  • 딜러는 16점 이하면 카드를 추가 지급한다.
    • 16점 비교 로직을 딜러 내에서 관리한다.

플레이어

  • 참가자가 카드를 뽑는다.
  • 참가자가 뽑을 수 있는 상태인지 확인한다.

카드 손패

  • 들고 있는 카드의 전체 점수를 반환한다.
  • 카드는 점수를 반환한다.
    • Ace는 1 또는 11점으로 계산한다.
    • J,Q,K는 10으로 계산한다.
    • Ace는 21보다 클 경우에는 1로, 그렇지 않으면 11로 계산한다.

카드

  • 카드의 기호와 숫자를 반환한다.

입출력

  • 참가자 이름을 입력 받는다.
    • 각 참가자는 ,로 구분한다.
    • 참가자 이름의 중복을 검증한다.
    • 위의 형식에 맞지 않은 이름 형식은 예외가 발생한다.
  • 딜러의 카드는 한 장만 공개한다.
  • 게임 완료 후 승패를 출력한다.
  • 카드 분배 결과를 출력한다.
  • 카드를 추가 지급 받을지 물어본다.
    • 응답은 y/n로만 받을 수 있다.
    • 응답이 n이거나 카드의 합이 21일때까지 물어본다.
    • y/n 여부와 상관없이 현플레이어의 손패를 출력한다.
    • 위의 형식에 맞지 않은 응답은 예외가 발생한다.

리팩터링

  • 플레이어가 딜러로부터 카드를 받도록 리팩터링한다.
    • 딜러는 덱을 필드로 갖는다.
  • 딜러의 이름 필드를 제거한다.
  • protected 필드 직접 접근 문제 해결한다.
  • ParticipantGamer로 변경한다.
  • 불변 리스트로 변환한다.
  • Judge의 테스트를 진행한다.
  • Rank, Suit를 trumpCard 패키지로 변경한다.
  • calculateAce 메서드명을 변경한다.
  • BlackjackResult에서 count 대신 getter로 변경한다.
  • BlackjackGame 메서드 분리
  • 호출되는 메서드는 호출하는 메서드 아래에 위치한다.
    • 여러 곳에서 호출될 경우, 마지막 호출 메서드 아래에 위치한다.
    • 순서가 conflict될 경우, 함수 내의 호출 순서로 메서드 위치를 결정한다.

피드백 요구사항

  • 딜러라는 이름을 사용할 수 없게 한다.
  • 숫자를 이름으로 쓸 수 없게 한다.
  • Factory 내의 생성 로직을 카드의 타입을 인자로 전달하고 하나의 메서드로 처리한다.
  • 기본 생성자를 명시적으로 작성하지 않는다.
  • 명시적으로 NoShuffleStrategy 같은 이름을 사용해주면 테스트의 가독성을 높인다.
  • drawn에서 draw로 변경한다.
  • selfDraw를 인자로 횟수를 전달한다.
  • Player가 Card를 넘겨받게 수정한다.
  • System.lineSeperator() 가 반복적으로 나오면서 가독성을 해친다. 이를 수정한다.
  • 트럼프카드의 심볼을 복수로 변경한다.
  • Enum 마지막에 ,를 넣어 세미콜론을 하나 아래로 내리면 나중에 값을 추가할 때 conflict을 방지한다.
  • requestExtraCard처럼 동사형 메서드 네이밍을 갖게 한다.
  • 게임 로직 관리 중에서 Player가 카드를 계속 받을지 말지 결정하는 로직을 제외하고는 별도의 객체 안에서 관리하게 한다.
  • CardView라는 객체를 만들어서 그 안에 RankView, SuitView를 가지고 있고 카드 출력에 책임을 전부 관리하게 한다.
  • print 내의 비즈니스 로직은 뽑아낸다.

객체 협력 관계

결과

딜러, 플레이어 결과 정리

결과