SW/Python

파이썬 : 포커 카드 게임 구현 개발

얇은생각 2019. 6. 23. 07:30
반응형

카드 포커 게임 

(가) (10점) 다음 python code를 실행하고, 각 function에 대해 자세히 설명하시오.

(나) (15점) 포커 랭킹 (Royal Flush, Straight Flush, Four of a Kind, Full House, Flush, Straight, Three of a Kind, Two Pair, One Pair, High Card)을 참조해서 주어진 5장의 카드가 어떤 랭킹인지 구분하는 함수 ‘ranking()’ 코드를 추가하시오. (단, 모든 랭킹을 구분할 필요는 없 고, 위에 주어진 랭킹 중, 최소 3개에 대해서 구현해도 됨.)


import random

# ranking을 알려주고 리턴함
def ranking(Player):
if isFlush(Player.hand) is not None:
return isFlush(Player.hand)
elif isStraight(Player.hand) is not None:
return isStraight(Player.hand)
elif isFourCard(Player.hand) is not None:
return isFourCard(Player.hand)
else:
return None

# 로얄플러쉬인지 알려주는 함수
def isFlush (hand):
# 종류가 같으면
if (hand[0].suit == hand[1].suit and
hand[1].suit == hand[2].suit and
hand[2].suit == hand[3].suit and
hand[3].suit == hand[4].suit):

valList = []
for card in hand:
valList.append(card.value)
valList.sort()

# 10, J, Q, K, A가 있는지
if (valList[0] == 1 and
valList[1] == 10 and
valList[2] == 11 and
valList[3] == 12 and
valList[4] == 13):
return "Royal Flush"
return None

# 스트레이트 플러쉬인지
def isStraight(hand):
# 종류가 같으면
if (hand[0].suit == hand[1].suit and
hand[1].suit == hand[2].suit and
hand[2].suit == hand[3].suit and
hand[3].suit == hand[4].suit):

valList = []
for card in hand:
valList.append(card.value)
valList.sort()

# 연속되는 숫자가 있는지
if (valList[0] + 1 == valList[1] and
valList[1] + 1 == valList[2] and
valList[2] + 1 == valList[3] and
valList[3] + 1 == valList[4] ):
return "Straight Flush"

return None

# 포카드인지
def isFourCard(hand):

valList = []
for card in hand:
valList.append(card.value)
valList.sort()

# 같은 숫자가 4개인 경우
for i in range(1, 14):
if valList.count(i) == 4:
return "Four of a Kind"
return None


class Card(object):
# card 클래스 생성자, 멤버 변수 초기화
def __init__(self, suit, val):
self.suit = suit
self.value = val

# show() 함수 출력
def __unicode__(self):
return self.show()

# show() 함수 출력
def __str__(self):
return self.show()

# show() 함수 출력
def __repr__(self):
return self.show()

# show() 함수 출력
def show(self):
if self.value == 1:
val = "Ace"
elif self.value == 11:
val = "Jack"
elif self.value == 12:
val = "Queen"
elif self.value == 13:
val = "King"
else:
val = self.value
return "{} of {}".format(val, self.suit)


class Deck(object):
# 덱 생성자 함수 호출
def __init__(self):
self.cards = []
self.build()

# 내부 카드 정보 출력
def show(self):
for card in self.cards:
print(card.show())

# 전체 카드 삽입
def build(self):
self.cards = []
for suit in ['Hearts', 'Clubs', 'Diamonds', 'Spades']:
for val in range(1, 14):
self.cards.append(Card(suit, val))

# 전체 카드 섞기
def shuffle(self, num=1):
length = len(self.cards)
for _ in range(num):
random.shuffle(self.cards)

# card 한개를 뽑아 반환해주는 함수
def deal(self):
return self.cards.pop()

class Player(object):
# player 생성자 함수 호출
def __init__(self, name):
self.name = name
self.hand = []

# 플레이어 이름 출력
def sayHello(self):
print("Hi! My name is {}".format(self.name))
return self

# 카드를 하나 뽑아, 사용자에게 추가해주는 함수
def draw(self, deck, num=1):
for _ in range(num):
card = deck.deal()
if card:
self.hand.append(card)
else:
return False
return True

# 플레이어의 카드 정보 출력
def showHand(self):
print("{}'s hand: {}".format(self.name, self.hand))
return self

# 받은 카드 하나를 버림
def discard(self):
return self.hand.pop()

# 랭킹에 포함되는 카드가 있으면 랭킹 정보와 카드 정보를 출력하고 멈춤
while True:
myDeck = Deck()
myDeck.shuffle()

bob = Player("Bob")
bob.draw(myDeck, 5)

if ranking(bob) is not None:
bob.sayHello
print("my ranking is " + ranking(bob))
bob.showHand()
break



시험 문제로 위와 같은 문제를 받았습니다. 기존 코드 위쪽에 ranking() 함수를 추가하였고, 필요한 부분들을 추가하여 구현하였습니다. 좀 더 구체적으로 함수에 주석을 달 수 있었고, 좀 더 깔끔하게 함수를 구현할 수 있지만, 그런 부분들은 다 챙기지는 못하였습니다. 이번 시험을 준비하면서 파이썬으로 머신러닝과 또는 SW 개발을 하는 경우, 필요한 스킬이 좀 다르다는 것도 느끼게 되었습니다.

반응형