当前位置:首页>python>Python第六周拼图游戏.

Python第六周拼图游戏.

  • 2026-09-08 16:05:36
Python第六周拼图游戏.

import simpleguitk as simplegui
import random

# 载入外部图像
baymax = simplegui.load_image("http://mooc.xjau.edu.cn:80/asset-v1:XJAU_CS+CS001+2019_T1+type@asset+block@baymax.jpg")

# 定义常量
# 画布的尺寸
WIDTH = 600
HEIGHT = WIDTH + 100

# 图像块的边长
IMAGE_SIZE = WIDTH / 3

# 图像块坐标列表
all_coordinates = [[IMAGE_SIZE * 0.5, IMAGE_SIZE * 0.5], [IMAGE_SIZE * 1.5, IMAGE_SIZE * 0.5],
                   [IMAGE_SIZE * 2.5, IMAGE_SIZE * 0.5], [IMAGE_SIZE * 0.5, IMAGE_SIZE * 1.5],
                   [IMAGE_SIZE * 1.5, IMAGE_SIZE * 1.5], [IMAGE_SIZE * 2.5, IMAGE_SIZE * 1.5],
                   [IMAGE_SIZE * 0.5, IMAGE_SIZE * 2.5], [IMAGE_SIZE * 1.5, IMAGE_SIZE * 2.5], None]

# 棋盘行列数
ROWS = 3
COLS = 3

# 移动步数
steps = 0

# 保存所有图像块的列表
board = [[None, None, None],
         [None, None, None],
         [None, None, None]]

# 图像块类
class Square:
    def __init__(self, coordinate):
        self.center = coordinate

    def draw(self, canvas, board_pos):
        # 步骤1:绘制图像块
        # board_pos是(row, col),注意交换顺序因为draw_image接受中心坐标
        canvas.draw_image(baymax,
                          self.center,          # 图像在大图中的源位置
                          [IMAGE_SIZE, IMAGE_SIZE], # 图像大小
                          [(board_pos[1] + 0.5) * IMAGE_SIZE, (board_pos[0] + 0.5) * IMAGE_SIZE],
                          [IMAGE_SIZE, IMAGE_SIZE])

# 初始化拼图板
def init_board():
    # 打乱图像块坐标
    random.shuffle(all_coordinates)
    # 填充拼图板
    idx = 0
    for i in range(ROWS):
        for j in range(COLS):
            square_center = all_coordinates[idx]
            if square_center is None:
                board[i][j] = None
            else:
                board[i][j] = Square(square_center)
            idx += 1

# 重置游戏
def play_game():
    global steps
    steps = 0
    init_board()

# 绘制游戏界面各元素
def draw(canvas):
    # 画黑框背景
    canvas.draw_polygon([[0, 0], [WIDTH, 0], [WIDTH, WIDTH], [0, WIDTH]], 1, 'Black')

    # 画目标图像 (右下角的小图)
    canvas.draw_image(baymax, [WIDTH / 2, WIDTH / 2], [WIDTH, WIDTH], [50, WIDTH + 50], [98, 98])

    # 画步数
    canvas.draw_text("步数:" + str(steps), [400, 680], 22, "White")

    # 步骤2:画图像块
    for i in range(ROWS):
        for j in range(COLS):
            if board[i][j] is not None:
                board[i][j].draw(canvas, (i, j))

# 鼠标点击处理
def mouseclick(pos):
    global steps
    # 将点击位置换算成拼图板上的坐标 (行, 列)
    r = int(pos[1] // IMAGE_SIZE)
    c = int(pos[0] // IMAGE_SIZE)

    # 检查是否在棋盘范围内
    if 0 <= r < 3 and 0 <= c < 3:
        # 如果点击空白位置,直接返回
        if board[r][c] is None:
            return
       
        # 记录当前点击的方块
        current_square = board[r][c]
        moved = False # 标记是否发生了移动

        # 步骤3:移动逻辑 (修正前的逻辑会导致来回抖动,现在修正为只移动一次)
        # 检查上方
        if r - 1 >= 0 and board[r - 1][c] is None:
            board[r][c] = None
            board[r - 1][c] = current_square
            steps += 1
        # 检查右侧
        elif c + 1 <= 2 and board[r][c + 1] is None:
            board[r][c] = None
            board[r][c + 1] = current_square
            steps += 1
        # 检查下方
        elif r + 1 <= 2 and board[r + 1][c] is None:
            board[r][c] = None
            board[r + 1][c] = current_square
            steps += 1
        # 检查左侧
        elif c - 1 >= 0 and board[r][c - 1] is None:
            board[r][c] = None
            board[r][c - 1] = current_square
            steps += 1

# 创建框架
frame = simplegui.create_frame("大白拼图", WIDTH, HEIGHT)
frame.set_canvas_background("Black")
frame.set_draw_handler(draw)
frame.add_button("重新开始", play_game, 60)

# 注册鼠标事件
frame.set_mouseclick_handler(mouseclick)

# 初始化游戏
play_game()

# 启动框架 (注意:这里不要写两次 start(),会报错)
frame.start()

因为推文是手机上完成的所以直接复制粘贴格式会报错。若有需要可以私信我发你

最新文章

随机文章