Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 101 additions & 94 deletions TIC_TAC_TOE/TIC_TAC_TOE.py
Original file line number Diff line number Diff line change
@@ -1,117 +1,124 @@
from tkinter import *
import tkinter.messagebox
import tkinter.messagebox as messagebox

tk = Tk()
tk.title("Tic Tac Toe")
tk.configure(bg='yellow')

# Player names
p1 = StringVar()
p2 = StringVar()

player1_name = Entry(textvariable=p1, bd=5, bg='white', width=40)
player1_name = Entry(tk, textvariable=p1, bd=5, bg='white', width=40)
player1_name.grid(row=1, column=1, columnspan=8)

player2_name = Entry(tk, textvariable=p2, bd=5, bg='white', width=40)
player2_name.grid(row=2, column=1, columnspan=8)

bclick = True
flag = 0
current_player_name = p1.get() if p1.get() else 'X'


def disableButton():
for i in range(3):
for j in range(3):
buttons[i][j].configure(state=DISABLED)


def checkForWin():
for i in range(3):
if buttons[i][0]["text"] == buttons[i][1]["text"] == buttons[i][2]["text"] != " ":
buttons[i][0].config(bg="green")
buttons[i][1].config(bg="green")
buttons[i][2].config(bg="green")
disableButton()
winner_name = p1.get(
) if buttons[i][0]['text'] == 'X' else p2.get()
if not winner_name:
winner_name = 'Player 1' if buttons[i][0]['text'] == 'X' else 'Player 2'
tkinter.messagebox.showinfo("Tic-Tac-Toe", f"{winner_name} wins!")
# Score tracking
score_p1 = 0
score_p2 = 0

current_player = "X"
moves_count = 0


def update_scoreboard():
score_label.config(
text=f"{p1.get() or 'Player 1'} (X): {score_p1} | {p2.get() or 'Player 2'} (O): {score_p2}"
)


def disable_buttons():
for row in buttons:
for button in row:
button.config(state=DISABLED)


def check_winner():
global score_p1, score_p2

win_positions = [
[(0, 0), (0, 1), (0, 2)],
[(1, 0), (1, 1), (1, 2)],
[(2, 0), (2, 1), (2, 2)],
[(0, 0), (1, 0), (2, 0)],
[(0, 1), (1, 1), (2, 1)],
[(0, 2), (1, 2), (2, 2)],
[(0, 0), (1, 1), (2, 2)],
[(0, 2), (1, 1), (2, 0)]
]

for combo in win_positions:
if buttons[combo[0][0]][combo[0][1]]["text"] == \
buttons[combo[1][0]][combo[1][1]]["text"] == \
buttons[combo[2][0]][combo[2][1]]["text"] != " ":

winner_symbol = buttons[combo[0][0]][combo[0][1]]["text"]

if winner_symbol == "X":
score_p1 += 1
winner_name = p1.get() or "Player 1"
else:
score_p2 += 1
winner_name = p2.get() or "Player 2"

update_scoreboard()
disable_buttons()
messagebox.showinfo("Winner", f"{winner_name} wins!")
return True

return False


def button_click(row, col):
global current_player, moves_count

if buttons[row][col]["text"] == " ":
buttons[row][col]["text"] = current_player
moves_count += 1

if check_winner():
return
if buttons[0][i]["text"] == buttons[1][i]["text"] == buttons[2][i]["text"] != " ":
buttons[0][i].config(bg="green")
buttons[1][i].config(bg="green")
buttons[2][i].config(bg="green")
disableButton()
winner_name = p1.get(
) if buttons[0][i]['text'] == 'X' else p2.get()
if not winner_name:
winner_name = 'Player 1' if buttons[0][i]['text'] == 'X' else 'Player 2'
tkinter.messagebox.showinfo("Tic-Tac-Toe", f"{winner_name} wins!")

if moves_count == 9:
messagebox.showinfo("Tie", "It's a Tie!")
return
if buttons[0][0]["text"] == buttons[1][1]["text"] == buttons[2][2]["text"] != " ":
buttons[0][0].config(bg="green")
buttons[1][1].config(bg="green")
buttons[2][2].config(bg="green")
disableButton()
winner_name = p1.get() if buttons[0][0]['text'] == 'X' else p2.get()
if not winner_name:
winner_name = 'Player 1' if buttons[0][0]['text'] == 'X' else 'Player 2'
tkinter.messagebox.showinfo("Tic-Tac-Toe", f"{winner_name} wins!")
return
if buttons[0][2]["text"] == buttons[1][1]["text"] == buttons[2][0]["text"] != " ":
buttons[0][2].config(bg="green")
buttons[1][1].config(bg="green")
buttons[2][0].config(bg="green")
disableButton()
winner_name = p1.get() if buttons[0][2]['text'] == 'X' else p2.get()
if not winner_name:
winner_name = 'Player 1' if buttons[0][2]['text'] == 'X' else 'Player 2'
tkinter.messagebox.showinfo("Tic-Tac-Toe", f"{winner_name} wins!")
return
if flag == 8:
tkinter.messagebox.showinfo("Tic-Tac-Toe", "It's a Tie")


def resetGame():
global bclick, flag, current_player_name
for i in range(3):
for j in range(3):
buttons[i][j]["text"] = " "
buttons[i][j].config(bg='black', state=NORMAL)
bclick = True
flag = 0
current_player_name = p1.get() if p1.get() else 'X'


Label(tk, text="Player 1:", font='Times 20 bold', bg='yellow',
fg='black', height=1, width=8).grid(row=1, column=0)
Label(tk, text="Player 2:", font='Times 20 bold', bg='yellow',
fg='black', height=1, width=8).grid(row=2, column=0)
buttons = [[Button(tk, text=' ', font='Times 20 bold', bg='black',
fg='white', height=4, width=8) for _ in range(3)] for _ in range(3)]


def btnClick(button):
global bclick, flag
if button["text"] == " ":
if bclick:
button["text"] = "X"
else:
button["text"] = "O"
bclick = not bclick
flag += 1
checkForWin()

current_player = "O" if current_player == "X" else "X"
else:
tkinter.messagebox.showinfo("Tic-Tac-Toe", "Button already Clicked!")
messagebox.showinfo("Invalid Move", "Button already clicked!")


def reset_game():
global current_player, moves_count
current_player = "X"
moves_count = 0

for row in buttons:
for button in row:
button.config(text=" ", state=NORMAL)


Label(tk, text="Player 1:", font='Times 20 bold', bg='yellow').grid(row=1, column=0)
Label(tk, text="Player 2:", font='Times 20 bold', bg='yellow').grid(row=2, column=0)

buttons = [[Button(tk, text=" ", font='Times 20 bold', bg='black',
fg='white', height=4, width=8,
command=lambda r=i, c=j: button_click(r, c))
for j in range(3)] for i in range(3)]

for i in range(3):
for j in range(3):
buttons[i][j].configure(command=lambda row=i,
col=j: btnClick(buttons[row][col]))
buttons[i][j].grid(row=i + 3, column=j)
reset_button = Button(tk, text="Reset Game", font='Times 16 bold',
bg='white', fg='black', command=resetGame)
reset_button.grid(row=6, column=0, columnspan=3)

score_label = Label(tk, text="", font='Times 14 bold', bg='yellow')
score_label.grid(row=6, column=0, columnspan=3)

update_scoreboard()

reset_btn = Button(tk, text="Reset Game", font='Times 16 bold',
command=reset_game)
reset_btn.grid(row=7, column=0, columnspan=3)

tk.mainloop()