diff --git a/TIC_TAC_TOE/TIC_TAC_TOE.py b/TIC_TAC_TOE/TIC_TAC_TOE.py index c71c8c4..c49d3f9 100644 --- a/TIC_TAC_TOE/TIC_TAC_TOE.py +++ b/TIC_TAC_TOE/TIC_TAC_TOE.py @@ -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()