我正在读python的第一门课程,因为我的教科书很浅,所以我试图通过亲身体验熟悉课程。
我想编写一个程序来处理一些德州扑克手牌(单手开始),然后在看到所有可能的手牌排列与5张桌牌之前将5张牌交给桌子和2手牌。 (可以将一手牌的两张牌与桌子的五张牌中的三张牌组合在一起)。最终我想扩展它来比较和评估手,并提名一个胜利者。但那将是以后的事情。
我很想知道的是用类来构造这个问题的好方法。
制作一个拥有交易功能并包含不同牌局的Hand类是否明智,并让deck成为全局变量?
#The hand-class is a class for the dealt poker-hands.
import random
deck = [i for i in range (102, 115)]
deck += [i for i in range(202, 215)]
deck += [i for i in range(302, 315)]
deck += [i for i in range(402, 415)]
# I define a card by a prefix number - the suit - and the card value. Jack of spades = 111 if spades corresponds to 1.
class Hand:
def __init__(self):
return None
def deal_hand(self):
self.hand = []
for i in range (0,2):
card = random.choice(deck)
self.hand.append(card)
deck.remove(card)
#def score():
#a function to determine the sore of the hand..
我要问的是:为此目的使用类的正确方法是什么?我是否应该让另一个班级将五张牌发给扑克桌,还有另一个班级来保持不同的排列?
或者手,手的分数,桌子的牌以及手牌的不同排列都属于同一类?
我不是要求任何人给我写任何代码,但如果你有时间给我一个快速暗示我应该在哪个方向看,我会非常感谢! 谢谢! 马吕斯
答案 0 :(得分:3)
首先,没有“正确”的方法来解决这个问题。这完全取决于个人偏好和设计考虑因素。
就个人而言,我要做的就是创建3个数据类:
Deck
处理卡片,并跟踪已经处理过的卡片
我会给这个类一个通用的draw
方法,它从可用的卡中返回一张随机卡
Player
跟踪每个玩家的牌,可以通过两次调用Deck.draw()
来确定
Table
跟踪桌面上的卡片
然后,我会将这一切包装在一个处理所有游戏逻辑的Game
类中,例如确保桌面上的牌是在正确的时间绘制的
答案 1 :(得分:2)
如果你想使用课程,经常使用的经验法则是让课程成为行动的事物或完成行动。
例如,一只手不倾向于处理自己,而你不用那手牌;一只手被甲板处理。因此,您可以创建一个Deck
类,其中.deal_hand()
方法将返回Hand
。
Hand
类会有一个.score()
方法,任何其他任何与你实际用一手做的事情相关的事情。
那就是说,你不需要为此使用类。如果你愿意的话,这很好 - 但甲板和指针都很容易用set
表示。
答案 2 :(得分:2)
您不需要为了使用类而使用类(除非您使用的是Java)
我接近类的方式是,我首先考虑我将需要的“对象”或“事物”,然后定义将定义该事物的属性和方法。如果我要创建同一个东西的多个实例,那么一个类很有用。如果我只需要一个实例,那么模块或全局变量很可能就足够了。
例如,在您的示例中,您并不真正需要类。但是,如果您想要为游戏支持多个套牌,那么您可能需要定义一个 Deck 类,它可以包含和控制有关其自身卡片的所有信息。
考虑一下扑克本身 - 它是如何运作的?
您有经销商,有玩家,经销商有一副或多副牌。经销商随后洗牌,然后将牌发给玩家和桌子。您希望如何将这些流程定义为对象?
我会看一下真实世界的例子并将其分解为可重复使用的部分,这就成了你的课程。例如,我可能会看一下并说:
class Deck(object):
""" class for managing a deck of cards """
class Player(object):
""" defines properties and methods that an individual player would have """
def __init__( self ):
self._cards = [] # hold a player current cards
self._chips = 10 # define how much money a player has
def clearCards( self ):
self._cards = []
def dealCard( self, card ):
self._cards.append(card)
class Dealer(object):
""" defines properties and methods that a dealer would have """
def __init__( self ):
self._decks = [] # hold multiple decks for playing with
self._stack = [] # holds all the shuffled cards as a
def nextCard( self ):
""" pop a card off the stack and return it """
return self._stack.pop()
def shuffle( self ):
for deck in self._decks:
deck.shuffle() # shuffle each individual deck
# re-populate a shuffled stack of cards
self._stack = []
# randomly go through each deck and put each card into the stack
def deal( self, *players ):
""" Create a new hand based on the current deck stack """
# determine if i need to shuffle
if ( len(self._stack) < self._minimumStackCount ):
self.shuffle()
return Hand(self, *players)
class Hand(object):
def __init__( self, dealer, *players ):
self._dealer = dealer # points back to the dealer
self._players = players # defines all the players in the hand
self._table = [] # defines the cards on the table
self._round = 1
for player in players:
player.clearCards()
self.deal()
def deal( self ):
# in holdem, each round you get a different card combination per round
round = self._round
self._round += 1
# deal each player 2 cards in round 1
if ( round == 1 ):
for i in range(2):
for player in players:
player.dealCard( self._dealer.nextCard() )
# deal the table 3 cards in round 2 (flop)
elif ( round == 2 ):
self._table = [self._dealer.nextCard() for i in range(3)]
# deal the table 1 card in round 2 (turn)
elif ( round == 3 ):
self._table.append(self._dealer.nextCard())
# deal the table 1 card in round 3 (river)
else:
self._table.append(self._dealer.nextCard())
等等。
所有代码通常都是伪代码,用于说明如何在心理上可视化分解方法。真正最简单的方法是考虑现实生活中的场景,并用简单的英语写下它是如何工作的,然后课程就会开始自我想象。