4

我正在上python的第一门课程,由于我的教科书很浅,我试图通过亲身体验来熟悉课程。

我想编写一个程序来处理一些德州德州扑克手牌(一手牌开始),然后在桌子上处理五张牌,然后再查看所有可能的手牌排列与 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..

我要问的是:为此目的使用类的正确方法是什么?我是否应该创建另一个类来保存发到扑克桌上的五张牌,再创建一个类来保存不同的排列?

还是两手牌、手牌的分数、牌桌的发牌以及牌桌牌的不同排列都属于同一类?

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

4

3 回答 3

3

首先,没有“正确”的方法来解决这个问题。这完全取决于个人喜好和设计考虑。

就个人而言,我会这样做的方式是创建 3 个数据类:

Deck发牌,并跟踪哪些牌已经发过

我会给这个类一个通用draw方法,它从可用卡片中返回一张随机卡片

Player跟踪玩家的每张牌,可以通过调用Deck.draw()两次来确定

Table跟踪桌上的牌

然后,我会将这一切都包装在一个Game处理所有游戏逻辑的类中,比如确保桌子上的牌是在正确的时间绘制的

于 2012-09-12T17:42:06.693 回答
2

您不需要为了使用类而使用类(除非您使用的是 Java)

我处理类的方式是,我首先考虑我需要什么“对象”或“事物”,然后定义将定义该事物的属性和方法。如果我要创建同一事物的多个实例,那么一个类很有用。如果我只需要 1 个实例,那么一个模块或全局变量很可能就足够了。

例如,在您的示例中,您实际上并不需要类。但是,如果您想要为您的游戏支持多个套牌,那么您可能需要定义一个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())

等等等等。

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

于 2012-09-12T17:42:36.677 回答
2

如果你想使用类,一个常用的经验法则是让类成为执行动作的事物或完成动作的事物。

例如,一手牌不会自己发牌,而你不会用那手牌发牌;一手牌处理一副牌。因此,您可以创建一个Deck类,该类具有一个.deal_hand()返回Hand.

该类Hand将有一个.score()方法,任何与您实际用手操作相关的任何其他内容。


也就是说,您不需要为此使用类。如果你愿意,那很好——但是甲板和手牌都可以很容易地用 . 来表示set

于 2012-09-12T17:19:26.280 回答