KEEP GOING

[python] (2) 블랙잭 GUI 게임 : 내부 로직 구현 본문

project/project4: blackjack GUI programming

[python] (2) 블랙잭 GUI 게임 : 내부 로직 구현

jmHan 2021. 11. 25. 12:26
반응형

 

1. innerCode.py

import random

marks = ['spades', 'diamonds', 'hearts', 'clubs']
card_english = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']


# 파일 입출력
def load():
    try:
        f = open("money.dat", 'r')
        return int(f.readline())
    except FileNotFoundError:
        f = open("money.dat", 'w')
        f.write('100000')
        return 100000


def write(money):
    f = open("money.dat", 'w')
    f.write(money)
    f.close()

# 결과에 따라 보유금액 저장
def set_money(now, betting, num):
    # lose : 0
    if num == 0:
        write(str(now - betting))
        return now - betting
    # win : 1
    elif num == 1:
        write(str(now + betting))
        return now + betting
    # Black jack : 3
    elif num == 3:
        write(str(int(now + (1.5 * betting))))
        return int(now + (betting * 1.5))
    else:
        return now


# 플레이어와 딜러에게 카드 두장씩 지급, 카드뭉치에서 카드 제거
def twocard(card):
    cardList = []
    for i in range(2):
        cardList.append(card.pop(0))
    return cardList


# 카드뭉치에서 새로운 카드 받기
def cardappend(cardlist, card):
    cardlist.append(card.pop(0))


# end 버튼 클릭 이벤트, Lose: 0 Win: 1 Draw 2
def fight(player_result, dealer_result):
    if player_result == dealer_result:
        return 2
    elif player_result < dealer_result:
        return 0
    elif player_result > dealer_result:
        return 1

# burst인지 확인
def burst(result):
    if result > 21:
        return True

# 결과 리턴
def get_fight_text(num):
    if num == 0:
        return "Lose"
    elif num == 1:
        return "Win"
    elif num == 3:
        return "Black Jack!!"
    else:
        return "Draw"

# 카드 뭉치 생성
def set_card():
    return random.sample(range(52), 17)

# 카드패의 합 계산
def count(card):
    result = 0
    cnt = 0
    for data in card:
        if data % 13 >= 10:
            result += 10
        else:
            result += data % 13 + 1
            # if data == A
            if data % 13 == 0:
                cnt += 1

    for _ in range(cnt):
        # A : 1 or 11
        if result + 10 <= 21:
            result += 10
        else:
            break

    return result

# 카드패를 문자열로 변환
def intToString_card(card):
    card_list = []
    for data in card:
        cardsuit = marks[data//13]
        cardnumber = card_english[data % 13]
        card = str(cardsuit) + str(cardnumber)
        card_list.append(card)
    return card_list

# stay시 dealer card에 카드패 추가
def dealer_algo(result, who, card):
    while result <= 16:
        cardappend(who, card)
        if count(who) > 16:
            break

 

 

2. innerCode_test.py

from innerCode import *

cards = set_card()
print('cards: ', cards)

playerCards = twocard(cards)
dealerCards = twocard(cards)

print('playerCards: ', playerCards)
print('dealerCards: ', dealerCards)

print('int to String playerCards: ', intToString_card(playerCards))
print('int to String dealerCards: ', intToString_card(dealerCards))

money = load()
print('money: ', money)
betting_money = int(input('please bet your money: '))

while True:
    print('count of playerCards...', count(playerCards))
    print('count of dealerCards...', count(dealerCards))
    if count(playerCards) == 21:
        print(get_fight_text(3))
        set_money(money,betting_money,3)
        break
    elif burst(count(playerCards)):
        print('player ' + get_fight_text(0))
        set_money(money, betting_money, 0)
        break
    else:
        result = int(input('choose Hit(1) or Stay(2): '))
        # Hit (카드 추가)
        if result == 1:
            cardappend(playerCards, cards)
            print('appended playerCards: ', playerCards)
            continue
        # Stay (승부)
        else:
            if count(dealerCards) > 17:
                print('fight!!')
            else:
                dealer_algo(count(dealerCards),dealerCards,cards)
                print('appended dealerCards: ', dealerCards)
            if count(dealerCards) == 21:
                print('dealer ' + get_fight_text(3))
                set_money(money, betting_money, 0)
                break
            elif burst(count(dealerCards)):
                print(get_fight_text(1))
                set_money(money, betting_money, 1)
                break
            else:
                res = fight(count(playerCards),count(dealerCards))
                print(get_fight_text(res))
                if res == 2:
                    set_money(money, betting_money, 2)
                elif res == 0:
                    set_money(money,betting_money,0)
                else:
                    set_money(money, betting_money, 1)
                break
money = load()
print('money: ', money)

 

3. 테스트 결과

 

Hit을 선택하여 cards 리스트의 원소 하나가 playerCards에 추가되었고 continue처리로 인해 while문이 다시 동작한다. 카드 합이 21을 초과하거나 21이 되지 않아서 다시 Hit과 Stay을 선택할 수 있다. 카드합이 18이므로 더이상 Hit은 위험하다고 판단되어 Stay인 2를 선택하였다. 딜러의 카드 합이 17을 넘지 않으므로 (11인 상태) dealer_algo 메소드가 동작하였다. 그래서 dealerCards에 카드패가 추가되었고 이후 승부가 진행된다. dealer와 player의 카드 합이 똑같이 18이 되어 Draw처리되었고 무승부여서 money 값이 바뀌지 않은 것을 확인할 수 있다. 

반응형
Comments