Tic Tac Toe game with GUI using tkinter in Python

08 Jan, 2021
Tic-tac-toe (American English), noughts and crosses (British English), or Xs and Os is a paper-and-pencil game for two players, X and O, who take turns marking the spaces in a 3×3 grid. The player who succeeds in placing three of their marks in a horizontal, vertical, or diagonal row is the winner.
tkinter Python library is used to create the GUI. Two options are available to play the game, along with the system or with another player.
A small winning strategy is used to play with the system. The system will try to find the best place to put its naught or cross by which the system will win or try to stop players to win. 
Create a landing page containing selection buttons: Single-player or multiplayer.
Create a game-board containing nine tiles to play the game along with other details (i.e. playing with a system or another player, whose turn etc.).
Allow the player to press the tile and check the status of the game (i.e. Tie game, anyone of the players won the match or the game is still running).
Display the message, who won the match.
gameboard_pc() and gameboard_pl() will create the another geometry to play the game. It will add 9 buttons on 3×3 board of the game (Three rows of buttons containing three buttons each).
get_text_pc() and get_text() functions will put the text on buttons as it pressed.
pc() function will decide the next move of the system.
winner() function will check whether the player won the match or not.
isfree() function will check whether the player can put it’s a coin or not.
isfull() function will check the board is full or not.
Below is the code for the above game:
Python3
# Tic Tac Toe game with GUI# using tkinter  # importing all necessary librariesimport randomimport tkinterfrom tkinter import *from functools import partialfrom tkinter import messageboxfrom copy import deepcopy  # sign variable to decide the turn of which playersign = 0  # Creates an empty boardglobal boardboard = [[" " 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 gamedef 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 playerdef 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 notdef isfree(i, j):    return board[i][j] == " "  # Check the board is full or notdef 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 playerdef 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 systemdef 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 systemdef 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 systemdef 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 systemdef 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 playerdef 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 functiondef 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 functionif __name__ == '__main__':    play()
Output:
Python Tkinter-exercises
Python-gui
Python-tkinter
Technical Scripter 2020
Python
Technical Scripter
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
How to Install PIP on Windows ?
Python Classes and Objects
Python OOPs Concepts
Introduction To PYTHON
Python | os.path.join() method
How to drop one or multiple columns in Pandas Dataframe
How To Convert Python Dictionary To JSON?
Check if element exists in list in Python
Python | Get unique values from a list
Python | datetime.timedelta() function