Python Tkinter 拼图游戏:100 行代码实现闯关
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 等语法差异。
原文地址: http://www.cveoy.top/t/topic/nYx9 著作权归作者所有。请勿转载和采集!