In this video I’ll show you how to create the card game War with tkinter and Python!
War is a very basic card game that children play where each player gets a single card, and whoever has the highest card wins.
We’ll build out this game from the deck that we created in the last video, so check that out if you missed it!
Python Code: war.py
(Github Code)
from tkinter import *
import random
from PIL import Image, ImageTk
root = Tk()
root.title('Codemy.com - Card Deck')
root.iconbitmap('c:/gui/codemy.ico')
root.geometry("900x550")
root.configure(background="green")
# Resize Cards
def resize_cards(card):
# Open the image
our_card_img = Image.open(card)
# Resize The Image
our_card_resize_image = our_card_img.resize((150, 218))
# output the card
global our_card_image
our_card_image = ImageTk.PhotoImage(our_card_resize_image)
# Return that card
return our_card_image
# Shuffle The Cards
def shuffle():
# Define Our Deck
suits = ["diamonds", "clubs", "hearts", "spades"]
values = range(2, 15)
# 11 = Jack, 12=Queen, 13=King, 14 = Ace
global deck
deck =[]
for suit in suits:
for value in values:
deck.append(f'{value}_of_{suit}')
# Create our players
global dealer, player, dscore, pscore
dealer = []
player = []
dscore = []
pscore = []
# Grab a random Card For Dealer
dealer_card = random.choice(deck)
# Remove Card From Deck
deck.remove(dealer_card)
# Append Card To Dealer List
dealer.append(dealer_card)
# Output Card To Screen
global dealer_image
dealer_image = resize_cards(f'images/cards/{dealer_card}.png')
dealer_label.config(image=dealer_image)
# Grab a random Card For Player
player_card = random.choice(deck)
# Remove Card From Deck
deck.remove(player_card)
# Append Card To Dealer List
player.append(player_card)
# Output Card To Screen
global player_image
player_image = resize_cards(f'images/cards/{player_card}.png')
player_label.config(image=player_image)
#player_label.config(text=card)
# Put number of remaining cards in title bar
root.title(f'Codemy.com - {len(deck)} Cards Left')
# Get The Score
score(dealer_card, player_card)
# Deal Out Cards
def deal_cards():
try:
# Get the deler Card
dealer_card = random.choice(deck)
# Remove Card From Deck
deck.remove(dealer_card)
# Append Card To Dealer List
dealer.append(dealer_card)
# Output Card To Screen
global dealer_image
dealer_image = resize_cards(f'images/cards/{dealer_card}.png')
dealer_label.config(image=dealer_image)
#dealer_label.config(text=card)
# Get the player Card
player_card = random.choice(deck)
# Remove Card From Deck
deck.remove(player_card)
# Append Card To Dealer List
player.append(player_card)
# Output Card To Screen
global player_image
player_image = resize_cards(f'images/cards/{player_card}.png')
player_label.config(image=player_image)
#player_label.config(text=card)
# Put number of remaining cards in title bar
root.title(f'Codemy.com - {len(deck)} Cards Left')
# Get The Score
score(dealer_card, player_card)
except:
# Tie
if dscore.count("x") == pscore.count("x"):
root.title(f'Codemy.com - Game Over! Tie! {dscore.count("x")} to {pscore.count("x")}')
# Dealer Wins
elif dscore.count("x") > pscore.count("x"):
root.title(f'Codemy.com - Game Over! Dealer Wins! {dscore.count("x")} to {pscore.count("x")}')
# Player Wins
else:
root.title(f'Codemy.com - Game Over! Player Wins! {pscore.count("x")} to {dscore.count("x")}')
def score(dealer_card, player_card):
# Split out card numbers
dealer_card = int(dealer_card.split("_", 1)[0])
player_card = int(player_card.split("_", 1)[0])
# Compare Card numbers
if dealer_card == player_card:
score_label.config(text="Tie! Play Again!")
elif dealer_card > player_card:
score_label.config(text="Dealer Wins!")
dscore.append("x")
else:
score_label.config(text="Player Wins!")
pscore.append("x")
root.title(f'Codemy.com - {len(deck)} Cards Left | Dealer: {dscore.count("x")} Player: {pscore.count("x")}')
my_frame = Frame(root, bg="green")
my_frame.pack(pady=20)
# Create Frames For Cards
dealer_frame = LabelFrame(my_frame, text="Dealer", bd=0)
dealer_frame.grid(row=0, column=0, padx=20, ipadx=20)
player_frame = LabelFrame(my_frame, text="Player", bd=0)
player_frame.grid(row=0, column=1, ipadx=20)
# Put cards in frames
dealer_label = Label(dealer_frame, text='')
dealer_label.pack(pady=20)
player_label = Label(player_frame, text='')
player_label.pack(pady=20)
# Create Score Label
score_label = Label(root, text="", font=("Helvetica", 14), bg="green")
score_label.pack(pady=20)
# Create a couple buttons
shuffle_button = Button(root, text="Shuffle Deck", font=("Helvetica", 14), command=shuffle)
shuffle_button.pack(pady=20)
card_button = Button(root, text="Get Cards", font=("Helvetica", 14), command=deal_cards)
card_button.pack(pady=20)
# Shuffle Deck On Start
shuffle()
root.mainloop()

Add comment