War Card Game in Python

December 2, 2012. Filed under python

While cleaning out my code repository on my laptop I ran into an implementation of the card game War I wrote during a programming interview. It's far from spectacular, but does seem like a pretty good interview question.

```"""
Implement the card game war. Rules are:

1. Deal out deck of 52 cards between two users.
2. Each player plays a card. Higher card wins. Winner takes both cards.
3. If players tie, then each player puts down three cards, and the third
card competes.
If a player has less than 3 cards, then they put down all of their cards
and their final card competes against the other player's third card.
Continue doing this until tie is broken.
Winner takes all cards.
4. Game is over when a player doesn't have any cards. The player with
cards remaining is the winner.
"""
import random

def generate_deck(suites=4, type_cards=13):
"Generate a randomized deck of cards."
cards = []
for suite in range(suites):
for type_card in range(1, type_cards+1):
cards.append(type_card)
random.shuffle(cards)
return cards

def play_war(deck):
a_cards = deck[:len(deck)/2]
b_cards = deck[len(deck)/2:]
a_stash = []
b_stash = []

round = 1
while a_cards and b_cards:
# by using pop, we're playing from the end forward
a_card = a_cards.pop()
b_card = b_cards.pop()

if a_card == b_card:
a_stash.extend([a_card]+a_cards[-3:])
a_cards = a_cards[:-3]
a_cards.append(a_stash.pop())

b_stash.extend([b_card]+b_cards[-3:])
b_cards = b_cards[:-3]
b_cards.append(b_stash.pop())
elif a_card > b_card:
# ordering of a_stash and b_stash is undefined by game rules
a_cards = [a_card, b_card] + a_stash + b_stash + a_cards
a_stash = []
b_stash = []
elif b_card > a_card:
# ordering of a_stash and b_stash is undefined by game rules
b_cards = [b_card, a_card] + b_stash + a_stash + b_cards
a_stash = []
b_stash = []

print "round %s: a_cards: %s, a_stash %s, b_cards %s, b_stash %s" %
(round, len(a_cards), len(a_stash), len(b_cards), len(b_stash))
round += 1

if __name__ == "__main__":
deck = generate_deck()
play_war(deck)
```

Without the initial comment it's about fifty lines of code.