Python Tkinter GUI Script to Build a Single or Multiplayer Tic Tac Toe Game Desktop App Full Project For Beginners

Python Tkinter GUI Script to Build a Single or Multiplayer Tic Tac Toe Game Desktop App Full Project For Beginners

 

Welcome folks today in this blog post we will be building a single or multiplayer tic tac toe game in tkinter desktop app. All the full source code of the application will be given below.

 

 

 

Get Started

 

 

Now to get started you need to install the following libraries inside your python project using the pip command as shown below

 

pip install tkinter

 

After installing this library make an app.py file and copy paste the following code to it

 

app.py

 

 

# Tic Tac Toe game with GUI 
# using tkinter 

# importing all necessary libraries 
import random 
import tkinter 
from tkinter import *
from functools import partial 
from tkinter import messagebox 
from copy import deepcopy 

# sign variable to decide the turn of which player 
sign = 0

# Creates an empty board 
global board 
board = [[" " for x in range(3)] for y in range(3)] 

# Check l(O/X) won the match or not 
# according to the rules of the game 
def winner(b, l): 
    return ((b[0][0] == l and b[0][1] == l and b[0][2] == l) or
            (b[1][0] == l and b[1][1] == l and b[1][2] == l) or
            (b[2][0] == l and b[2][1] == l and b[2][2] == l) or
            (b[0][0] == l and b[1][0] == l and b[2][0] == l) or
            (b[0][1] == l and b[1][1] == l and b[2][1] == l) or
            (b[0][2] == l and b[1][2] == l and b[2][2] == l) or
            (b[0][0] == l and b[1][1] == l and b[2][2] == l) or
            (b[0][2] == l and b[1][1] == l and b[2][0] == l)) 

# Configure text on button while playing with another player 
def get_text(i, j, gb, l1, l2): 
    global sign 
    if board[i][j] == ' ': 
        if sign % 2 == 0: 
            l1.config(state=DISABLED) 
            l2.config(state=ACTIVE) 
            board[i][j] = "X"
        else: 
            l2.config(state=DISABLED) 
            l1.config(state=ACTIVE) 
            board[i][j] = "O"
        sign += 1
        button[i][j].config(text=board[i][j]) 
    if winner(board, "X"): 
        gb.destroy() 
        box = messagebox.showinfo("Winner", "Player 1 won the match") 
    elif winner(board, "O"): 
        gb.destroy() 
        box = messagebox.showinfo("Winner", "Player 2 won the match") 
    elif(isfull()): 
        gb.destroy() 
        box = messagebox.showinfo("Tie Game", "Tie Game") 

# Check if the player can push the button or not 
def isfree(i, j): 
    return board[i][j] == " "

# Check the board is full or not 
def isfull(): 
    flag = True
    for i in board: 
        if(i.count(' ') > 0): 
            flag = False
    return flag 

# Create the GUI of game board for play along with another player 
def gameboard_pl(game_board, l1, l2): 
    global button 
    button = [] 
    for i in range(3): 
        m = 3+i 
        button.append(i) 
        button[i] = [] 
        for j in range(3): 
            n = j 
            button[i].append(j) 
            get_t = partial(get_text, i, j, game_board, l1, l2) 
            button[i][j] = Button( 
                game_board, bd=5, command=get_t, height=4, width=8) 
            button[i][j].grid(row=m, column=n) 
    game_board.mainloop() 

# Decide the next move of system 
def pc(): 
    possiblemove = [] 
    for i in range(len(board)): 
        for j in range(len(board[i])): 
            if board[i][j] == ' ': 
                possiblemove.append([i, j]) 
    move = [] 
    if possiblemove == []: 
        return
    else: 
        for let in ['O', 'X']: 
            for i in possiblemove: 
                boardcopy = deepcopy(board) 
                boardcopy[i[0]][i[1]] = let 
                if winner(boardcopy, let): 
                    return i 
        corner = [] 
        for i in possiblemove: 
            if i in [[0, 0], [0, 2], [2, 0], [2, 2]]: 
                corner.append(i) 
        if len(corner) > 0: 
            move = random.randint(0, len(corner)-1) 
            return corner[move] 
        edge = [] 
        for i in possiblemove: 
            if i in [[0, 1], [1, 0], [1, 2], [2, 1]]: 
                edge.append(i) 
        if len(edge) > 0: 
            move = random.randint(0, len(edge)-1) 
            return edge[move] 

# Configure text on button while playing with system 
def get_text_pc(i, j, gb, l1, l2): 
    global sign 
    if board[i][j] == ' ': 
        if sign % 2 == 0: 
            l1.config(state=DISABLED) 
            l2.config(state=ACTIVE) 
            board[i][j] = "X"
        else: 
            button[i][j].config(state=ACTIVE) 
            l2.config(state=DISABLED) 
            l1.config(state=ACTIVE) 
            board[i][j] = "O"
        sign += 1
        button[i][j].config(text=board[i][j]) 
    x = True
    if winner(board, "X"): 
        gb.destroy() 
        x = False
        box = messagebox.showinfo("Winner", "Player won the match") 
    elif winner(board, "O"): 
        gb.destroy() 
        x = False
        box = messagebox.showinfo("Winner", "Computer won the match") 
    elif(isfull()): 
        gb.destroy() 
        x = False
        box = messagebox.showinfo("Tie Game", "Tie Game") 
    if(x): 
        if sign % 2 != 0: 
            move = pc() 
            button[move[0]][move[1]].config(state=DISABLED) 
            get_text_pc(move[0], move[1], gb, l1, l2) 

# Create the GUI of game board for play along with system 
def gameboard_pc(game_board, l1, l2): 
    global button 
    button = [] 
    for i in range(3): 
        m = 3+i 
        button.append(i) 
        button[i] = [] 
        for j in range(3): 
            n = j 
            button[i].append(j) 
            get_t = partial(get_text_pc, i, j, game_board, l1, l2) 
            button[i][j] = Button( 
                game_board, bd=5, command=get_t, height=4, width=8) 
            button[i][j].grid(row=m, column=n) 
    game_board.mainloop() 

# Initialize the game board to play with system 
def withpc(game_board): 
    game_board.destroy() 
    game_board = Tk() 
    game_board.title("Tic Tac Toe") 
    l1 = Button(game_board, text="Player : X", width=10) 
    l1.grid(row=1, column=1) 
    l2 = Button(game_board, text = "Computer : O", 
                width = 10, state = DISABLED) 
    
    l2.grid(row = 2, column = 1) 
    gameboard_pc(game_board, l1, l2) 

# Initialize the game board to play with another player 
def withplayer(game_board): 
    game_board.destroy() 
    game_board = Tk() 
    game_board.title("Tic Tac Toe") 
    l1 = Button(game_board, text = "Player 1 : X", width = 10) 
    
    l1.grid(row = 1, column = 1) 
    l2 = Button(game_board, text = "Player 2 : O", 
                width = 10, state = DISABLED) 
    
    l2.grid(row = 2, column = 1) 
    gameboard_pl(game_board, l1, l2) 

# main function 
def play(): 
    menu = Tk() 
    menu.geometry("250x250") 
    menu.title("Tic Tac Toe") 
    wpc = partial(withpc, menu) 
    wpl = partial(withplayer, menu) 
    
    head = Button(menu, text = "---Welcome to tic-tac-toe---", 
                activeforeground = 'red', 
                activebackground = "yellow", bg = "red", 
                fg = "yellow", width = 500, font = 'summer', bd = 5) 
    
    B1 = Button(menu, text = "Single Player", command = wpc, 
                activeforeground = 'red', 
                activebackground = "yellow", bg = "red", 
                fg = "yellow", width = 500, font = 'summer', bd = 5) 
    
    B2 = Button(menu, text = "Multi Player", command = wpl, activeforeground = 'red', 
                activebackground = "yellow", bg = "red", fg = "yellow", 
                width = 500, font = 'summer', bd = 5) 
    
    B3 = Button(menu, text = "Exit", command = menu.quit, activeforeground = 'red', 
                activebackground = "yellow", bg = "red", fg = "yellow", 
                width = 500, font = 'summer', bd = 5) 
    head.pack(side = 'top') 
    B1.pack(side = 'top') 
    B2.pack(side = 'top') 
    B3.pack(side = 'top') 
    menu.mainloop() 

# Call main function 
if __name__ == '__main__': 
    play()

 

See also  Python 3 Pandas DataFrame.assign() Method Script to Add New Columns to Existing DataFrame Full Example Project For Beginners

 

Now if you execute the python script app.py by typing the below command

 

python app.py

 

 

 

 

 

 

Leave a Reply