프로그래밍/파이썬

파이썬 - 블랙잭 게임

31weeks 2023. 3. 23. 21:11
728x90
반응형

블랙잭 게임의 코드 작성하기전에 블랙잭의 룰을 먼저 알아보겠다. 간단한 텍스트로 진행되고, 컴퓨터와 1:1 플레이를 할 수 있는 블랙잭 게임이므로 아래의 세가지 룰 정도만 알아두고 적용하면 될 것 같다.

 

 

1. 힛(Hit)

  • 처음 2장의 상태에서 카드를 더 뽑는 것을 Hit이라고 한다.
  • 제스처로는 검지 손가락으로 테이블을 톡 내려주면 된다.
  • 21이 되지 않는 한 얼마든지 원하는 만큼 카드를 뽑을 수 있다.
  • 반면, 카드의 수 합산이 21이 넘으면 그 즉시 지게 되므로 뽑아서 높은 숫자를 만들되 얼마나 욕심을 부리지 않고 적당한 때에 멈추느냐가 블랙잭의 실력.
  • 이 경우는 자신만이 아니라 딜러에게도 해당되어, 자신의 숫자가 낮더라도 딜러는 17 이상이 되기 전까지는 무조건 카드를 더 받아야 하기 때문에(일명 Dealer's hit rule) 21을 넘긴 경우 딜러 버스트가 되어 딜러를 제외한 버스트 되지 않은 모든 플레이어의 승리가 된다.
  • 내가 이기지 않아도 딜러가 지면 이기는 게임.

 

2. 스탠드, 스테이(Stand, Stay)

  • 카드를 더 뽑지 않고 차례를 마치는 것을 스탠드, 혹은 스테이라고 부른다.
  • 제스처로는 손등이 위로 보이게 해서 손목 스냅을 이용해 테이블을 한번 훑어주는 모션을 취한다.
  • 카드의 합이 21을 초과하여 버스트가 되는 상황이 나오지 않는 이상 언제든 멈출 수 있다.

 

3. 딜러 규칙

  • 딜러는 플레이어의 패를 보고 히트할지 스테이할지를 결정할 수 없고, 미리 정해진 규칙에 따라 플레이해야 한다. (딜러가 무조건 기계적으로 플레이하게 만들어, 딜러의 주관적인 게임 개입을 막는 것이 목적이다.)
  • 16 이하면 무조건 히트, 17 이상이면 무조건 스테이.
  • 플레이어가 15에서 스테이했고, 딜러는 16일 때 : 딜러가 스테이하면 플레이어를 이길 수 있는 상황이지만, 딜러는 의무적으로 버스트의 위험을 감수하고 무조건 히트해야 한다
  • 플레이어가 18에서 스테이했고, 딜러는 17일 때 : 딜러가 히트를 해서 A~4 의 카드가 나오면 비기거나 이길 수 있다. 하지만, 딜러는 히트할 수 없고, 스테이해야 한다.

 

 

반응형

 

728x90

 

 

위의 규칙을 바탕으로 블랙잭 게임의 코드를 파이썬으로 구현하면,

import random

# 덱 초기화
deck = []
suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
ranks = ['Ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
for suit in suits:
    for rank in ranks:
        deck.append(rank + ' of ' + suit)

# 카드 셔플링 함수
def shuffle_deck():
    random.shuffle(deck)

# 카드 한 장 뽑는 함수
def deal_card():
    return deck.pop()

# 점수 계산 함수
def calculate_hand(hand):
    score = 0
    num_aces = 0
    for card in hand:
        rank = card.split()[0]
        if rank == 'Ace':
            num_aces += 1
            score += 11
        elif rank in ['Jack', 'Queen', 'King']:
            score += 10
        else:
            score += int(rank)
    while num_aces > 0 and score > 21:
        score -= 10
        num_aces -= 1
    return score

# 게임 실행 함수
def play_game():
    print('Welcome to Blackjack!')
    shuffle_deck()
    player_hand = [deal_card(), deal_card()]
    dealer_hand = [deal_card(), deal_card()]

    # 플레이어 턴
    while True:
        print('Player hand:', player_hand)
        player_score = calculate_hand(player_hand)
        print('Player score:', player_score)
        if player_score > 21:
            print('Bust! You lose!')
            return
        elif player_score == 21:
            print('Blackjack! You win!')
            return
        else:
            action = input('Do you want to hit or stand? ')
            if action == 'hit':
                player_hand.append(deal_card())
            elif action == 'stand':
                break

    # 딜러 턴
    while True:
        print('Dealer hand:', dealer_hand)
        dealer_score = calculate_hand(dealer_hand)
        print('Dealer score:', dealer_score)
        if dealer_score > 21:
            print('Dealer bust! You win!')
            return
        elif dealer_score >= 17:
            break
        else:
            dealer_hand.append(deal_card())

    # 결과 비교
    if player_score > dealer_score:
        print('You win!')
    elif player_score == dealer_score:
        print('Push!')
    else:
        print('You lose!')

play_game()

 

 

 

아래는 블랙잭 게임코드 실행 화면으로, 딜러 규칙도 잘 적용되어 작동하는 것을 확인할 수 있다.

블랙잭 게임 실행

 

728x90
반응형