Skip to content

[Java] 상속, 인터페이스, 유한상태머신 실습

Notifications You must be signed in to change notification settings

bugoverdose/java-blackjack

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

블랙잭 미션

  • 플레이어 및 딜러가 지닌 카드 패의 변화를 유한상태머신을 통해 구현한 코드
  • 우아한테크코스 4기 / 레벨1 / 3번째 미션

카드 패 상태 (유한상태머신)

hand 패키지

카드 패가 지닐 수 있는 5가지 상태 (CardHand 인터페이스의 구현체)

* OneCard : 카드 1장. 초기 상태.
* CanHit : 카드 2장 이상. 21점 이하. 아직 stay를 선택X.
* Stay : 카드 2장 이상. 21점 이하. 이미 stay 선택
* Blackjack : 카드 2장. 21점.
* Bust : 카드 2장 이상. 21점 초과.

hit 메서드 호출에 따른 상태 변화

* OneCard에서 한 장의 카드를 더 받으면 CanHit, Blackjack 중 한 가지로 변할 수 있다.
* CanHit에서 한 장의 카드를 더 받으면 CanHit, Stay, Bust 중 한 가지로 변할 수 있다.
* Stay, Blackjack, Bust 중 한 가지가 되면 더 이상 다른 상태로 변할 수 없다.

stay 메서드 호출 조건

* 플레이어는 CanHit 상태일 때 언제나 stay를 선택할 수 있다.
* 플레이어는 21점이 되었을 때 무조건 stay를 선택해야 한다.
* 딜러는 16점 이하일 때 무조건 hit을, 17~21점일 때는 무조건 stay를 선택해야 한다.
* OneCard, Stay, Blackjack, Bust 상태일 때는 stay를 선택할 수 없다.

기능 요구 사항

blackjack 애플리케이션

  • 게임에 참여할 플레이어의 이름을 입력 받는다.

    • 쉼표를 기준으로 분리한다.
    • 플레이어명에 포함된 좌우 공백은 제거된다.
    • 플레이어명이 입력되지 않으면 예외가 발생한다.
    • 플레이어명이 빈 문자열인 경우 예외가 발생한다.
    • 플레이어명이 중복된 경우 예외가 발생한다.
    • 플레이어명이 "딜러"인 경우 예외가 발생한다.
  • 각 플레이어별로 베팅 금액을 입력받는다.

    • 숫자 이외의 값이 입력된 경우 예외가 발생한다.
    • 음수 혹은 0이 입력된 경우 예외가 발생한다.
  • 게임을 시작하면 딜러와 모든 플레이어에게 두 장의 카드가 지급된다.

  • 딜러의 패가 처음부터 21인 경우 즉시 게임을 종료한다.

    • 블랙잭인 플레이어들은 무승부로, 그 외의 플레이어들은 무조건 패배한다.
  • 딜러와 플레이어의 카드 정보를 출력한다.

    • 딜러의 경우 두 장 중 한 장만 공개된다.
    • 플레이어의 경우 두 장 모두 공개된다.
  • 각 플레이어별로 카드를 더 뽑는다.

    • 에이스의 경우 11로 계산하지만, 점수가 21을 초과하는 경우 1로 계산하여 진행 가능 여부를 판단한다.
    • 플레이어의 현재 점수가 21을 초과한 경우, 버스트되었다는 메세지를 출력하고 카드 뽑기를 중단한다.
    • 플레이어의 현재 점수가 21 이하인 경우 카드를 한 장 더 받을지의 여부를 입력받는다. (예는 y, 아니오는 n)
    • y를 입력한 경우 카드 덱에서 한 장의 카드를 뽑아서 지급한다.
    • n을 입력한 경우 카드 뽑기를 중단한다.
    • y, n 이외의 값을 입력한 경우 예외가 발생한다.
  • 딜러는 패가 17 이상이 될 때까지 자동으로 카드를 계속 더 받게 된다.

    • 에이스의 경우 11로 계산하지만, 점수가 21을 초과하는 경우 1로 계산하여 진행 가능 여부를 판단한다.
  • 딜러와 각 플레이어의 모든 패와 점수가 동시에 공개된다.

    • 에이스의 경우 11로 계산하지만, 점수가 21을 초과하는 경우 1로 계산한다.
    • 다만, 여러 장의 에이스가 존재하는 경우, 21을 넘지 않는 선에서 가급적 에이스를 11로 계산한다.
  • 게임의 결과를 출력한다.

    • 각 플레이어별로 딜러와 패를 비교하여 승리, 패배, 무승부 여부를 판단한다.
      • 딜러의 패가 카드 3장 이상으로 구성된 21인 경우, 블랙잭인 플레이어는 승리한다.
      • 플레이어가 버스트되는 경우, 무조건 딜러가 승리한다.
        • 플레이어와 딜러의 패 모두 버스트되는 경우, 나중에 버스트된 딜러가 승리한다.
      • 딜러가 버스트되는 경우, 아직 버스트되지 않은 모든 플레이어가 승리한다.
      • 딜러와 플레이어의 패가 모두 21이하일 때 점수가 더 큰 쪽이 승리한다.
    • 딜러의 경우, 모든 플레이어와의 전적을 출력한다.
    • 플레이어의 경우, 딜러와의 승부 결과를 출력한다.
  • 베팅에 따른 딜러 및 플레이어별 최종 수익 정보를 출력한다.

    • 플레이어가 블랙잭으로 승리한 경우, 베팅금액의 1.5배를 획득한다.
    • 플레이어가 그 외의 방식으로 승리한 경우, 베팅금액만큼 획득한다.
    • 플레이어와 딜러가 서로 무승부인 경우 금액을 잃지도, 얻지도 않는다.
    • 플레이어가 패배한 경우, 베팅금액만큼 잃는다.
    • 딜러는 플레이어의 손실만큼 획득하고, 플레이어가 획득한 만큼 잃는다.

카드 정보

card 패키지

카드 덱 구성

* 카드는 4가지 심볼로 구성된다. (SPADE, HEART, DIAMOND, CLOVER)
* 카드는 13가지 랭크로 구성된다. (ACE, TWO, THREE, ..., TEN, JACK, QUEEN, KING)
* 이에 따라 한 팩의 카드는 52장으로 이루어진다. 
* 게임이 시작될 때 52장의 카드는 셔플되며, 맨 위의 카드부터 한 장씩 뽑힌다. 

카드 랭크별 점수 정보

* Ace : 1, 11 (패의 합이 21을 초과하지 않는 선에서 최대값 선택) 
* TWO, THREE, ..., TEN : 2~10까지 대응되는 번호를 그대로 사용
* JACK, QUEEN, KING : 10

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%