diff --git a/TIC_TAC_TOE/TIC_TAC_TOE.py b/TIC_TAC_TOE/TIC_TAC_TOE.py index c49d3f9..bf0e07e 100644 --- a/TIC_TAC_TOE/TIC_TAC_TOE.py +++ b/TIC_TAC_TOE/TIC_TAC_TOE.py @@ -9,44 +9,44 @@ p1 = StringVar() p2 = StringVar() -player1_name = Entry(tk, textvariable=p1, bd=5, bg='white', width=40) -player1_name.grid(row=1, column=1, columnspan=8) +Entry(tk, textvariable=p1, bd=5, bg='white', width=40).grid(row=1, column=1, columnspan=3) +Entry(tk, textvariable=p2, bd=5, bg='white', width=40).grid(row=2, column=1, columnspan=3) -player2_name = Entry(tk, textvariable=p2, bd=5, bg='white', width=40) -player2_name.grid(row=2, column=1, columnspan=8) - -# Score tracking -score_p1 = 0 -score_p2 = 0 +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) +# Game state current_player = "X" moves_count = 0 +score_p1 = 0 +score_p2 = 0 +move_number = 1 +# Buttons +buttons = [[None for _ in range(3)] for _ in range(3)] def update_scoreboard(): score_label.config( - text=f"{p1.get() or 'Player 1'} (X): {score_p1} | {p2.get() or 'Player 2'} (O): {score_p2}" + 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) - + for b in row: + b.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)] + [(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: @@ -54,28 +54,39 @@ def check_winner(): buttons[combo[1][0]][combo[1][1]]["text"] == \ buttons[combo[2][0]][combo[2][1]]["text"] != " ": + # ✅ Highlight winning cells + for pos in combo: + buttons[pos[0]][pos[1]].config(bg="green") + winner_symbol = buttons[combo[0][0]][combo[0][1]]["text"] if winner_symbol == "X": score_p1 += 1 - winner_name = p1.get() or "Player 1" + winner = p1.get() or "Player 1" else: score_p2 += 1 - winner_name = p2.get() or "Player 2" + winner = p2.get() or "Player 2" update_scoreboard() + messagebox.showinfo("Winner", f"{winner} wins!") disable_buttons() - messagebox.showinfo("Winner", f"{winner_name} wins!") return True - return False - def button_click(row, col): - global current_player, moves_count + global current_player, moves_count, move_number if buttons[row][col]["text"] == " ": buttons[row][col]["text"] = current_player + + # ✅ Move History + player = p1.get() if current_player == "X" else p2.get() + player = player or ("Player 1" if current_player == "X" else "Player 2") + + move = f"{move_number}. {player} -> ({row+1},{col+1})" + history_box.insert(END, move + "\n") + + move_number += 1 moves_count += 1 if check_winner(): @@ -83,42 +94,50 @@ def button_click(row, col): if moves_count == 9: messagebox.showinfo("Tie", "It's a Tie!") + disable_buttons() # ✅ prevent extra clicks return current_player = "O" if current_player == "X" else "X" + else: messagebox.showinfo("Invalid Move", "Button already clicked!") - def reset_game(): - global current_player, moves_count + global current_player, moves_count, move_number + current_player = "X" moves_count = 0 + move_number = 1 - for row in buttons: - for button in row: - button.config(text=" ", state=NORMAL) + history_box.delete(1.0, END) + for i in range(3): + for j in range(3): + buttons[i][j].config(text=" ", bg="black", 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)] - +# Create buttons (safe version) for i in range(3): for j in range(3): - buttons[i][j].grid(row=i + 3, column=j) - + buttons[i][j] = 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) + ) + buttons[i][j].grid(row=i+3, column=j) + +# Scoreboard 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) +# Reset button +Button(tk, text="Reset Game", font='Times 16 bold', + command=reset_game).grid(row=7, column=0, columnspan=3) + +# Move history UI +Label(tk, text="Move History", font='Times 16 bold', bg='yellow').grid(row=0, column=5) + +history_box = Text(tk, height=18, width=28, font=("Consolas", 11)) +history_box.grid(row=1, column=5, rowspan=6) -tk.mainloop() +tk.mainloop() \ No newline at end of file