간단한 포커 게임 만들기 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