War Card Game in Python
The War card game is a classic, simple game that can be a fun way to practice programming skills. The game involves a standard 52-card deck split between two players. Each player reveals the top card of their deck, and the player with the higher card takes both cards and adds them to the bottom of their deck. If the cards are of equal rank, a “war” is triggered, where each player places three cards face down and then one card face up; the higher face-up card wins all the cards. This process repeats until one player has all the cards.
In this article, we’ll walk through creating a War card game in Python, focusing on essential concepts like object-oriented programming (OOP), randomness, and game logic.
Concepts related to the Topic:
- Rounds: Each player flips the top card of their deck. The player with the higher card wins the round and collects both cards.
- Dealing: Distributing the cards equally between two players.
- Deck of Cards: A standard deck consists of 52 cards, divided into four suits (diamonds, clubs, hearts, and spades) and thirteen ranks (2–10): jack, queen, king, and ace.
- Suffling: Randomly distribute and ace the cards equally between two players.
- Wars: If the flipped cards are of equal rank, a “war” occurs where each player places additional cards down, and the higher card of the next flip wins all the cards in play.
- Game End: The game continues until one player has all the cards or a set number of rounds have been completed.
Define the code in Four Classes:
Card Class: That class defines a playing card with a suit and a value.
- Define many keywords like suits for a list of the four suits in a deck of cards and another keyword value.
class Card:
suits = ["spades", "hearts", "diamonds", "clubs"]
values = [None, None, "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
def __init__(self, v, s):
"""suit + value are ints"""
self.value = v
self.suit = s
def __lt__(self, c2):
if self.value < c2.value:
return True
if self.value == c2.value:
if self.suit < c2.suit:
return True
else:
return False
return False
def __gt__(self, c2):
if self.value > c2.value:
return True
if self.value == c2.value:
if self.suit > c2.suit:
return True
else:
return False
return False
def __repr__(self):
v = self.values[self.value] + " of " + self.suits[self.suit]
return v
Deck Class: This class define the deck of 52 cards.In that case define two keyword ‘_init_(self)’ and ‘rm_card(self)
class Deck:
def __init__(self):
self.cards = []
for i in range(2, 15):
for j in range(4):
self.cards.append(Card(i, j))
shuffle(self.cards)
def rm_card(self):
if len(self.cards) == 0:
return
return self.cards.pop()
Player Class: The Player class represents a player in the game.
class Player:
def __init__(self, name):
self.wins = 0
self.card = None
self.name = name
Game Class:The Game class handles the game logic.Implements the game logic, handling user input, drawing cards, and determining round and game winners.
class Game:
def __init__(self):
name1 = input("Player 1 name: ")
name2 = input("Player 2 name: ")
self.deck = Deck()
self.p1 = Player(name1)
self.p2 = Player(name2)
def wins(self, winner):
w = "{} wins this round".format(winner)
print(w)
def draw(self, p1n, p1c, p2n, p2c):
d = "{} drew {} and {} drew {}".format(p1n, p1c, p2n, p2c)
print(d)
def play_game(self):
cards = self.deck.cards
print("Beginning War!")
while len(cards) >= 2:
m = "Press 'q' to quit. Any other key to play: "
response = input(m)
if response == 'q':
break
p1c = self.deck.rm_card()
p2c = self.deck.rm_card()
p1n = self.p1.name
p2n = self.p2.name
self.draw(p1n, p1c, p2n, p2c)
if p1c > p2c:
self.p1.wins += 1
self.wins(self.p1.name)
else:
self.p2.wins += 1
self.wins(self.p2.name)
win = self.winner(self.p1, self.p2)
print("War is over. {} wins".format(win))
def winner(self, p1, p2):
if p1.wins > p2.wins:
return p1.name
if p1.wins < p2.wins:
return p2.name
return "It was a tie!"
game = Game()
game.play_game()
Complete Code:
from random import shuffle
class Card:
suits = ["spades", "hearts", "diamonds", "clubs"]
values = [None, None, "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
def __init__(self, v, s):
"""suit + value are ints"""
self.value = v
self.suit = s
def __lt__(self, c2):
if self.value < c2.value:
return True
if self.value == c2.value:
if self.suit < c2.suit:
return True
else:
return False
return False
def __gt__(self, c2):
if self.value > c2.value:
return True
if self.value == c2.value:
if self.suit > c2.suit:
return True
else:
return False
return False
def __repr__(self):
v = self.values[self.value] + " of " + self.suits[self.suit]
return v
class Deck:
def __init__(self):
self.cards = []
for i in range(2, 15):
for j in range(4):
self.cards.append(Card(i, j))
shuffle(self.cards)
def rm_card(self):
if len(self.cards) == 0:
return
return self.cards.pop()
class Player:
def __init__(self, name):
self.wins = 0
self.card = None
self.name = name
class Game:
def __init__(self):
name1 = input("Player 1 name: ")
name2 = input("Player 2 name: ")
self.deck = Deck()
self.p1 = Player(name1)
self.p2 = Player(name2)
def wins(self, winner):
w = "{} wins this round".format(winner)
print(w)
def draw(self, p1n, p1c, p2n, p2c):
d = "{} drew {} and {} drew {}".format(p1n, p1c, p2n, p2c)
print(d)
def play_game(self):
cards = self.deck.cards
print("Beginning War!")
while len(cards) >= 2:
m = "Press 'q' to quit. Any other key to play: "
response = input(m)
if response == 'q':
break
p1c = self.deck.rm_card()
p2c = self.deck.rm_card()
p1n = self.p1.name
p2n = self.p2.name
self.draw(p1n, p1c, p2n, p2c)
if p1c > p2c:
self.p1.wins += 1
self.wins(self.p1.name)
else:
self.p2.wins += 1
self.wins(self.p2.name)
win = self.winner(self.p1, self.p2)
print("War is over. {} wins".format(win))
def winner(self, p1, p2):
if p1.wins > p2.wins:
return p1.name
if p1.wins < p2.wins:
return p2.name
return "It was a tie!"
game = Game()
game.play_game()
Output:
Video
Contact Us