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=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/642468.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小米财报:业绩远超预期,汽车推着手机跑!

随着一季度财报陆续出炉,企业间的分化越来越明显。 新环境下,很多公司都陷入停滞时,去讨论“掉队”已经没有多少意义,现在真正值得我们关注的,是那些在逆风情况下,还能“领先”的企业。毫无疑问&#xff0…

9.js函数

函数是js复杂数据类型的一种---可以理解为存放代码的盒子 用来帮助我们封装、复用、扩展以及调用代码的工具 函数的两个阶段 (1)声明函数(理解为创造) ——声明式声明 语法:function 函数名(参数){...代码} ——赋值时…

算法:二分查找题目练习

目录 题目一:二分查找 朴素的二分模版 题目二:在排序数组中查找元素的第⼀个和最后⼀个位置 查找区间左端点 查找区间右端点 查找区间左端点二分模版 查找区间右端点二分模版 题目三:搜索插⼊位置 题目四:x的平方根 题目…

unity开发Hololens,使用unity自带的UGUI

hololens 使用UGUI 新建画布,添加组件, 画布模式改成WorldSpace,这样在能在3D场景里 随意的移动位置, 添加NearIteractionTouchaBleUnityUI、CanvasUtility组件 EaventsToReceive改成Pointer, 这样,UGUI的…

Sass是什么?有哪些优缺点?

目录 一、Sass是什么? 二、Sass的优缺点 三、Sass与SaaS 一、Sass是什么? Sass是世界上最成熟、最稳定、最强大的专业级CSS扩展语言。 Sass makes CSS fun again. Sass is an extension of CSS, adding nested rules, variables, mixins, selector in…

基于hive的酒店价格数据可视化分析系统设计和实现

摘要 本文基于Django框架和Hive技术,设计和实现了一种酒店价格数据可视化分析系 统,旨在为酒店管理者提供直观、清晰的数据洞察和决策支持。在研究中,首先深入分 析了酒店价格数据可视化分析系统的背景和意义,认识到对于酒店行…

电商项目之有趣的支付签名算法

文章目录 1 问题背景2 思路3 代码实现 1 问题背景 在发起支付的时候,一般都需要对发送的请求参数进行加密或者签名,下文简称这个过程为“签名”。行业内比较普遍的签发算法有: (1)按支付渠道给定的字段排序进行拼接&am…

一篇文章讲透排序算法之希尔排序

希尔排序是对插入排序的优化,如果你不了解插入排序的话,可以先阅读这篇文章:插入排序 目录 1.插入排序的问题 2.希尔排序的思路 3.希尔排序的实现 4.希尔排序的优化 5.希尔排序的时间复杂度 1.插入排序的问题 如果用插入排序对一个逆序…

改进rust代码的35种具体方法-类型(十八)-不要惊慌

上一篇文章 它看起来非常复杂,这就是为什么它贴合的塑料盖上用大号友好字母印上“不要恐慌”的原因之一。——道格拉斯亚当斯 此项目的标题将更准确地描述为更喜欢返回Result而不是使用panic!(但不要惊慌更吸引人)。 Rust的panic机制主要是为…

Mycat+Mysql搭建数据集群实现数据分片存储

前言 MyCAT介绍 * 一个彻底开源的,面向企业应用开发的“大数据库集群”; * 支持事务、ACID、可以替代MySQL的加强版数据库; * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群; * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL; * 一个新颖…

Linux_应用篇(08) 信号-基础

本章将讨论信号,虽然信号的基本概念比较简单,但是其所涉及到的细节内容比较多,所以本章篇幅也会相对比较长。 事实上,在很多应用程序当中,都会存在处理异步事件这种需求,而信号提供了一种处理异步事件的方法…

DNS的服务与部署(2)

1、dns的安装及开启 dnf install bind.x86_64 -y #安装 #Berkeley Internet Name Domain (BIND) systemctl enable --now named #启用dns服务,服务名称叫named firewall-cmd --permanent --add-servicedns #火墙设置 firewall-cmd --reload …

重学java 39.多线程 — 线程安全

逐渐成为一个情绪稳定且安静成长的人 ——24.5.24 线程安全 什么时候发生? 当多个线程访问同一个资源时,导致了数据有问题,出现并发问题,数据不能及时更新,导致数据发生错误,出现线程安全问题 多线程安全问…

【C++项目】实时聊天的在线匹配五子棋对战游戏

目录 项目介绍 开发环境 核心技术 项目前置知识点介绍 Websocketpp 1. WebSocket基本认识 2. WebSocket协议切换原理解析 3. WebSocket报文格式 4. Websocketpp介绍 5. 搭建一个简单WebSocket服务器 JsonCpp 1. Json格式的基本认识 2. JsonCpp介绍 3. 序列化与反序…

DatePicker日期选择框(antd-design组件库)简单使用

1.DatePicker日期选择框 输入或选择日期的控件。 2.何时使用 当用户需要输入一个日期,可以点击标准输入框,弹出日期面板进行选择。 组件代码来自: 日期选择框 DatePicker - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-demo:…

C#应用的用户配置窗体方案 - 开源研究系列文章

这次继续整理以前的代码。本着软件模块化的原理,这次笔者对软件中的用户配置窗体进行剥离出来,单独的放在一个Dll类库里进行操作,这样在其它应用程序里也能够快速的复用该类库,达到了快速开发软件的效果。 笔者其它模块化应用的例…

基于Python对评论进行情感分析可视化

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在当今数字化时代,用户生成内容(UGC)如在线评论、社交媒体…

力扣HOT100 - 75. 颜色分类

解题思路&#xff1a; 单指针&#xff0c;对数组进行两次遍历。 class Solution {public void sortColors(int[] nums) {int p 0;int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {int tmp nums[i];nums[i] nums[p];nums[p] tmp;p;}}for (int i p; i …

面试八股之JVM篇3.5——垃圾回收——G1垃圾回收器

&#x1f308;hello&#xff0c;你好鸭&#xff0c;我是Ethan&#xff0c;一名不断学习的码农&#xff0c;很高兴你能来阅读。 ✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。 &#x1f3c3;人生之义&#xff0c;在于追求&#xff0c;不在成败&#xff0c;勤通…

D - AtCoder Wallpaper(abc)

思路&#xff1a;f(c, d) f(a, b) - f(a, d) - f(c, b) 代码&#xff1a; int f(int x, int y){if(y % 2 0){y y / 2;int ans y * (x / 4) * 8;x % 4;if(x 1){ans y * 3;}else if(x 2){ans y * 6;}else if(x 3){ans y * 7;}return ans;}else{y / 2;int ans y * (x…