Python 拼图游戏

拼图游戏(puzzle)是一种常见的益智游戏,玩家通过拖动图块来正确拼接成完整的图片。

由一张原图,分割成图块,拼图块的大小将会根据行列数自动调整,然后随机打乱,玩家通过拖拽图块,最后复原原图。

🐛图片分割

将原图分割成 piece1~9

from PIL import Image

def split_image(image_path):
    img = Image.open(image_path)
    width, height = img.size
    piece_width = width // 3
    piece_height = height // 3

    count = 1
    for i in range(3):
        for j in range(3):
            box = (j * piece_width, i * piece_height, (j + 1) * piece_width, (i + 1) * piece_height)
            piece = img.crop(box)
            piece.save(f'piece{count}.png')
            count += 1

if __name__ == '__main__':
    split_image('test.jpg')

🐛图片乱拼

将分割的图片乱拼起来,合成一张新的图

from PIL import Image
import random


def split_image(image_path):
    img = Image.open(image_path)
    width, height = img.size
    piece_width = width // 3
    piece_height = height // 3

    count = 1
    pieces = []
    for i in range(3):
        for j in range(3):
            box = (j * piece_width, i * piece_height, (j + 1) * piece_width, (i + 1) * piece_height)
            piece = img.crop(box)
            pieces.append(piece)

    random.shuffle(pieces)

    new_img = Image.new('RGB', (width, height))
    count = 0
    for i in range(3):
        for j in range(3):
            new_img.paste(pieces[count], (j * piece_width, i * piece_height))
            count += 1

    new_img.save('new_image.jpg')


if __name__ == '__main__':
    split_image('test.jpg')

new_image.jpg

🐛九宫格拼图

# 拖拽拼图
import pygame
import random
import sys

# 设置屏幕尺寸和信息框高度
WINDOW_WIDTH, WINDOW_HEIGHT = 600, 640
WIDTH, HEIGHT = 600, 600
INFO_BOX_HEIGHT = 40
TILE_SIZE = 200  # 每个拼图块的大小
ROWS, COLS = 3, 3  # 拼图的行数和列数

# 随机打乱拼图
def shuffle_image(image):
    pieces = [image.subsurface((x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE))
              for y in range(ROWS) for x in range(COLS)]
    pieces = random.sample(pieces, len(pieces))
    return pieces

# 主函数
def main():
    pygame.init()
    screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("Sliding Puzzle Game")

    clock = pygame.time.Clock()
    start_time = pygame.time.get_ticks()  # 记录开始时间
    finished = False
    #game_over = False  # 游戏结束标志

    #original_image = pygame.image.load("new_image.jpg")
    original_image = pygame.image.load("test.jpg")
    original_image = pygame.transform.scale(original_image, (WIDTH, HEIGHT))

    pieces = shuffle_image(original_image)
    empty_tile = len(pieces) - 1  # 空白拼图块的索引
    selected_tile = None  # 当前选中的拼图块索引
    #drag_offset = (0, 0)  # 拖拽时的偏移量

    while not finished:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    x, y = pygame.mouse.get_pos()
                    selected_tile = (y // TILE_SIZE) * COLS + (x // TILE_SIZE)
                    #if selected_tile != empty_tile:
                        #drag_offset = (x - (selected_tile % COLS) * TILE_SIZE, y - (selected_tile // COLS) * TILE_SIZE)

            if event.type == pygame.MOUSEBUTTONUP:
                if event.button == 1 and selected_tile is not None:
                    x, y = pygame.mouse.get_pos()
                    target_tile = (y // TILE_SIZE) * COLS + (x // TILE_SIZE)
                    if target_tile != empty_tile and target_tile != selected_tile:
                        pieces[selected_tile], pieces[target_tile] = pieces[target_tile], pieces[selected_tile]
                        selected_tile = None

        screen.fill((0, 0, 0))

        # 绘制拼图部分
        for i, piece in enumerate(pieces):
            x = (i % COLS) * TILE_SIZE
            y = (i // COLS) * TILE_SIZE
            screen.blit(piece, (x, y))

        # 绘制信息框
        pygame.draw.rect(screen, (255, 255, 224), (0, WINDOW_HEIGHT - INFO_BOX_HEIGHT, WINDOW_WIDTH, INFO_BOX_HEIGHT))

        # 绘制计时信息
        current_time = (pygame.time.get_ticks() - start_time) // 1000  # 计算当前用时(秒)
        font = pygame.font.Font(None, 24)
        time_text = font.render("Time: {} seconds".format(current_time), True, (60, 179, 113))
        screen.blit(time_text, (10, WINDOW_HEIGHT - INFO_BOX_HEIGHT + 10))

        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()

在这里插入图片描述
在这里插入图片描述

🐛拼图小游戏

行列数更大,图块分得更小,难度更大

"""
description: 拼图小游戏(拖拽拼图)@2024-05-25
written by yjan.10:16
remark:
  - 原图: test.jpg
"""
import pygame
import random
import sys

# 基本设置
WINDOW_WIDTH, WINDOW_HEIGHT = 600, 640 # 设置屏幕尺寸
WIDTH, HEIGHT = 600, 600 # 拼图区域大小
INFO_BOX_HEIGHT = 40 # 信息框高度
#TILE_SIZE = 100  # 每个拼图块的大小
#ROWS, COLS = 6, 6  # 拼图的行数和列数
ROWS, COLS = 6, 6  # 拼图的行数和列数
TILE_SIZE = WIDTH // COLS # 图块的大小

# 随机打乱拼图
def shuffle_image(image):
    pieces = [image.subsurface((x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE))
              for y in range(ROWS) for x in range(COLS)]
    pieces = random.sample(pieces, len(pieces))
    return pieces

# 主函数
def main():
    pygame.init()
    screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("Sliding Puzzle Game")

    clock = pygame.time.Clock()
    start_time = pygame.time.get_ticks()  # 记录开始时间
    finished = False
    #game_over = False  # 游戏结束标志

    #original_image = pygame.image.load("new_image.jpg")
    original_image = pygame.image.load("test.jpg")
    original_image = pygame.transform.scale(original_image, (WIDTH, HEIGHT))

    pieces = shuffle_image(original_image)
    empty_tile = len(pieces) - 1  # 空白拼图块的索引
    selected_tile = None  # 当前选中的拼图块索引
    #drag_offset = (0, 0)  # 拖拽时的偏移量

    while not finished:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    x, y = pygame.mouse.get_pos()
                    selected_tile = (y // TILE_SIZE) * COLS + (x // TILE_SIZE)
                    #if selected_tile != empty_tile:
                        #drag_offset = (x - (selected_tile % COLS) * TILE_SIZE, y - (selected_tile // COLS) * TILE_SIZE)

            if event.type == pygame.MOUSEBUTTONUP:
                if event.button == 1 and selected_tile is not None:
                    x, y = pygame.mouse.get_pos()
                    target_tile = (y // TILE_SIZE) * COLS + (x // TILE_SIZE)
                    if target_tile != empty_tile and target_tile != selected_tile:
                        pieces[selected_tile], pieces[target_tile] = pieces[target_tile], pieces[selected_tile]
                        selected_tile = None

        screen.fill((0, 0, 0))

        # 绘制拼图部分
        for i, piece in enumerate(pieces):
            x = (i % COLS) * TILE_SIZE
            y = (i // COLS) * TILE_SIZE
            screen.blit(piece, (x, y))

        # 绘制信息框
        pygame.draw.rect(screen, (255, 255, 224), (0, WINDOW_HEIGHT - INFO_BOX_HEIGHT, WINDOW_WIDTH, INFO_BOX_HEIGHT))

        # 绘制计时信息
        current_time = (pygame.time.get_ticks() - start_time) // 1000  # 计算当前用时(秒)
        font = pygame.font.Font(None, 24)
        time_text = font.render("Time: {} seconds".format(current_time), True, (60, 179, 113))
        screen.blit(time_text, (10, WINDOW_HEIGHT - INFO_BOX_HEIGHT + 10))

        pygame.display.flip()
        clock.tick(60)

if __name__ == "__main__":
    main()

在这里插入图片描述

🐛(‧‧)nnn=
### 回答1: Python是一个先进的编程语言,拥有强大的功能和广泛的应用范围。在这其中,Python拼图游戏算是一个比较常见的应用。拼图游戏是一种经典的娱乐方式,它的难度和挑战性非常高。使用Python可以轻松地实现一个拼图游戏,让用户可以享受到高质量、高度定制化的拼图体验。 使用Python来实现拼图游戏,首先需要明确游戏规则和玩家界面。玩家可以通过拖动和旋转拼图块来完成游戏。Python可以通过图形化界面库,如Tkinter、PyQt等来创建游戏界面。同时,Python还具有大量的算法和数学库,如numpy、scipy等,可以用于实现拼图的逻辑运算和难度控制,提升游戏的可玩性和挑战性。 此外,Python还可以在游戏中加入一些其他的功能,比如计时器、步数限制、难度等级、多样化的拼图形式等等,来增加游戏的趣味性和挑战性,让玩家不断尝试和挑战自己的极限。总之,Python拼图游戏是一种非常有趣和有挑战性的游戏,它的实现方法简单易懂,而且代码量不大,可以很快地让玩家体验到高质量的拼图游戏乐趣。 ### 回答2: Python拼图游戏可以是一个很有趣的项目,这个游戏目的是将一幅图像分成多个碎片,然后通过重新排列碎片还原原图像。这需要用到一些基础的编程知识,比如图像处理和GUI编程。 要开始这个项目,首先需要导入Python图形库,如pygame或Tkinter,并创建一个GUI窗口。接着,可以使用Python图像库(如Pillow)将原始图像加载到程序中,然后将它分割成若干个碎片。 一些Python库,如numpy和random,可以被用来随机排列图片碎片,使得用户可以通过点击和拖动无序的碎片来还原图像。如果用户完成了任务,可以使拼图解锁某些奖励(如一个隐藏关卡或一幅新的图像)以鼓励玩家。 为了增加游戏的趣味性和挑战性,可以考虑增加游戏难度,比如增加碎片数量或减少碎片大小,使得玩家需要投入更多的精力和耐心来完成任务。 总之,Python拼图游戏是一个有趣的项目,需要用到一些编程基础知识,但可以通过不断的尝试和练习来提高编程能力。 ### 回答3: Python拼图游戏是一款使用Python语言编写的益智游戏,玩家需要通过调换不同图片的位置,来恢复一张完整的图片。这款游戏操作简单,但需要一定的思维能力和耐心。 在游戏中,玩家可以自由选择不同难度等级的拼图,从简单的3×3的拼图开始,到最复杂的9×9的拼图。每个难度等级的图片都是从某一主题中选择的。 为了保证游戏的趣味性,程序会随机打乱图片的顺序。玩家可通过鼠标点击来调整不同图片的位置,当所有图片的位置都调整正确,即形成一张完整的图片时,游戏就会提示玩家拼图成功。 Python拼图游戏的开发不仅提高了玩家的动手能力和思维能力,也锻炼了程序员的编程技能和团队协作能力。同时,由于Python语言简单易懂,该游戏的代码逻辑也十分清晰,对于学习Python编程的初学者来说,也是一款很好的练手项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

镜花照无眠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值