Python Tkinter 拼图游戏:100 行代码实现简单拼图
这是一个用 Python 和 Tkinter 库创建的简单拼图游戏,代码约 100 行并包含详细的注释。
import tkinter as tk
import random
# 拼图块的大小
BLOCK_SIZE = 80
# 拼图块的数量
BLOCK_NUM = 3
# 拼图图片的路径
IMAGE_PATH = 'puzzle.jpg'
class PuzzleGame:
def __init__(self, master):
self.master = master
self.master.title('拼图游戏')
self.canvas = tk.Canvas(self.master, width=BLOCK_SIZE*BLOCK_NUM, height=BLOCK_SIZE*BLOCK_NUM, bg='white')
self.canvas.pack()
self.blocks = []
self.empty_pos = (0, 0)
self.image = tk.PhotoImage(file=IMAGE_PATH)
self.init_game()
def init_game(self):
# 将图片分成拼图块
for i in range(BLOCK_NUM):
row = []
for j in range(BLOCK_NUM):
x1, y1 = j*BLOCK_SIZE, i*BLOCK_SIZE
x2, y2 = x1+BLOCK_SIZE, y1+BLOCK_SIZE
block = self.canvas.create_image(x1, y1, image=self.image, anchor='nw', tags='block')
row.append(block)
self.blocks.append(row)
# 将最后一个拼图块设置为空块
self.canvas.delete(self.blocks[BLOCK_NUM-1][BLOCK_NUM-1])
self.blocks[BLOCK_NUM-1][BLOCK_NUM-1] = 0
self.empty_pos = (BLOCK_NUM-1, BLOCK_NUM-1)
# 打乱拼图块的顺序
self.shuffle_blocks()
def shuffle_blocks(self):
# 随机移动 100 次
for i in range(100):
row, col = self.empty_pos
# 随机选择一个相邻的拼图块
choices = [
(row-1, col), # 上
(row+1, col), # 下
(row, col-1), # 左
(row, col+1), # 右
]
valid_choices = []
for r, c in choices:
if r >= 0 and r < BLOCK_NUM and c >= 0 and c < BLOCK_NUM:
valid_choices.append((r, c))
new_pos = random.choice(valid_choices)
# 移动拼图块
self.move_block(new_pos)
def move_block(self, pos):
row1, col1 = self.empty_pos
row2, col2 = pos
# 计算拼图块的坐标
x1, y1 = col2*BLOCK_SIZE, row2*BLOCK_SIZE
x2, y2 = x1+BLOCK_SIZE, y1+BLOCK_SIZE
# 交换拼图块的位置
self.canvas.coords(self.blocks[row1][col1], x1, y1)
self.canvas.coords(self.blocks[row2][col2], x2, y2)
self.blocks[row1][col1], self.blocks[row2][col2] = self.blocks[row2][col2], self.blocks[row1][col1]
self.empty_pos = pos
# 判断是否完成拼图
if self.is_finished():
self.show_message('恭喜你完成了拼图!')
def is_finished(self):
for i in range(BLOCK_NUM):
for j in range(BLOCK_NUM):
block = self.blocks[i][j]
if block == 0:
continue
x, y = self.canvas.coords(block)
if x != j*BLOCK_SIZE or y != i*BLOCK_SIZE:
return False
return True
def show_message(self, message):
# 创建一个顶级窗口
top = tk.Toplevel(self.master)
top.title('消息')
# 添加消息文本
label = tk.Label(top, text=message, font=('Arial', 16))
label.pack(padx=20, pady=20)
# 添加关闭按钮
button = tk.Button(top, text='关闭', command=top.destroy)
button.pack(padx=20, pady=20)
root = tk.Tk()
game = PuzzleGame(root)
root.mainloop()
在这个游戏中,我们使用了 Tkinter 的 Canvas 控件来绘制拼图块和拼图界面。在初始化游戏时,我们将图片分成拼图块,并将最后一个拼图块设置为空块。然后,我们打乱拼图块的顺序,并在拼图块被移动时更新其位置和空块位置。在移动拼图块的时候,我们还需要检查是否完成了拼图。如果完成了拼图,我们会弹出一个消息框来告诉用户。
原文地址: https://www.cveoy.top/t/topic/nYx5 著作权归作者所有。请勿转载和采集!