diff --git a/Python/Tic-tac-toe.py b/Python/Tic-tac-toe.py new file mode 100644 index 000000000..6e8de1420 --- /dev/null +++ b/Python/Tic-tac-toe.py @@ -0,0 +1,228 @@ +# 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() +