diff --git a/tic_tac_toe/game_gui b/tic_tac_toe/game_gui new file mode 100644 index 00000000..d72f2413 --- /dev/null +++ b/tic_tac_toe/game_gui @@ -0,0 +1,453 @@ +# 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()