더보기
규칙:
- 처음 시작할 때 딜러와 나에게 2개의 랜덤 값이 주어진다. 카드는 [2,3,4,5,6,7,8,9,10,11] 중에 뽑는다.
- 2개의 랜덤 값으로 10, 11을 뽑은 경우 "black jack" 을 뽑았다고 처리 -> 승리한다. (딜러도 black jack을 뽑지 않은 경우)
- 딜러가 black jack을 뽑은 경우 유저는 즉시 패배한다. (black jack을 보유하고 있음에도)
- 에이스를 뽑은 경우, 상황에 따라 패의 값은 1 또는 11로 처리된다.
- 이때, 딜러의 카드는 두하나만 오픈한다.
- 패의 상황에 따라 랜덤 패를 더 가져오거나, 멈출 수 있다.
- 딜러는 패의 합이 17보다 아래인 경우 계속 패를 가져오도록 처리한다.
- 카드의 합이 21에 가까운 사람이 승리한다. 카드의 합이 21을 넘어가면 무조건 패배한다.
- 카드의 합이 정확히 21인 경우, 딜러 패의 합이 21인 경우를 제외하면 해당 판에서 승리한다.
- 에이스 카드가 있을 때, 일반적으로 값을 11로 처리하지만 유저 패의 합이 21을 넘어가면 1로 처리한다. (단, 에이스 카드를 1로 처리했음에도 21을 넘어가면 패배한다.)
- 딜러와 나의 카드 합이 같은 경우, draw 처리된다.
후기: 조각조각 코드를 짜는 건 크게 어렵지 않았으나, 조합하는 것에서 애먹었다...
규칙 0. 랜덤으로 불러올 예정이니 random 모듈을 import 해준다.
import random
규칙 1. 카드 뽑기
cards = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
# cards 리스트 중에 하나를 뽑는 함수
def deal_card():
card = random.choice(cards)
return card
# 보유한 카드의 값을 더해주고, 특수 케이스인 블랙잭과 에이스를 처리하는 함수
def calculate_score(cards):
# 블랙잭을 가진 경우 (11, 10 단 두장의 카드만 가진 경우) -> 점수를 0으로 치환한다
if 11 in cards and 10 in cards and len(cards) == 2:
return 0
# 에이스를 가진 경우 -> 카드의 합이 21을 넘었을 때 에이스 값을 11에서 1로 치환해준다.
# 규칙 3-2
if 11 in cards and sum(cards) > 21:
cards.append(1)
cards.remove(11)
return sum(cards)
# 유저와 컴퓨터가 두개의 카드를 뽑는다.
user_cards = []
computer_cards = []
for a in range(2):
user_cards.append(deal_card())
computer_cards.append(deal_card())
규칙 2. 새로운 패 가져오기
game_end = False
while not game_end:
user_score = calculate_score(user_cards)
computer_score = calculate_score(computer_cards)
print(f'현재 당신이 소유한 카드 : {user_cards}, 점수 : {user_score}')
print(f'컴퓨터의 카드 : {computer_cards[0]}')
if computer_score == 0 or user_score == 0 or user_score > 21:
game_end = True
else:
draw_card = input("새로운 카드를 뽑으시려면 'y'를, 멈추시려면 'n'을 입력하세요 : ")
if draw_card == 'y':
user_cards.append(deal_card())
elif draw_card == 'n':
game_end = True
if game_end == True:
while computer_score != 0 and computer_score < 17:
computer_cards.append(deal_card())
computer_score = calculate_score(computer_cards)
compare(user_score, computer_score)
print(f"\n당신이 소유한 카드 목록은 {user_cards} 이었으며, 최종 점수는 {user_score} 점 입니다.")
print(f"컴퓨터가 소유한 카드 목록은 {computer_cards} 이었으며, 최종 점수는 {computer_score} 점 입니다.")
restart_game = input("\n게임을 다시 시작하시려면 'y'를, 게임을 종료하시려면 'n'을 입력하세요 : ")
if restart_game == "y":
clear()
black_jack()
# 재귀 함수
# 게임 다시 시작을 선택한 경우, black_jack() 함수를 사용하여 다시 실행한다.
# *이를 위해 코드를 정리 해야한다. --> 4번에서 코드 완성
else:
game_end = True
규칙 3. 패 비교하기
def compare(my_score, your_score):
# 조건이 겹치는 경우가 있으므로 여러가지의 결과가 나오지 않도록
# return을 사용하여 값을 반환하고 함수를 종료한다.
if my_score == your_score:
return "\n비겼습니다. 😑"
elif your_score == 0:
return "\n게임에서 졌습니다. 컴퓨터가 블랙잭을 소유하고 있었습니다! 😭"
elif my_score == 0:
return "\n블랙잭을 소유하셨군요!😏 게임에서 이겼습니다!"
elif my_score > 21:
return "\n게임에서 졌습니다. 당신의 점수가 21점을 넘겼습니다..."
elif your_score > 21:
return "\n게임에서 이겼습니다! 컴퓨터의 점수가 21점을 넘겼습니다😉"
else:
if my_score > your_score:
return "\n게임에서 이겼습니다!"
elif my_score < your_score:
return "\n게임에서 졌습니다."
> 순서를 정리한 최종 코드
import random
from replit import clear
# 정의한 함수들 상단으로 정렬
# 함수 안에 함수가 포함되어있는 경우, 포함된 함수를 상단에 올려준다.
def calculate_score(cards):
if 11 in cards and 10 in cards and len(cards) == 2:
return 0
if 11 in cards and sum(cards) > 21:
cards.append(1)
cards.remove(11)
return sum(cards)
def compare(my_score, your_score):
if my_score == your_score:
return "\n비겼습니다. 😑"
elif your_score == 0:
return "\n게임에서 졌습니다. 컴퓨터가 블랙잭을 소유하고 있었습니다! 😭"
elif my_score == 0:
return "\n블랙잭을 소유하셨군요!😏 게임에서 이겼습니다!"
elif my_score > 21:
return "\n게임에서 졌습니다. 당신의 점수가 21점을 넘겼습니다..."
elif your_score > 21:
return "\n게임에서 이겼습니다! 컴퓨터의 점수가 21점을 넘겼습니다😉"
else:
if my_score > your_score:
return "\n게임에서 이겼습니다!"
elif my_score < your_score:
return "\n게임에서 졌습니다."
def deal_card():
card = random.choice(cards)
return card
cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
# 아래 코드를 게임 재시작을 선택했을 때 모두 실행될 수 있도록 black_jack() 함수 안에 넣어준다.
# 재귀 함수 처리
def black_jack():
user_cards = []
computer_cards = []
for a in range(2):
user_cards.append(deal_card())
computer_cards.append(deal_card())
game_end = False
while not game_end:
user_score = calculate_score(user_cards)
computer_score = calculate_score(computer_cards)
print(f'현재 당신이 소유한 카드 : {user_cards}, 점수 : {user_score}')
print(f'컴퓨터의 카드 : {computer_cards[0]}')
if computer_score == 0 or user_score == 0 or user_score > 21:
game_end = True
else:
draw_card = input("새로운 카드를 뽑으시려면 'y'를, 멈추시려면 'n'을 입력하세요 : ")
if draw_card == 'y':
user_cards.append(deal_card())
elif draw_card == 'n':
game_end = True
if game_end == True:
while computer_score != 0 and computer_score < 17:
computer_cards.append(deal_card())
computer_score = calculate_score(computer_cards)
compare(user_score, computer_score)
print(f"\n당신이 소유한 카드 목록은 {user_cards} 이었으며, 최종 점수는 {user_score} 점 입니다.")
print(f"컴퓨터가 소유한 카드 목록은 {computer_cards} 이었으며, 최종 점수는 {computer_score} 점 입니다.")
restart_game = input("\n게임을 다시 시작하시려면 'y'를, 게임을 종료하시려면 'n'을 입력하세요 : ")
if restart_game == "y":
clear()
black_jack()
else:
game_end = True
black_jack()
'python' 카테고리의 다른 글
[python] #연습문제 - 계산기 만들기 (0) | 2024.06.02 |
---|---|
[python] return 이해하기 (0) | 2024.06.02 |
[python] #연습문제 - 비밀 경매 프로그램 생성기 (0) | 2024.06.02 |
[python] 리스트 안에 새로운 딕셔너리 추가하기 (0) | 2024.06.02 |
[python] #연습문제 - caesar code 생성하기 (0) | 2024.06.01 |