拼图游戏文档

本文介绍了如何使用Python的SimpleGUI库开发一款经典的3x3拼图游戏,包括游戏规则、操作说明和示例代码,展示了如何移动图像块以完成拼图并记录步数。
摘要由CSDN通过智能技术生成

简介

拼图游戏是一款经典的益智游戏,目标是通过移动图像块的位置,以完成最终的图像拼接。

游戏规则

  1. 游戏开始时,将图像分割为9个相等的小块,并打乱它们的顺序。
  2. 玩家通过点击空白方块旁边的方块来移动它们,只能与空白方块交换位置。
  3. 目标是按照预设的图像排列顺序,将所有小块重新拼接成完整的图像。
  4. 游戏记录玩家完成拼图所需的步数。

游戏界面

  • 游戏界面由一个3x3的方格组成,每个方格代表一个小块。
  • 方格内显示拆分后的图像小块,除了空白方块。
  • 另外,界面上方显示当前玩家的步数。

操作说明

  • 玩家通过鼠标点击空白方块旁边的小块来移动它们。
  • 如果点击的小块与空白方块相邻,它们会交换位置。
  • 玩家可以根据需要,移动小块以达到拼接图像的目标。

游戏结束

当玩家成功将所有小块按照预设的图像排列顺序拼接完成时,游戏结束,并显示玩家完成拼图所用的步数。

示例运行结果

在这里插入图片描述

示例代码

import simpleguitk as simplegui
import random

# 载入外部图像
baymax = simplegui.load_image(
    "https://ts1.cn.mm.bing.net/th/id/R-C.328545e6d37ec2dc1b26375ad71ded93?rik=PHMjbFkZWBKT4g&riu")
# 定义常量
# 画布的尺寸
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):
        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)
    # 填充拼图板
    for i in range(ROWS):
        for j in range(COLS):
            idx = i * ROWS + j
            square_center = all_coordinates[idx]
            if square_center is None:
                board[i][j] = None
            else:
                board[i][j] = Square(square_center)


# 重置游戏
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 r < 3 and c < 3:  # 点击位置在拼图板内才移动图片
        if board[r][c] is None:  # 点到空位置上什么也不移动
            return
        else:
            # 依次检查当前图像块的上,下,左,右是否有空位置,如果有就移动当前图像块
            # 步骤3 代码写在这里
            current_square = board[r][c]
            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


# 创建框架
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()

frame.start()

三连:点赞、转发、订阅 🌟

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

力江

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值