카테고리 없음

[11-3 파이썬] 블랙잭 게임 만들기(코드 작성)

Olivia-BlackCherry 2022. 8. 20. 08:42

관련 순서도, 알고리즘은 아래의 게시글을 참고하면 된다.

https://olivia-blackcherry.tistory.com/89

 

[11-2 파이썬] 블랙잭 게임 만들기(순서도, 알고리즘)

지난 시간, 블랙잭 게임의 규칙에 대해 알아보았다. 블랙잭 규칙은 아래의 게시글을 참고하기를 바란다. https://olivia-blackcherry.tistory.com/manage/newpost/88?type=post&returnURL=https%3A%2F%2Folivia-bl..

olivia-blackcherry.tistory.com

 

1단계 알고리즘은

블랙잭 게임에서 아래의 두 가지 규칙을 제외했다.

5번 에이스의 역할 (1,11)

6번 블랙잭 외치기 (21)

<게임 규칙>
1. 베팅을 한 후 모든 플레이어와 딜러는 두 장의 카드를 받습니다.
2. 딜러는 자신의 카드 중 한 장을 오픈합니다.
3. 딜러는 카드의 합이 17이 될 때까지 반드시 추가 카드를 뽑아야 합니다.
4. 플레이어는 카드의 합이 21을 넘지 않는 범위 내에서 추가 카드를 받을 수도(Hit),받지 않을 수도(Stand)있습니다.
5. 새로 받은 카드가 에이스라면 1, 11 중 딜러와 플레이어에게 유리하게 자동으로 선택되어 계산된다. 
6. 이긴 사람의 점수가 21이거나, 비겼을 때 점수가 21이라면 "블랙잭"을 외친다.
# 정보 포함

# 카드 뽑기 
import random
list = [ 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
my_pick = random.sample(list, 2)
dealer_pick = random.sample(list, 2)
dealer_show_card = random.choice(dealer_pick)

print(f"나의 카드는 {my_pick}입니다")
print("#딜러 카드는:", dealer_pick)
print(f"#딜러 카드 중 한 장은 {dealer_show_card}입니다")

# 내 점수, 딜러 점수
def score_sum(card_pick):
  sum=0
  for card in card_pick:
    sum +=card
  return sum

my_score = score_sum(my_pick)
dealer_score = score_sum(dealer_pick)
print(f"내 점수는 {my_score}입니다")
print("#딜러 점수는:", dealer_score)

# 딜러 점수[1~16] < 17이면 카드 한장 더 받고 합계 다시 계산하기
if dealer_score < 17:
  a = True
  while a:
    one_more_card = random.sample(list, 1)
    dealer_pick.extend(one_more_card)
    dealer_score = score_sum(dealer_pick)
    print("#새로운 딜러의 카드:", dealer_pick)
    print("#새로운 딜러 점수:", dealer_score)
    if dealer_score >16:
      a = False

# 승자 뽑기
def winner(my_score, dealer_score):
  if my_score > dealer_score:
    print("이김")
  elif my_score == dealer_score:
    print("비김")
  else:
    print("짐")

# stand? or hit?
def decision(my_score, dealer_score):
  stand_hit = input("stand 할 것인가? hit 할 것인가?")
  keep_going = True
  while keep_going:
    if stand_hit == "stand":
      if dealer_score >21:
        print("이김")
        keep_going = False
      else:
        winner(my_score, dealer_score)
        keep_going= False
    elif stand_hit == "hit":
      one_more_card = random.sample(list, 1)
      my_pick.extend(one_more_card)
      my_score = score_sum(my_pick)
      print(f"내가 가진 카드 리스트는 {my_pick}입니다")
      print(f"내 점수는 {my_score}입니다")
      if my_score > 21:
        print("짐")
        keep_going = False
      else:
        stand_hit = input("stand 할 것인가? hit 할 것인가?")

decision(my_score, dealer_score)

 

 

2단계 알고리즘은

에이스의 역할과

블랙잭 외치기를 포함했다.

<게임 규칙>
1. 베팅을 한 후 모든 플레이어와 딜러는 두 장의 카드를 받습니다.
2. 딜러는 자신의 카드 중 한 장을 오픈합니다.
3. 딜러는 카드의 합이 17이 될 때까지 반드시 추가 카드를 뽑아야 합니다.
4. 플레이어는 카드의 합이 21을 넘지 않는 범위 내에서 추가 카드를 받을 수도(Hit),받지 않을 수도(Stand)있습니다.
5. 새로 받은 카드가 에이스라면 1, 11 중 딜러와 플레이어에게 유리하게 자동으로 선택되어 계산된다. 
6. 이긴 사람의 점수가 21이거나, 비겼을 때 점수가 21이라면 "블랙잭"을 외친다.
# 정보 포함
# 에이스를 뽑는 경우 포함
# 블랙잭 포함


# 카드 뽑기 
import random
list = [ 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10,11,11,11,11,11]
my_pick = random.sample(list, 2)
dealer_pick = random.sample(list, 2)
dealer_show_card = random.choice(dealer_pick)

print(f"나의 카드는 {my_pick}입니다")
print("#딜러 카드는:", dealer_pick)
print(f"#딜러 카드 중 한 장은 {dealer_show_card}입니다")

# 내 점수, 딜러 점수
def score_sum(card_pick):
  sum=0
  for card in card_pick:
    sum +=card
  return sum

my_score = score_sum(my_pick)
dealer_score = score_sum(dealer_pick)
print(f"내 점수는 {my_score}입니다")
print("#딜러 점수는:", dealer_score)

# 딜러 점수[1~16] < 17이면 카드 한 장 더 받고 합계 다시 계산하기
# 딜러 점수 >21이면, 만약 새로 받은 한 장이 에이스일 경우에는 에이스 점수를 1로 바꾸고 점수에 따라 와일문 돌리기! 
if dealer_score < 17:
  a = True
  while a:
    one_more_card = random.sample(list, 1)
    dealer_pick.extend(one_more_card)
    dealer_score = score_sum(dealer_pick)
    print("#새로운 딜러의 카드:", dealer_pick)
    print("#새로운 딜러 점수:", dealer_score)
    if dealer_score >16:
      if dealer_score >21:
        if one_more_card[0] == 11:
          dealer_pick.remove(11)
          dealer_pick.append(1)
          dealer_score = score_sum(dealer_pick)
          print("#새로운 딜러의 카드:", dealer_pick)
          print("#새로운 딜러 점수:", dealer_score)
          if dealer_score > 16:
            a = False
        else:
          a = False
      else:
        a = False

# 승자 뽑기
def winner(my_score, dealer_score):
  if my_score > dealer_score:
    if my_score == 21:
      print("블랙잭입니다.")
    print("이김")
  elif my_score == dealer_score:
    if my_score == 21:
      print("블랙잭입니다.")
    print("비김")
  else:
    if dealer_score == 21:
      print("블랙잭입니다.")
    print("짐")

# stand? or hit?
def decision(my_score, dealer_score):
  stand_hit = input("stand 할 것인가? hit 할 것인가?")
  keep_going = True
  while keep_going:
    if stand_hit == "stand":
      if dealer_score >21:
        print("이김")
        if my_score == 21:
          print("블랙잭입니다")
        keep_going = False
      else:
        winner(my_score, dealer_score)
        keep_going= False
    elif stand_hit == "hit":
      one_more_card = random.sample(list, 1)
      my_pick.extend(one_more_card)
      my_score = score_sum(my_pick)
      print(f"내가 가진 카드 리스트는 {my_pick}입니다")
      print(f"내 점수는 {my_score}입니다")
      if my_score > 21:
        if one_more_card[0] == 11:
          my_pick.remove(11)
          my_pick.append(1)
          my_score = score_sum(my_pick)
          print(f"내가 가진 카드 리스트는 {my_pick}입니다")
          print(f"내 점수는 {my_score}입니다")
          stand_hit = input("stand 할 것인가? hit 할 것인가?")
        else:
          print("짐")
          if dealer_score == 21:
            print("블랙잭입니다")
          keep_going = False
      else:
        stand_hit = input("stand 할 것인가? hit 할 것인가?")

decision(my_score, dealer_score)

 

 

3단계 알고리즘은

사용자에게 게임을 할 것인가를 묻고,

연속적으로 게임을 하거나,

게임을 종료할 수 있는 문구를 넣었다.

이를 위해 전체 코드를 하나의 함수로 묶었다.

# 정보 포함
# 에이스를 뽑는 경우 포함
# 블랙잭 포함
# 사용자에게 게임을 할 것인가 묻는 경우


def blackjack_game():
  # 카드 뽑기 
  import random
  list = [ 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
  my_pick = random.sample(list, 2)
  dealer_pick = random.sample(list, 2)
  dealer_show_card = random.choice(dealer_pick)

  print(f"나의 카드는 {my_pick}입니다")
  print("#딜러 카드는:", dealer_pick)
  print(f"#딜러 카드 중 한 장은 {dealer_show_card}입니다")

  # 내 점수, 딜러 점수
  def score_sum(card_pick):
    sum=0
    for card in card_pick:
      sum +=card
    return sum

  my_score = score_sum(my_pick)
  dealer_score = score_sum(dealer_pick)
  print(f"내 점수는 {my_score}입니다")
  print("#딜러 점수는:", dealer_score)

  # 딜러 점수[1~16] < 17이면 카드 한 장 더 받고 합계 다시 계산하기
  # 딜러 점수 >21이면, 만약 새로 받은 한 장이 에이스일 경우에는 에이스 점수를 1로 바꾸고 점수에 따라 와일문 돌리기! 
  if dealer_score < 17:
    a = True
    while a:
      one_more_card = random.sample(list, 1)
      dealer_pick.extend(one_more_card)
      dealer_score = score_sum(dealer_pick)
      print("#새로운 딜러의 카드:", dealer_pick)
      print("#새로운 딜러 점수:", dealer_score)
      if dealer_score >16:
        if dealer_score >21:
          if one_more_card[0] == 11:
            dealer_pick.remove(11)
            dealer_pick.append(1)
            dealer_score = score_sum(dealer_pick)
            print("#새로운 딜러의 카드:", dealer_pick)
            print("#새로운 딜러 점수:", dealer_score)
            if dealer_score > 16:
              a = False
          else:
            a = False
        else:
          a = False

  # 승자 뽑기
  def winner(my_score, dealer_score):
    if my_score > dealer_score:
      if my_score == 21:
        print("블랙잭입니다.")
      print("이김")
    elif my_score == dealer_score:
      if my_score == 21:
        print("블랙잭입니다.")
      print("비김")
    else:
      if dealer_score == 21:
        print("블랙잭입니다.")
      print("짐")

  # stand? or hit?
  def decision(my_score, dealer_score):
    stand_hit = input("stand 할 것인가? hit 할 것인가?")
    keep_going = True
    while keep_going:
      if stand_hit == "stand":
        if dealer_score >21:
          print("이김")
          if my_score == 21:
            print("블랙잭입니다")
          keep_going = False
        else:
          winner(my_score, dealer_score)
          keep_going= False
      elif stand_hit == "hit":
        one_more_card = random.sample(list, 1)
        my_pick.extend(one_more_card)
        my_score = score_sum(my_pick)
        print(f"내가 가진 카드 리스트는 {my_pick}입니다")
        print(f"내 점수는 {my_score}입니다")
        if my_score > 21:
          if one_more_card[0] == 11:
            my_pick.remove(11)
            my_pick.append(1)
            my_score = score_sum(my_pick)
            print(f"내가 가진 카드 리스트는 {my_pick}입니다")
            print(f"내 점수는 {my_score}입니다")
            stand_hit = input("stand 할 것인가? hit 할 것인가?")
          else:
            print("짐")
            if dealer_score == 21:
              print("블랙잭입니다")
            keep_going = False
        else:
          stand_hit = input("stand 할 것인가? hit 할 것인가?")

  decision(my_score, dealer_score)


game_going = True
while game_going:
  want_game = input("게임을 시작하시겠습니까? Y 아니면 N")
  if want_game == "Y":
    print("게임을 시작합니다! 행운을 빕니다")
    blackjack_game()
  else:
    print("게임을 종료합니다.")
    game_going = False

 

아래의 재생버튼 ▶을 눌러서 최종 결과를 실행해보세요 

 

 

+ 추가

새로운 게임을 시작한다면 이전의 화면은 콘솔창에서 삭제되도록 할 수도 있다. 

관련 코드는 아래의 게시글을 참고하기를 바란다.

https://olivia-blackcherry.tistory.com/77

 

[9-3 파이썬] 코랩, 주피터, 파이썬 콘솔 화면 출력 지우기, trinket, replit 콘솔창 지우기

다양한 프로그램 환경에서 코드의 출력 화면을 지우는 방법을 소개한다. 프로그램을 할 때 콘솔 화면을 지우는 것은 대단히 유용하게 활용할 수 있다. 코랩, 주피터, 래플릿, 트린켓 등 다양한

olivia-blackcherry.tistory.com