import tkinter as tk
import random

# 定义常量
WIDTH = 400  # 窗口宽度
HEIGHT = 400  # 窗口高度
ROW = 4  # 拼图行数
COLUMN = 4  # 拼图列数
IMAGE_SIZE = 100  # 拼图图片大小
IMAGES = ['1.png', '2.png', '3.png', '4.png', '5.png', '6.png', '7.png', '8.png', '9.png', '10.png', '11.png', '12.png', '13.png', '14.png', '15.png', '16.png']  # 拼图图片列表


class PuzzleGame:
    def __init__(self, master):
        self.master = master
        self.master.title('拼图游戏')  # 窗口标题
        self.master.geometry(f'{WIDTH}x{HEIGHT}')  # 窗口大小
        self.master.resizable(False, False)  # 窗口不可调整大小

        # 加载图片
        self.images = []
        for img in IMAGES:
            self.images.append(tk.PhotoImage(file=img))

        # 初始化拼图
        self.board = []
        for i in range(ROW):
            row = []
            for j in range(COLUMN):
                index = i * COLUMN + j
                if index == ROW * COLUMN - 1:
                    row.append(None)  # 空白块为None
                else:
                    image = self.images[index]
                    row.append(image)
            self.board.append(row)

        # 打乱拼图
        self.shuffle()

        # 创建拼图区域
        self.canvas = tk.Canvas(self.master, width=IMAGE_SIZE * COLUMN, height=IMAGE_SIZE * ROW, bg='white')
        self.canvas.pack()

        # 绘制拼图
        self.draw_board()

        # 创建重置按钮
        self.button = tk.Button(self.master, text='重置', command=self.reset)
        self.button.pack()

        # 绑定拖拽事件
        self.canvas.bind('<ButtonPress-1>', self.on_press)
        self.canvas.bind('<B1-Motion>', self.on_move)
        self.canvas.bind('<ButtonRelease-1>', self.on_release)

        # 初始化拖拽状态
        self.dragging = False
        self.drag_row = None
        self.drag_column = None

    def draw_board(self):
        '''绘制拼图'''
        self.canvas.delete('all')
        for i in range(ROW):
            for j in range(COLUMN):
                image = self.board[i][j]
                if image:
                    x = j * IMAGE_SIZE
                    y = i * IMAGE_SIZE
                    self.canvas.create_image(x, y, image=image, anchor='nw')

    def shuffle(self):
        '''打乱拼图'''
        for i in range(ROW):
            for j in range(COLUMN):
                x1 = random.randint(0, ROW - 1)
                y1 = random.randint(0, COLUMN - 1)
                x2 = random.randint(0, ROW - 1)
                y2 = random.randint(0, COLUMN - 1)
                self.board[x1][y1], self.board[x2][y2] = self.board[x2][y2], self.board[x1][y1]

    def reset(self):
        '''重置拼图'''
        self.shuffle()
        self.draw_board()

    def on_press(self, event):
        '''拖拽开始'''
        x = event.x // IMAGE_SIZE
        y = event.y // IMAGE_SIZE
        if self.board[y][x]:
            self.dragging = True
            self.drag_row = y
            self.drag_column = x

    def on_move(self, event):
        '''拖拽中'''
        if self.dragging:
            x = event.x // IMAGE_SIZE
            y = event.y // IMAGE_SIZE
            if x != self.drag_column or y != self.drag_row:
                self.board[self.drag_row][self.drag_column], self.board[y][x] = self.board[y][x], self.board[self.drag_row][self.drag_column]
                self.draw_board()
                self.drag_row = y
                self.drag_column = x

    def on_release(self, event):
        '''拖拽结束'''
        self.dragging = False
        self.drag_row = None
        self.drag_column = None


if __name__ == '__main__':
    root = tk.Tk()
    game = PuzzleGame(root)
    root.mainloop()

该程序通过 Tkinter 创建了一个窗口,加载了一组图片,将它们随机打乱,生成一个拼图游戏。玩家可以通过鼠标拖拽,交换图片位置来完成拼图。

程序主要分为以下几个部分:

  • 定义常量:定义了窗口大小、拼图行列数、图片大小等常量。
  • 初始化:创建窗口、加载图片、初始化拼图、打乱拼图、创建拼图区域、绘制拼图、创建重置按钮、绑定拖拽事件等。
  • 绘制拼图:通过 Canvas 组件绘制拼图。
  • 打乱拼图:将拼图打乱,生成新的拼图游戏。
  • 重置拼图:重置拼图,生成新的拼图游戏。
  • 拖拽事件:实现拖拽事件的处理,包括拖拽开始、拖拽中、拖拽结束等。

注:本程序使用了 Python3 的语法,如使用 Python2 运行需注意 print 等语法差异。

Python Tkinter 拼图游戏:100 行代码实现闯关

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

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