The code below isn't stellar, but has some pedagogical value nevertheless. In general, I'm looking at constituting a deck of 52 cards, or 54 with two jokers, this time with each card an object.
In a C struct, you could imagine the suit (e.g. Diamond), rank (e.g. Jack) and value (e.g. 11) all having their own slots, which is pretty much what we're doing here. A Deck object is a list of cards, not a dictionary, as sequence matters. Shuffling is automatic upon deck creation, which somewhat deviates from brick and mortar cards, but oh well. Other features: use of break keyword to escape from a loop in a loop, difference twixt __str__ and __repr__ ribs. I'd call this intermediate Python in that we're assuming fluency with modules like random and native functions like zip, also show off a privacy feature (using _ and/or __ as a method prefix). Use of decorators might be a next topic, starting with @property. As I've been discussing off list, I'm vested in going with cards, dice, games of chance often associated with gambling. I am well aware that a home schooling minority don't want their kids exposed to a shady underworld associated with Prohibition and Chicago gangsters. I suggest Ruby might be better for those households. When I mailed PSF snake back to Virginia yesterday, the UPS clerk shuddered in horror, didn't want to look in the satchel even when I told her what was in it, a quite harmless stuffed totem (she was in Portland for DjangoCon, to meet Django Pony). The baby Adonis (by now a lanky lad given how snake years fly by) is staying behind in Portland to learn more from our team. He's currently studying the J language, having semi-mastered his native tongue. http://www.flickr.com/photos/17157...@n00/3951018867/in/photostream (One Laptop per Snake -- OLPS). Kirby ================== from random import shuffle thesuits = ['Hearts','Diamonds','Clubs','Spades'] theranks = ['Ace'] + [str(v) for v in range(2,11)] + ['Jack','Queen','King'] thevalues = zip(theranks, range(1,14)) class Card: def __init__(self, suit, (rank, value)): self.suit = suit self.rank = rank self.value = value def __repr__(self): return "Card(%s, %s)" % (self.suit, (self.rank, self.value)) def __str__(self): return "%s of %s" % (self.rank, self.suit) class Deck: def __init__(self, numcards = 52): self.numcards = numcards self.cards = [] self._populate() shuffle(self.cards) def _populate(self): have = 0 self.cards = [] for suit in thesuits: for value in thevalues: self.cards.append( Card(suit, value)) have += 1 if have == self.numcards: break if have == self.numcards: break def __repr__(self): return "Deck(%s)" % self.numcards def __str__(self): return str([str(card) for card in self.cards]) def test(): thedeck = Deck() print str(thedeck) if __name__ == '__main__': test() _______________________________________________ Edu-sig mailing list [email protected] http://mail.python.org/mailman/listinfo/edu-sig
