0

少し前に Javascript で簡単なポーカー ゲームを作成し、Python でゼロから始めようと考えました。これまでのコードは次のとおりです (問題の最後までスキップできます)。

#imports
import random
#basics
values = range(2,15)
suits = ['Clubs','Spades','Diamonds','Hearts']
#card object
class Card:
    def __init__(self,suit,value,name):
        self.suit = suit
        self.value = value
        self.name = name
        if self.value < 11:
            self.name = str(self.value) + ' of'
        if self.value == 11:
            self.name = 'Jack of'
        if self.value == 12:
            self.name = 'Queen of'
        if self.value == 13:
            self.name = 'King of'
        if self.value == 14:
            self.name = 'Ace of'
#deck
deck = []
#load and shuffle deck
for s in suits:
    for v in values:
        deck.append(Card(s,v,'o'))
random.shuffle(deck)
#load hands
your_hand = random.sample(deck,7)
for card in your_hand:
    deck.remove(card)
#determine hands
def find_matches(hand):
    class Match:
        def __init__(self,value,amount):
            self.value = value
            self.amount = amount
    matches = [Match(card.value,hand.count(card.value)) for card in hand]
    for x in matches:
        print x.value,x.amount
find_matches(your_hand)

はい、完璧ではないことは承知しています (提案は常に歓迎されます!)。私の問題は、信頼できる一致検索機能を作成することです。いくつかの異なるアプローチを試しましたが、これhand.count(card.value)では各要素が 0 になります。count メソッドが受け入れるパラメーターに問題がありますか? それとも私のコードの側面ですか?

ご協力いただきありがとうございます!

4

3 に答える 3

2

あなたの質問はうまく答えられたので、ここにいくつかの他のコメントがあります:

ifまず、 s の蛇行チェーンはCard.__init__()、辞書検索に置き換えたほうがよいでしょう。同様に:

value2name = dict((val, str(val)) for val in values)
for val, name in (11, 'Jack'), (12, "Queen"), (13, "King"), (14, "Ace"):
    value2name[val] = name

を設定した後、すべてのクラフトを次valuesのように置き換えます。__init__()

        self.name = value2name[value] + " of " + suit

次に、some_card.name次のように表示されます(例):

King of Spades
5 of Spades
Ace of Hearts
[etc]

第 2 に、 を使用する場合、 -使用random.shuffle()しても意味がありません。逆もまた同様です。1つだけ使用してください。後で他の手を剥がしたくなる可能性が高いので、良いです。デッキをシャッフルした後、次のようにランダムに 7 枚のカードを非常に効率的にデッキから取り除くことができます。random.sample()shuffle()

your_hand = deck[-7:]
del deck[-7:]

リストの末尾からスライスを削除することは、CPython では非常に効率的です。実際には、実装はリストのサイズが削除された要素の数だけ小さくなったことを記録するだけで、何も再配置する必要はありません。

さらに 7 枚のカードを取得するには、同じことを行います。または関数に入れます:

def deal(deck, n):
    if n <= 0:
        raise ValueError("n must be > 0")
    if n > len(deck):
        raise ValueError("asked for more cards than remain")
    result = deck[-n:]
    del deck[-n:]
    return result

その後:

your_hand = deal(deck, 7)

後で。

楽しむ!:-)

于 2013-09-22T18:32:43.597 に答える
2

問題hand.count(card.value)は、ハンド内のオブジェクトの数Cardがそのうちの 1 つの整数値に等しいことです。これは、2 つの異なるオブジェクトを比較するため、常にゼロになります。簡単な修正は、すべての整数カード値を別のリストに抽出し、count()代わりにそのメソッドを使用することです。

def find_matches(hand):
    class Match:
        def __init__(self, value, amount):
            self.value = value
            self.amount = amount
    values = [card.value for card in hand]  # list of extracted card values
    matches = [Match(card.value, values.count(card.value)) for card in hand]
    for x in matches:
        print x.value, x.amount

この変更により、次のようになります。

10 1
4 1
9 1
3 1
12 2
12 2
6 1

同様のことを行うためのより Pythonic な方法はcollections.Counter、ジェネレータ式でクラスを使用することです。

from collections import Counter

counter = Counter(card.value for card in your_hand)
print '{} unique values: {}'.format(len(counter), counter)

同じハンドの場合、次のものが得られます。

6 unique values: Counter({12: 2, 3: 1, 4: 1, 6: 1, 9: 1, 10: 1})

これは、手を評価するときに使いやすいと思います (辞書のサブクラスです)。

于 2013-09-22T15:35:18.583 に答える
2

hand.count(card.value)card.valueデッキに何回登場するかチェックします。値は数字でありCard、デックには s のみで数字が含まれていないため、0 です。

どこsum(card.value == 5 for card in hand)でカードの数を取得するために行うことができます。これが機能するのは、 がと にそれぞれ数値的に等しいブール値またはを持っているためです。handcard.value == 5a == bTrueFalse10

したがって、ハンドを反復処理し ( for card in hand)、比較を行い ( card.value == 5)、s の数を合計しますTrueが、インラインで実行するため、リストがメモリに格納されます。

于 2013-09-22T15:06:15.903 に答える