在处理扑克牌时如何在python中使用类?

时间:2012-09-12 17:16:02

标签: python

我正在读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..

我要问的是:为此目的使用类的正确方法是什么?我是否应该让另一个班级将五张牌发给扑克桌,还有另一个班级来保持不同的排列?

或者手,手的分数,桌子的牌以及手牌的不同排列都属于同一类?

我不是要求任何人给我写任何代码,但如果你有时间给我一个快速暗示我应该在哪个方向看,我会非常感谢! 谢谢! 马吕斯

3 个答案:

答案 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())

等等。

所有代码通常都是伪代码,用于说明如何在心理上可视化分解方法。真正最简单的方法是考虑现实生活中的场景,并用简单的英语写下它是如何工作的,然后课程就会开始自我想象。