0

私は楽しみのために基本的なカードゲームを書こうとしていますが、それを可能な限り将来のカードゲームに適用できるようにしようとしています。これが私のコードです。

decks = [  ]
players = [  ]

class Player:
global players
def __init__( self, name ):
    self.hand = [  ]
    self.name = ''
    self.score = 0
    self.name = 'playerX'
    self.score = 0
    players.append( name )


class Deck:
    global decks
    global players

def __init__( self, name ):
    self.SUITS = [ 'C', 'D', 'H', 'S' ]
    self.RANKS = [ '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A' ]
    self.deck = [  ]
    for r in self.RANKS:
        for s in self.SUITS:
            self.deck.append( ( r, s ) )
    decks.append( name )

def shuffle( self ):
    shuffle( self.deck )

def display( self ):
    for e in range(0, len( self.deck ), 4):
        for i in self.deck[e:e+4]:
            print i,
        print

def dealXtoOne( number, deck, player ):
    ''' number of cards from a deck to named player'''
    if len( deck.deck ) >= number:
        for n in range( 0, number ):
            player.hand.append( deck.deck.pop(  ) )
            print 'Player1 hand: ', p1.hand
    else:
        return 'Insufficient cards in the deck.'

def dealXtoEach( number, deck ):
    ''' number of cards from a deck to each player'''
    global players
    print 'debug 0'
    if len( deck.deck ) >= number*len( players ):
        print 'debug 1'
        for cards in range( 0, number*len( players ) ):
            print 'debug 2'
            for player in players:
                print 'debug 3'
                print player
                print player.hand
                player.hand.append( deck.deck.pop(  ) )
                print player.hand
    else:
        return 'Insufficient cards in the deck.'



def value( card ):
    if card[ 0 ] == 'J': return 11
        elif card[ 0 ] == 'Q': return 12
        elif card[ 0 ] == 'K': return 13
        elif card[ 0 ] == 'A': return 14
        else: return card[ 0 ]

def topCard( deck ):
    return deck.deck[ -1 ]

def color( card ):
    if card[ 1 ] in [ 'Diamonds', 'Hearts' ]:
        return 'Red'
    else:
        return 'Black'


p1 = Player( 'p1' )
p2 = Player( 'p2' )
d = Deck( 'd' )

d.display(  )
print p1.hand
dealXtoOne( 3, d, p1 )
d.display(  )
print p1.hand
dealXtoEach( 3, d )
d.display(  )

それはゴミだと確信しており、明らかに進行中の作業ですが、私は自分自身にプログラミングを教えています。目が出血したらごめんなさい!

したがって、1人のプレーヤーにXカードを配ることは問題なく機能しますが、それぞれN人のプレーヤーにXカードを配ることは機能しません。これが私の出力です:

('2', 'C') ('2', 'D') ('2', 'H') ('2', 'S')
('3', 'C') ('3', 'D') ('3', 'H') ('3', 'S')
...
('K', 'C') ('K', 'D') ('K', 'H') ('K', 'S')
('A', 'C') ('A', 'D') ('A', 'H') ('A', 'S')
[]
Player1 hand:  [('A', 'S')]
Player1 hand:  [('A', 'S'), ('A', 'H')]
Player1 hand:  [('A', 'S'), ('A', 'H'), ('A', 'D')]
('2', 'C') ('2', 'D') ('2', 'H') ('2', 'S')
...
('K', 'C') ('K', 'D') ('K', 'H') ('K', 'S')
('A', 'C')
[('A', 'S'), ('A', 'H'), ('A', 'D')]
debug 0
debug 1
debug 2
debug 3
p1

Traceback (most recent call last):
    File "C:\Users\11583\Desktop\Personal\cardgame.py", line 94, in <module>
        dealXtoEach( 3, d )
    File "C:\Users\11583\Desktop\Personal\cardgame.py", line 60, in dealXtoEach
        print player.hand
AttributeError: 'str' object has no attribute 'hand'

プレーヤーのグローバル変数の文字列で表されるPlayerのインスタンスのdealXtoEach関数内の参照にタプルを追加しようとしているのは気に入らないことがわかります。シーシュ、私はそれを説明するだけで混乱しています。

では、どうすればこれを回避できますか?

ありがとう

4

2 に答える 2

2

このエラーは、タプルへの追加とは関係ありません(ちなみに、playersリストはタプルではなく、タプルに追加することはできません)。

代わりに、次の行を置き換えてみてください。

players.append( name )

players.append( self )

このように、グローバルplayersリストには文字列のリスト(あまり使用できません)は含まれず、Playerオブジェクトのリスト(特にhand属性を持つ)が含まれます。


追記:グローバルplayersリストは実際には必要ありません(通常、グローバル変数は推奨されません)。リストを渡すだけで済みplayersます。第二に、dealXToOneそして実際にはクラスdealOneToEachのメソッドでなければなりません。Deck一緒にすると、最後の数行は次のようになります。

players = [p1, p2]
d.dealXToOne(3, p1)
d.dealXToEach(e, players)
于 2013-01-11T17:37:31.013 に答える
1

次の行があるため、リストplayer内のそれぞれはオブジェクトではなく文字列です。playersPlayer

players.append( name )

と置換する:

players.append( self )
于 2013-01-11T17:42:20.530 に答える