1

だから私はもう一度初心者の問題で立ち往生しています:D

私はコンピューターに対して囲碁のテキストベースのゲームを一緒にマッシュアップしようとしています。

さて、1枚のカードは実際には2つのリストの要素のタプルです。

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts']
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'jack', 'queen', 'king']

その後、それはデッキに追加され、シャッフルされ、それ以外のものが手札に配られます。(私が思う本thinkpythonからそのほとんどを手に入れました。その過程でクラス構造と継承について多くを学びました。)

片手はこんな感じかもしれません

['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']

ご覧のとおり、その手には同じランクの4つが含まれているため、プレーヤーにとっては1ポイントです。しかし、手にランクリストのアイテムの4つのインスタンスが含まれているかどうかを確認するにはどうすればよいですか?リスト内の各項目を反復処理する必要がありますか、それともクリーンで簡単な方法がありますか?


編集
すべての答えの人に感謝します。:Dしかし、手のアイテムに「split」を使用しようとすると、属性エラーが発生します。私が実行しているコードをもっと投稿するべきだったと思います。

完全なコードとトレースバックはこちら
http://pastebin.com/TwHkrbED

カードでのメソッドの定義に何か問題がありますか?私はそれを機能させるために何時間もハッキングしてきましたが、運がありません。

EDIT2
デッキ生成部分にいくつかの変更を加えました。これで、デッキ全体がタプルのリストになり、コードが大幅に減りました。

thedeck=[]
class Deckofcards:
    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
    ranks = ['Ace', '2', '3', '4', '5', 
        '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King']
    def __init__(self):
        for i in self.suits:
            for a in self.ranks:
                thedeck.append((i, a))

他の方法は非常に複雑だったようですが、idkです。実際のゲームパーツを追加して、明日はどうなるか見ていきます。

4

5 に答える 5

4

少しリファクタリングすることをお勧めします。手札の各カードをのタプルとして表し(rank, suit)ます。したがって、例のハンドは次のようになります。

hand = [('2', 'Clubs'),
        ('king', 'Diamonds'),
        ('2', 'Diamonds'),
        ('2', 'Spades'),
        ('2', 'Hearts')]

次に、手の価値を判断するのに役立ついくつかの補助関数を提案します。

from collections import defaultdict

def get_counts(hand):
    """Returns a dict mapping card ranks to counts in the given hand."""
    counts = defaultdict(int)
    for rank, suit in hand:
        counts[rank] += 1
    return counts

def get_points(hand):
    """Returns the number of points (ie, ranks with all 4 cards) in the given
    hand."""
    return sum(1 for count in get_counts(hand).itervalues() if count == 4)

編集:関数でsumの使用に切り替えました。これは私にはわかりやすいようです。get_points

これらの関数とあなたが与えたサンプルハンドを操作すると、次のような出力が得られます。

>>> get_counts(hand)
defaultdict(<type 'int'>, {'king': 1, '2': 4})

>>> get_points(hand)
1
于 2010-12-21T22:17:39.177 に答える
1

これが1つの方法です:

x = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']
ranks = [i.split()[1] for i in x]
fourofakind = any(ranks.count(i)==4 for i in set(ranks))

fourofakindその場合、手札に同じランクのカードが4枚ある場合、はTrueになります。

于 2010-12-21T22:02:47.167 に答える
0

CounterPython 2.7で標準ライブラリモジュールに追加された新しい組み込みクラスcollectionsにより、これはかなり簡単になります。

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts']
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7',
         '8', '9', '10', 'jack', 'queen', 'king']
hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']

from collections import Counter

counts = Counter(card.split()[1] for card in hand)
four_of_a_kind = [rank for rank,count in counts.iteritems() if count == 4]
print 'four_of_a_kind:', four_of_a_kind
# four_of_a_kind: ['2']
于 2010-12-21T23:12:13.557 に答える
0

拡張された種類の機能を探している場合:

hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts 2']
hand_ranks = [i.split()[1] for i in x]
fourofakind = {}
for i in set(hand_ranks):
    fourofakind[i] = (hand_ranks.count(i) == 4)

(手札のカードの)カードランクを、そのランクが4つあるかどうかにマッピングするdict()を提供します。

于 2010-12-21T22:17:09.460 に答える
0

ジャスティンよりも少し一般的です:

suits = ['Clubs', 'Diamonds', 'Spade', 'Hearts']
ranks = [None, 'ace', '2', '3', '4', '5', '6', '7', \
'8', '9', '10', 'jack', 'queen', 'king']

hand = ['Clubs 2', 'Diamonds king', 'Diamonds 2', 'Spades 2', 'Hearts king']
rankshand = [i.split()[1] for i in hand]

fourofakind = [hr for hr in ranks if rankshand.count(hr)==4]
threeofakind = [hr for hr in ranks if rankshand.count(hr)==3]
pair = [hr for hr in ranks if rankshand.count(hr)==2]

fourofakind
[]
threeofakind
['2']
pair
['king']

どのランクが設定されているかを確認する機能を備えています。

于 2010-12-21T22:22:03.183 に答える