데이터 분석가

파이썬(Python) 블랙잭(Blackjack) 프로젝트 본문

파이썬(python) 프로젝트 모음

파이썬(Python) 블랙잭(Blackjack) 프로젝트

PlintAn 2023. 3. 22. 13:00

안녕하세요 !!

 

블랙잭 고양이

 

이번 시간에는 블랙잭을 만드는 코드를 짜 볼 건데요

 

이 카드 게임에 대해 간단히 설명하자면, 카드를 뽑아 21에 가깝거나 21을 만들면 이기는 게임입니다 !

 

 

import random
from replit import clear
from art import logo

def deal_card():
"""덱에서 임의의 카드를 사용합니다"""
  cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] #11은 클로버 에이스 카드
  card = random.choice(cards) #card는 cards 목록에서 랜덤 뽑기 
  return card #랜덤으로 뽑힌 카드를 리턴 반환

 

가장 먼저 첫 번째 def deal_card(): 라는 cards 리스트 내에 있는 카드를 랜덤 선택하여

 

그 값을 리턴하는 def문을 선언합니다.

 

def calculate_score(cards):
  """뽑은 카드를 계산한다"""

  if sum(cards) == 21 and len(cards) == 2: #11과 10을 뽑았을 경우이다
    return 0 #0을 반환

  if 11 in cards and sum(cards) > 21: #21을 넘었는데 클로버 에이스(11)을 가질 경우
    cards.remove(11) #에이스(1,11) 둘 중 선택 가능하기에
    cards.append(1) #1로 대체한다
  return sum(cards) #1로 대체한 값을 다시 계산한다

첫 번째 def deal_card(): 을 통해 선택된 카드 값들을

 

두 번째 def calculate_score(cards) 를 이용해 값들을 합산하거나, 블랙잭(21)일 경우 0, 에이스(1 or 11)를 가질 경우

 

를 계산합니다. 이 때 , 에이스를 11로 계산하였는데 21을 넘기는 버스트일 경우 1로 변환.

def compare(user_score, computer_score): #유저와 컴퓨터를 비교하는 함수
  
  if user_score > 21 and computer_score > 21: #유저 21 초과, 컴퓨터 21 초과일 경우
    return "You went over. You lose .·´¯`(>▂<)´¯`·. " #당신은 졌습니다


  if user_score == computer_score: #비길 경우
    return "Draw ╚(•⌂•)╝" #무승부
  elif computer_score == 0: #컴퓨터가 블랙잭 21(0은 블랙잭이다)일 경우
    return "Lose, Opponent has Blackjack (●'◡'●)" #컴퓨터는 블랙잭이다
  elif user_score == 0: #유저가 블랙잭일 경우
    return "Win with a Blackjack ☆*: .。. o(≧▽≦)o .。.:*☆" # 이겼다
  elif user_score > 21: #유저가 버스트(21초과)일 경우
    return "You went over. You lose ༼ つ ◕_◕ ༽つ" #당신은 졌습니다
  elif computer_score > 21: #컴퓨터 버스트(21초과)
    return "Opponent went over. You Win (●'◡'●)" #상대방은 버스트로 당신이 이겼습니다
  elif user_score > computer_score: #유저가 컴퓨터보다 21에 가까운 수
    return "You Win 👍😁"
  else:
    return "You Lose 🤣" #컴퓨터 보다 숫자가 작은 수 이므로 패배

 

세 번째 def compare(user_score, computer_score) 을 이용해서 사용자와, 컴퓨터를 비교합니다.

 

각각의 경우의 수에 대해서 Blackjack 룰대로 표현하여 출력 값을 정합니다.

 

이 경우 elif를 이용했는데 단순히 사용자와 컴퓨터 중 21을 가지거나 21에 근접한 수를 가진 쪽이 이기게 됩니다

 

def play_game(): #게임을 시작합니다

  print(logo) #로고 출력

  user_cards = [] #유저 카드를 여기 리스트에 저장
  computer_cards = [] #컴퓨터 카드를 여기 리스트에 저장
  is_game_over = False #while not문을 사용하기 전에 False 선언

  for _ in range(2): #카드를 2번 뽑는다
    user_cards.append(deal_card()) #랜덤 초이스 된 카드를 user_card 리스트 저장
    computer_cards.append(deal_card()) #랜덤 초이스 된 카드를 computer_card 리스트

네 번째 def play_game():  반복문은 사용자가 뽑게 되는 카드를 user_cards = [] 리스트에 저장,

컴퓨터가 뽑게 되는 카드를 computer_cards = [] 리스트에 저장하고

 

while not 문을 이용하기 전에 Flase 값을 선언합니다.

 

그 다음 def play_game(): 의 이중 for문은 첫 번째 def deal_card()를 두번 수행하여 리스트에 넣습니다.

 

  while not is_game_over: #False일 경우 게임 중단
# 유저와 컴퓨터 중 블랙잭이거나 21을 넘는 경우 게임 중단
    user_score = calculate_score(user_cards) #유저의 뽑은 카드를 더한 값
    computer_score = calculate_score(computer_cards) #컴퓨터의 뽑은 카드 더한 값
    
    print(f"   Your cards: {user_cards}, current score: {user_score}")
    print(f"   Computer's first card: {computer_cards[0]}")

    if user_score == 0 or computer_score == 0 or user_score > 21: #블랙잭 or 버스트
      is_game_over = True
    else:

      user_should_deal = input("Type 'y' to get another card, type 'n' to pass: ")
      if user_should_deal == "y": #"예" 카드를 추가로 더 받는다
        user_cards.append(deal_card()) #추가로 더 받은 카드를 리스트에 추가한다
      else:
        is_game_over = True #"아니오" 카드를 추가로 안 받을 경우

그 다음 다섯 번째 while not 문을 이용하여 이중 for문의 카드 두 번을 뽑은 리스트를 합산하여 user_score, computer_score을

 

구합니다. 그 결과 값이 0일 경우(블랙잭 = 0) 21이 넘는 버스트(파산)일 경우 True를 이용해 while문을 벗어납니다

 

else로 해당 사항이 없을 경우 카드를 추가로 받으며 반복합니다.

 

  while computer_score != 0 and computer_score < 17:
        #컴퓨터 블랙잭이 아니거나 17보다 작을 경우
    computer_cards.append(deal_card()) #17보다 작은 경우 추가로 카드를 드로우
    computer_score = calculate_score(computer_cards) #추가로 드로우 한 카드를 합산

  print(f"   Your final hand: {user_cards}, final score: {user_score}")
  print(f"   Computer's final hand: {computer_cards}, final score: {computer_score}")
  print(compare(user_score, computer_score))

while input("Do you want to play a game of Blackjack? Type 'y' or 'n': ") == "y":
    #'y' '예'를 선택할 경우 user_score, computer_score 등 리스트 모두 초기화
  clear()
  play_game()

여섯 번째 while 문을 이용해 카드를 추가로 드로우 하거나 종료합니다.

 

마지막 while input문은 'y'를 선택할 경우 user_score, computer_score 등 리스트 값이 모두 초기화 되고

 

play_game으로 다시 게임을 시작하게 됩니다

 

이렇게 우리는 함께 블랙잭 게임에 대해 알아보았는데요, 사실 제가 코드를 짠 블랙잭 게임은

 

cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] 중에서 계속된 드로우 하는 상황이라

 

매번 각각의 숫자를 뽑을 확률이 같다는 한계점이 있습니다. . . 

 

아직 제가 많이 부족해서 여기까지가 한계인 것 같습니다..

 

이번 게임은 기존 게임과 비교될 정도로 매우 복잡하게 얽힌 코드였는데요, 그래도 용기내서 한번씩

 

도전해봅시다 !

 

Comments