Skip to content

Instantly share code, notes, and snippets.

@Dhravya
Created September 13, 2021 07:35
Show Gist options
  • Save Dhravya/451e2551436820cf39efaf1102d4c3c8 to your computer and use it in GitHub Desktop.
Save Dhravya/451e2551436820cf39efaf1102d4c3c8 to your computer and use it in GitHub Desktop.
TicTacToe with GUI
#Multiplayer and single player
# 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 showBox(whowon):
box = Tk()
box.geometry('250x250')
box.title(whowon)
l = Label(box, text = whowon )
l.config(font =("Courier", 14))
l.place(relx = 0.5,
rely = 0.5,
anchor = 'center')
# wpc = partial(withpc, menu)
# wpl = partial(withplayer, ,menu)
bm = Button(box, text="Play again",
activeforeground='red',
activebackground="yellow", bg="red",
fg="yellow", width=500, font='summer', bd=5)
bm.pack(side='bottom')
# bm2.pack(side='bottom')
# l.pack()
box.mainloop()
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
showBox('You won !!!!')
elif winner(board, "O"):
gb.destroy()
x = False
showBox('you lost, try again')
elif(isfull()):
gb.destroy()
x = False
showBox('game is tied')
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= 'Blue',
activebackground= "yellow", bg = "Blue",
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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment