import tkinter as tk from tkinter import messagebox class SneakyTicTacToe: def __init__(self, root): self.root = root self.size = 7 # 实际棋盘大小 self.board = [["" for _ in range(self.size)] for _ in range(self.size)] self.current_player = "X" self.buttons = [[None for _ in range(self.size)] for _ in range(self.size)] # 记录右键点击的两个格子 self.swap_selection = [] for i in range(self.size): for j in range(self.size): btn = tk.Button(root, text="", font=("Arial", 24), width=3, height=1) btn.grid(row=i+1, column=j) btn.config(command=lambda r=i, c=j: self.on_click(r, c)) btn.bind("", lambda e, r=i, c=j: self.on_right_click(r, c)) # 右键绑定 self.buttons[i][j] = btn root.geometry(f"{3*65}x{3*63}") # 默认窗口大小 def on_click(self, r, c): if self.board[r][c] != "": return self.board[r][c] = self.current_player self.buttons[r][c].config(text=self.current_player) if self.check_winner(self.current_player): messagebox.showinfo("🎉 游戏结束", f"玩家 {self.current_player} 获胜!") self.reset() elif self.is_draw(): messagebox.showinfo("😐 游戏结束", "平局") self.reset() else: self.current_player = "O" if self.current_player == "X" else "X" def on_right_click(self, r, c): # 只允许选择非空格子进行交换 if self.board[r][c] == "": return self.swap_selection.append((r, c)) if len(self.swap_selection) == 2: (r1, c1), (r2, c2) = self.swap_selection # 交换 board 内容 self.board[r1][c1], self.board[r2][c2] = self.board[r2][c2], self.board[r1][c1] self.buttons[r1][c1].config(text=self.board[r1][c1]) self.buttons[r2][c2].config(text=self.board[r2][c2]) self.swap_selection.clear() def check_winner(self, player): for i in range(self.size): for j in range(self.size): if j + 2 < self.size and all(self.board[i][j+k] == player for k in range(3)): return True if i + 2 < self.size and all(self.board[i+k][j] == player for k in range(3)): return True if i + 2 < self.size and j + 2 < self.size and all(self.board[i+k][j+k] == player for k in range(3)): return True if i + 2 < self.size and j - 2 >= 0 and all(self.board[i+k][j-k] == player for k in range(3)): return True return False def is_draw(self): return all(self.board[i][j] != "" for i in range(self.size) for j in range(self.size)) def reset(self): for i in range(self.size): for j in range(self.size): self.board[i][j] = "" self.buttons[i][j].config(text="") self.current_player = "X" self.swap_selection.clear() # 启动游戏 if __name__ == "__main__": root = tk.Tk() game = SneakyTicTacToe(root) root.mainloop()