0

I am trying to write a basic card game for fun, but trying to make as much of it as possible applicable to future card games.Here is my code.

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(  )

I'm sure it's garbage, and it's clearly a work in progress, but I am teaching myself to program. Sorry if your eyes bleed!

So dealing X cards to one player works fine, but dealing X cards to N players each is not working. Here is my output:

('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'

I can tell that it doesn't like that I am trying to append a tuple to the reference inside the dealXtoEach function of the instance of Player represented by the string in the players global variable. Sheesh, I am confused just explaining it.

So how can I get around this?

Thanks

2 Answers 2

2

That error has nothing to do with appending to a tuple (and by the way, players is a list not a tuple- it's impossible to append to a tuple).

Instead, try replacing the line:

players.append( name )

with

players.append( self )

This way, the global players list won't contain a list of strings (which you can't use for much), it will contain a list of Player objects (which have, among other things, a hand attribute).


An extra note: a global players list isn't really necessary (and global variables are usually recommended against)- you could just pass around the players list. Secondly, dealXToOne and dealOneToEach should really be methods of the Deck class. Together, that would make the last few lines look something like:

players = [p1, p2]
d.dealXToOne(3, p1)
d.dealXToEach(e, players)
Sign up to request clarification or add additional context in comments.

3 Comments

What do you mean by "pass around the players list"? I know global vars are frowned upon.
@user1515663: see my code example of dealXToEach(e, players)- make players an argument to the function
Thank you, I didn't understand what you were doing. It works pretty much as I wanted now.
1

Each player in your players list is a string, not a Player object, because of this line:

players.append( name )

replace with:

players.append( self )

1 Comment

David beat me to it, and I'll re-iterate his sentiment that you should try to eliminate all the global players lists

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.