[파이썬 프로그래밍 22] 간단한 포커 게임 만들기 4: 포커 게임 업그레이드하기

Home / 파이썬 프로그래밍 / [파이썬 프로그래밍 22] 간단한 포커 게임 만들기 4: 포커 게임 업그레이드하기

간단한 포커 게임 만들기 4
포커 게임 업그레이드하기

이전 글까지 만든 포커게임은 따로 사람이 개입하는 것이 거의 없어서 게임이라고 하기에는 많이 모자라는 수준이었습니다. 이번 글에서는 조금이나마 게임같은 요소를 넣어볼겠습니다. 시나리오는 이렇습니다.

1. 게임 프로그램을 시작하자마자 기본 게임머니 \$2000을 받습니다.
2. 게임하는 사람이 게임머니중에 \$10을 베팅하면 컴퓨터(cards_A)와 사람(cards_B) 모두 카드를 2장씩 받습니다. (배팅 1)
3. 배팅을 더 안하면 사람은 배팅한 돈을 다 잃으면서 게임은 끝납니다. 배팅(\$10)을 하면 컴퓨터(cards_A)와 사람(cards_B) 모두 카드를 1장씩 더 받습니다. (배팅 2, 3, 4)
4. 카드 5장을 가질때까지 배팅을 했으면, 컴퓨터의 마지막 다섯번쨰의 카드는 안보여주고 마지막 배팅(\$10)을 할지 안할지를 결정합니다.
5. 마지막 배팅을 하면 가린 카드 한장 마저 공개하고 패를 비교합니다. 사람의 패가 이겼을때만 배팅한 돈의 2배(\$50 $\times$ 2= \$100)을 받아 \$50을 더 법니다. 하지만 비기거나 지면 배팅한 돈(\$50)을 다 잃습니다. (배팅 5)
5. 게임을 다시 반복합니다.

이전 코드를 수정해 보겠습니다.
먼저 게임머니를 가지고 배팅을 해야하므로, 게임머니 정보를 저장하는 변수를 만들고 프로그램을 시작할때 \$2000의 게임머니를
저장해야하겠습니다. 필요한 모듈을 불러오고 카드 패의 순위를 알아내는 함수인 CardRank함수를 코딩한 부분 다음에 저장하는 것이 좋을 듯 싶습니다. 카드 한 팩을 만드는 것까지 추가하겠습니다. 그러면 전체 코드의 맨 처음 부분은 다음과 같겠습니다.

# 필요한 모듈을 미리 다 불러온다.
import random

def CardRank(cards):
    paircount = 0
    for n1 in range(0, 4):
        for n2 in range(n1+1, 5):
            if cards[n1][1] == cards[n2][1] :
                paircount = paircount+1
    num = [cards[k][1] for k in range(5)]
    num.sort()
    straightox = False
    if paircount == 0:
        if (num[4]-num[0]) == 4:
            straightox = True
        if num[0] == 1 and num[1] == 10:
            straightox = True
    suit = [cards[k][0] for k in range(5)]
    suit.sort()
    flushox = False
    if suit[0] == suit[4]:
        flushox = True
    if straightox and flushox:
        rank = 1
    elif paircount == 6:
        rank = 2
    elif paircount == 4:
        rank = 3
    elif flushox:
        rank = 4
    elif straightox:
        rank = 5
    elif paircount == 3:
        rank = 6
    elif paircount == 2:
        rank = 7
    elif paircount == 1:
        rank = 8
    else:
        rank = 9
    return rank

# 게임머니 $2000을 저장한다.
Money = 2000

# 카드 한 팩을 만든다.
deck = [(suit, k) for  suit in ["s", "h", "d", "c"] for k in range(1,14)]

각 게임을 시작하기 전에 먼저 카드를 섞습니다.(shuffling)

최대 5번의 배팅이 있으므로. for n in [1,2,3,4,5]: 블록으로 배팅을 처리하면 되겠습니다. for의 목록안에 있는 숫자 1부터 5까지는 배팅 번호를 표시합니다. \$10 베팅을 한다는 얘기는 게임머니에서 \$10을 빼내어 베팅한다는 얘기입니다. 배팅때마다 Money에서 10을 뺴면 되겠습니다.

그리고 항상 배팅 바로전에 그 배팅을 할것인지 물어봅니다. 이는 input함수를 이용해 처리할 수 있습니다. 만약에 배팅을 더 하지 않는다는 결정을 내리면 break를 이용해서 for블록에서 빠져나옵니다. 그때까지 배팅한 돈은 다 잃고 그 게임을 끝냅니다.

배팅 1에서는 컴퓨터와 선수에게 카드를 두장씩 카드를 나눠주고 배팅 2와 3에서는 카드를 한장씩 나눠줍니다. 배팅 4에서는 컴퓨터에 준 마지막 카드는 보여주지 않아야 합니다. 이 경우에는 hiddencard라는 변수에 컴퓨터가 마지막으로 받은 카드를 저장해놓고 컴퓨터의 카드 패 cards_A에는 일단 추가 하지 않습니다. 그러면 cards_A를 화면에 출력해도 4장에 대한 정보만 출력됩니다.

마지막 다섯번째 배팅을 하면 hidden card를 cards_A에 추가하고 패의 순위를 비교합니다. 이때 선수가 이겼을때만 \$100을 받아 게임머니에 추가합니다.

이렇게 어떤 배팅이냐에 따라 하는 작업이 달라지는 것은 if … elif … else로 처리합니다.

이를 코드로 옯기면 다음과 같습니다.

# 카드를 섞는다.
random.shuffle(deck)
# 배팅 1,2,3,4,5
for n in [1,2,3,4,5]:
    answer = input("배팅하시겠습니까? (y/n)")
    if answer == 'n' or answer == 'N':
        break
    Money = Money-10
    if n == 1:
        cards_A = [ deck[0], deck[1]]  # 컴퓨터
        cards_B = [ deck[2], deck[3]]  # 선수
    elif n < 4:
        cards_A.append(deck[n*2])    # 4, 6, 8
        cards_B.append(deck[n*2+1])  # 5, 7, 9
    elif n == 4:
        hiddencard = deck[n*2]
        cards_B.append(deck[n*2+1])
    else:
        cards_A.append(hiddencard)
        rank_A = CardRank(cards_A)
        rank_B = CardRank(cards_B)
        if rank_B < rank_A:
            Money = Money+100
            print('당신이 이겼습니다.')
        elif rank_B == rank_A:
            print('비겼습니다')
        else:
            print('컴퓨터가 이겼습니다.')
    print("Money = ", Money)
    print("computer: ", cards_A)
    print("player  : ", cards_B)

게임이 잘 돌아가는지 확인했으면, 게임을 반복하는 것을 코드로 만들어야합니다. 이건 처음 배팅해서 처음 나눠주는 부분부터 베팅이 끝나는 지점까지 블록으로 묶어 while True:로 계속 반복하면 되겠습니다. while 블록 끝에는 input함수를 이용해서 게임을 더 할지를 물어봅니다. 게임을 더 하지 않기로 결정하면 break로 while 블록에서 빠져나오고 프로그램은 끝납니다.

이를 모두 완결한 전체 코드는 아래와 같이 됩니다.

# 필요한 모듈을 미리 다 불러온다.
import random

# 카드 순위 따지는 코드 
def CardRank(cards):
    paircount = 0
    for n1 in range(0, 4):
        for n2 in range(n1+1, 5):
            if cards[n1][1] == cards[n2][1] :
                paircount = paircount+1
    num = [cards[k][1] for k in range(5)]
    num.sort()
    straightox = False
    if paircount == 0:
        if (num[4]-num[0]) == 4:
            straightox = True
        if num[0] == 1 and num[1] == 10:
            straightox = True
    suit = [cards[k][0] for k in range(5)]
    suit.sort()
    flushox = False
    if suit[0] == suit[4]:
        flushox = True
    if straightox and flushox:
        rank = 1
    elif paircount == 6:
        rank = 2
    elif paircount == 4:
        rank = 3
    elif flushox:
        rank = 4
    elif straightox:
        rank = 5
    elif paircount == 3:
        rank = 6
    elif paircount == 2:
        rank = 7
    elif paircount == 1:
        rank = 8
    else:
        rank = 9
    return rank

# 게임머니 $2000을 저장한다.
Money = 2000
# 카드 한 팩을 만든다.
deck = [(suit, k) for  suit in ["s", "h", "d", "c"] for k in range(1,14)]
# 게임을 반복한다
while True:
    # 카드를 섞는다.
    random.shuffle(deck)
    # 배팅 1,2,3,4,5
    for n in [1,2,3,4,5]:
        answer = input("배팅하시겠습니까? (y/n)")
        if answer == 'n' or answer == 'N':
            break #
        Money = Money-10
        if n == 1:
            cards_A = [ deck[k] for k in range(0, 2)]  # 컴퓨터
            cards_B = [ deck[k] for k in range(2, 4)]  # 선수
        elif n < 4:
            cards_A.append(deck[n*2])
            cards_B.append(deck[n*2+1])
        elif n == 4:
            hiddencard = deck[n*2]
            cards_B.append(deck[n*2+1])
        else:
            cards_A.append(hiddencard)
            rank_A = CardRank(cards_A)
            rank_B = CardRank(cards_B)
            if rank_B < rank_A:
                Money = Money+100
                print('당신이 이겼습니다.')
            elif rank_B == rank_A:
                print('비겼습니다')
            else:
                print('컴퓨터가 이겼습니다.')
        print("Money = ", Money)
        print("computer: ", cards_A)
        print("player  : ", cards_B)
    
    answer = input("게임을 더 하시겠습니까? (y/n)")
    if answer == 'n' or answer == 'N':
        break

90줄도 안되는 코드로 간단한 포커게임이 완성되었습니다. 빈줄과 코멘트를 빼면 80줄도 안됩니다.

이와같은 기본 포커게임을 응용하면 좀 더 발전된 포커게임도 만들 수 있습니다. 아래링크는 파이썬으로 프로그래밍한 게임은 아니지만, 제가 html과 css, 그리고 javascript를 이용해서 만든 2차원 포커게임입니다. 포커 게임 응용 버전이 되겠습니다.

http://goodbyemb.com/games/2dpoker/index.html