# War # Adapted from Blackjack to allow only one card to be # played per person. The highest card then wins. import games, cards # Determine value of card class War_Card(cards.Card): """ A Blackjack Card. """ RANKS = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"] def get_value(self): value = War_Card.RANKS.index(self.rank) + 2 return value value = property(get_value) # Populate and deal cards for War class War_Deck(cards.Deck): # Added code to determine if enough cards are available def deal(self, hands, per_hand = 1): for rounds in range(per_hand): for hand in hands: if len(self.cards) >= (per_hand * len(hands)): top_card = self.cards[0] self.give(top_card, hand) else: # Reshuffle the deck if cards run out print "Reshuffling deck." self.cards = [] self.populate() self.shuffle() # Remember to deal out a card: top_card = self.cards[0] self.give(top_card, hand) def populate(self): for suit in War_Card.SUITS: for rank in War_Card.RANKS: self.cards.append(War_Card(rank, suit)) # Get hand information class War_Hand(cards.Hand): def __init__(self, name): super(War_Hand, self).__init__() self.name = name def __str__(self): rep = self.name + ":\t" + super(War_Hand, self).__str__() if self.total: rep += "("+ str(self.total) + ")" return rep def get_total(self): # if a card in the hand has value of None, then total is None for card in self.cards: if not card.value: return None total = 0 for card in self.cards: total += card.value return total total = property(get_total) class War_Player(War_Hand): def lose(self): print self.name, "loses." def win(self): print self.name, "wins." def tie(self): print self.name, "ties." class War_Dealer(War_Hand): def flip_first_card(self): first_card = self.cards[0] return first_card class War_Game(object): def __init__(self, names): self.players = [] for name in names: player = War_Player(name) self.players.append(player) self.dealer = War_Dealer("Dealer") self.deck = War_Deck() self.deck.populate() self.deck.shuffle() def play(self): # deal initial 2 cards to everyone self.deck.deal(self.players + [self.dealer], per_hand= 1) self.dealer.flip_first_card() # hide dealer's first card count = 0 for player in self.players: count += 1 print player print self.dealer # compare each player still playing to dealer print "Max", max(self.players) if self.players[0].total > self.dealer.total: player.win() elif self.players[0].total < self.dealer.total: print "Dealer wins." else: player.tie() # remove everyone's cards for player in self.players: player.clear() self.dealer.clear() def main(): print "\t\tWelcome to War!\n" names = [] number = games.ask_number("How many players? (1-7): ", low = 1, high = 8) for i in range(number): name = raw_input("Enter player name: ") names.append(name) print game = War_Game(names) again = None while again != "n": game.play() again = games.ask_yes_no("\nDo you want to play again: ") main() raw_input("\n\nPress the enter key to exit.")
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question