4

私は Python の最初のコースを受講しています。私の教科書は非常に浅いので、実際の経験によってクラスに慣れようとしています。

テキサス ホールデム ポーカー ハンド (最初は 1 ハンド) を多数処理し、5 枚のテーブル カードと 2 ハンドで考えられるすべてのハンド順列を調べる前に、テーブルに 5 枚のカードを配るプログラムを作成したいと考えています。カード。(自分の手札の 2 枚のカードとテーブルの 5 枚のカードのうちの 3 枚を組み合わせることができます)。最終的には、ハンドを比較して評価し、勝者を指名するように拡張したいと考えています。しかし、それは後で説明します。

私が知りたいのは、この問題をクラスで構造化する良い方法です。

ディール関数を保持し、ディールされたさまざまなハンドを含む 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..

私が求めているのは、この目的のためにクラスを使用する正しい方法は何ですか? ポーカー テーブルに配られた 5 枚のカードを保持する別のクラスと、さまざまな順列を保持する別のクラスを作成する必要がありますか?

それとも、ハンド、ハンドのスコア、テーブルで配られたカード、およびハンドのカードとテーブルのカードのさまざまな順列のすべてが同じクラスに属するべきですか?

私は誰にもコードを書くように頼んでいるわけではありませんが、私がどの方向に目を向けるべきかについて簡単なヒントを与える時間があれば、とても感謝しています! ありがとう!マリウス

4

3 に答える 3

3

まず、これについて「正しい」方法はありません。それはすべて個人的な好みとデザイン上の考慮事項です。

個人的には、私がこれを行う方法は、3 つのデータ クラスを作成することです。

Deckカードを配り、どのカードがすでに配られたかを追跡する

drawこのクラスに、使用可能なカードからランダムなカードを返すジェネリックメソッドを指定します。

Playerプレイヤーの各カードを追跡します。これは、Deck.draw()2 回呼び出すことで決定できます。

Tableテーブル上のカードを追跡する

次に、すべてのゲーム ロジックを処理するクラスでこれをすべてラップします。たとえばGame、テーブル上のカードが正しいタイミングで描かれるようにします。

于 2012-09-12T17:42:06.693 に答える
2

クラスを使用するためにクラスを使用する必要はありません (Java を使用している場合を除く)。

私がクラスにアプローチする方法は、まずどのような「オブジェクト」または「もの」が必要になるかを考え、次にそのものを定義するプロパティとメソッドを定義することです。同じものの複数のインスタンスを作成する場合は、クラスが役立ちます。インスタンスが 1 つしか必要ない場合は、モジュールまたはグローバル変数で十分でしょう。

たとえば、あなたの例では、クラスは本当に必要ありません。ただし、ゲームで複数のデッキをサポートしたい場合は、独自のカードに関するすべての情報を格納および制御できるDeckクラスを定義する必要があります。

ポーカー自体について考えてみてください。どのように機能するのでしょうか?

ディーラーがいて、プレイヤーがいて、ディーラーが 1 組以上のカードを持っています。ディーラーはシャッフルしてから、プレイヤーとテーブルにカードを配ります。これらの各プロセスをオブジェクトとしてどのように定義しますか?

実世界の例を見て、それを再利用可能な部分に分割すると、それがクラスになります。たとえば、私はおそらくそれを見て、次のように言うでしょう。

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 に答える