用python tkinter编写4*4数字华容道游戏
时间: 2024-02-17 16:28:04 浏览: 137
好的,可以给您提供一个思路和代码示例:
思路:
1. 创建 Tkinter 窗口
2. 创建 4x4 的格子,用 List 存储每个格子中的数字,用 Button 显示每个格子
3. 需要定义游戏逻辑,如何移动数字,如何判断游戏胜利
4. 通过 Button 的 command 属性和对应的函数,实现点击移动数字
5. 添加 Restart 按钮,用于重新开始游戏
示例代码:
```python
import tkinter as tk
from random import shuffle
class PuzzleGame:
def __init__(self):
self.window = tk.Tk()
self.window.title("数字华容道")
self.grid = []
self.init_game()
self.window.mainloop()
def init_game(self):
self.generate_board()
self.create_grid()
self.shuffle_board()
self.moves = 0
self.create_moves_counter()
self.create_restart_button()
def generate_board(self):
self.board = [str(i) for i in range(1, 16)] + [""]
def create_grid(self):
for row in range(4):
for col in range(4):
num = self.board[row * 4 + col]
btn = tk.Button(self.window, text=num, width=5, height=2,
font=("Arial", 20, "bold"),
command=lambda row=row, col=col: self.move_piece(row, col))
btn.grid(row=row+1, column=col+1, padx=5, pady=5)
self.grid.append(btn)
def shuffle_board(self):
shuffle(self.board)
def create_moves_counter(self):
self.moves_var = tk.StringVar()
self.moves_var.set(f"步数:{self.moves}")
label = tk.Label(self.window, textvariable=self.moves_var,
font=("Arial", 16))
label.grid(row=0, column=0, columnspan=4, sticky="w")
# 在左下角添加 Restart 按钮
def create_restart_button(self):
restart_btn = tk.Button(self.window, text="重新开始",
font=("Arial", 16), command=self.restart_game,
bg="lightblue", fg="white")
restart_btn.grid(row=5, column=0, columnspan=4)
# 重新开始,重新生成、打乱数字布局,并更新按钮的文本
def restart_game(self):
self.generate_board()
self.shuffle_board()
self.moves = 0
self.moves_var.set(f"步数:{self.moves}")
for i, btn in enumerate(self.grid):
btn.config(text=self.board[i])
# 移动数字,如果移动合法则更新布局,更新步数,并判断是否获胜
def move_piece(self, row, col):
if self.is_valid_move(row, col):
idx1 = row * 4 + col
idx2 = self.board.index("")
self.board[idx1], self.board[idx2] = self.board[idx2], self.board[idx1]
self.grid[idx1].config(text=self.board[idx1])
self.grid[idx2].config(text="")
self.moves += 1
self.moves_var.set(f"步数:{self.moves}")
if self.is_win():
self.show_win_message()
# 判断是否可移动,只允许水平或垂直移动
def is_valid_move(self, row, col):
idx1 = row * 4 + col
idx2 = self.board.index("")
if row == idx2 // 4 and abs(col - idx2 % 4) == 1:
return True
if col == idx2 % 4 and abs(row - idx2 // 4) == 1:
return True
return False
# 判断是否获胜,如果中间空白数字在正确的位置上则获胜
def is_win(self):
for i in range(len(self.board) - 1):
if self.board[i] != str(i+1):
return False
return True
# 显示获胜信息,并禁用所有按键
def show_win_message(self):
tk.messagebox.showinfo("恭喜", f"您用了 {self.moves} 步获胜了!")
for btn in self.grid:
btn.config(state="disabled")
if __name__ == "__main__":
game = PuzzleGame()
```
注:此代码仅提供一个可能的实现思路,如有问题或改进意见,欢迎提出。
阅读全文