这是一个用 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 控件来绘制拼图块和拼图界面。在初始化游戏时,我们将图片分成拼图块,并将最后一个拼图块设置为空块。然后,我们打乱拼图块的顺序,并在拼图块被移动时更新其位置和空块位置。在移动拼图块的时候,我们还需要检查是否完成了拼图。如果完成了拼图,我们会弹出一个消息框来告诉用户。

Python Tkinter 拼图游戏:100 行代码实现简单拼图

原文地址: https://www.cveoy.top/t/topic/nYx5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录