Python 拼图游戏

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

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

🐛图片分割

将原图分割成 piece1~9

from PIL import Imagedef split_image(image_path):img = Image.open(image_path)width, height = img.sizepiece_width = width // 3piece_height = height // 3count = 1for 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 += 1if __name__ == '__main__':split_image('test.jpg')

🐛图片乱拼

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

from PIL import Image
import randomdef split_image(image_path):img = Image.open(image_path)width, height = img.sizepiece_width = width // 3piece_height = height // 3count = 1pieces = []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 = 0for i in range(3):for j in range(3):new_img.paste(pieces[count], (j * piece_width, i * piece_height))count += 1new_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 = Nonescreen.fill((0, 0, 0))# 绘制拼图部分for i, piece in enumerate(pieces):x = (i % COLS) * TILE_SIZEy = (i // COLS) * TILE_SIZEscreen.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 = Nonescreen.fill((0, 0, 0))# 绘制拼图部分for i, piece in enumerate(pieces):x = (i % COLS) * TILE_SIZEy = (i // COLS) * TILE_SIZEscreen.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=

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea使用鼠标滚轮进行字体大小缩放

idea使用鼠标滚轮进行字体大小缩放 使用快捷键CtrlAltS进入到设置页面 在左上角搜索框输入“increase”,在左侧的Keymap中右击“Increase Fort Size”,点击“add mouse shortcut”,然后录入我们要设置的快捷键,比如我是点击ctrl鼠…

基于SpringBoot+Vue+Mysql的实验室低值易耗品管理系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

AtCoder Beginner Contest 354 (ABCDEFG题)视频讲解

2024年5月19日补充G题。 A - Exponential Plant Problem Statement Takahashi is growing a plant. Its height at the time of germination is 0 c m 0\,\mathrm{cm} 0cm. Considering the day of germination as day 0 0 0, its height increases by 2 i c m 2^i\,\mat…

看一遍就理解:MVCC原理详解

介绍 MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于实现数据库并发访问控制的机制。它允许多个用户同时读写同一数据项,从而提高了数据库在高并发环境下的性能和响应速度。以下是具体介绍: 基本…

Python代码注释的艺术与智慧

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:注释的必要性 二、注释的误区:不是越多越好 过度注释的问题…

服务器端口号怎么看?如何查看服务器端口号呢?有哪些需要注意的?

简单来说,端口号就是计算机与外界通讯交流的出口,每个端口都有不同的编号,也就是“端口号”。它们是唯一的,用于标识不同的服务和应用程序。通过端口号,我们可以知道哪些服务正在运行,以及如何与它们进行通…

【Linux系统编程】进程概念、进程排队、进程标识符、进程状态

目录 什么是进程? 浅谈进程排队 简述进程属性 进程属性之进程标识符 进程操作之进程创建 初识fork fork返回值 原理角度理解fork fork的应用 进程属性之进程状态 再谈进程排队 进程状态 运行状态 阻塞状态 挂起状态 Linux下的进程状态 “R”(运行状…

洗地机哪个牌子最好用?2024洗地机排行榜

随着人们生活水平的提升,智能清洁家电已经成为日常生活中的必需品。如今的清洁家电市场上,洗地机、吸尘器和扫地机器人等设备各有其独特的功能和优势。洗地机结合了扫、拖、吸和自清洁等多种功能,不仅可以处理干湿垃圾,还能高效清…

工业路由器在新能源数字化中的应用:重塑能源行业的未来

随着全球对可再生能源和能源效率的追求日益加强,新能源数字化已成为推动行业发展的关键因素。在这一变革的浪潮中,工业路由器以其卓越的性能和独特的功能,成为新能源数字化不可或缺的核心组件。本文将深入探讨工业路由器在新能源数字化中的应…

使用Golang开发一个用于批量删除文件的命令行程序

核心代码 package cmdimport ("fmt""zdpgo_cobra""zdpgo_file" )func init() {rootCmd.AddCommand(deleteFileCmd)deleteFileCmd.Flags().StringVarP(&dirPath, "dir", "d", ".", "指定要删除的目录&qu…

【C语言】整型提升与char取值范围

整型提升介绍 C语言中整型算术运算总是至少以缺省(默认)整型类型的精度来进行的。为了获得这个精度,表达式中字符、短整型操作数在使用前被转换为普通整型。而这个过程是悄悄发生的。 整型提升的意义: 表达式的整型运算要在CPU…

C++ wasm 使用教程

环境搭建 git clone https://github.com/emscripten-core/emsdk.gitgit pull./emsdk install latest./emsdk activate latestsource ./emsdk_env.sh./emcc -v && ./emcc c11__Thread_local.c -s WASM_WORKERS --threadprofiler --memoryprofiler -v -o test.html &…

Sentinel的授权规则详解

文章目录 1、授权规则1.1、基本规则1.2、如何获取origin1.3、给网关添加请求头1.4、配置授权规则 2、自定义异常结果2.1、异常类型2.2、自定义异常处理 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学…

深度学习中的优化算法一(Pytorch 18)

一 优化和深度学习 优化算法 使我们能够 继续更新模型参数, 并使损失函数的值最小化。这就像在训练集上评估一样。事实上,任何满足于将优化视为黑盒装置,以在简 单的设置中最小化目标函数的人,都可能会知道存在着一系列此类“咒…

STM32 学习——2. PWM

这个项目将会不断改变pwm占空比,使用proteus示波器进行观察。 1. proteus8.15 原理图 2. cubemx 上图是配置外部晶振 上图配置在proteus中没啥作用,注意: 在实际开发板中,一定要配置它,不然下一次你写不进代码。 上图配…

番外篇 | YOLOv5-SPD:用最简单的方式完成低分辨率图像和小目标检测升级

前言:Hello大家好,我是小哥谈。论文提出了一个新的CNN构建模块称为SPD-Conv,用来替换每个步长卷转层和每个池化层(从而完全消除它们)。SPD-Conv由一个空间到深度(SPD)层和一个非步长卷积(Conv)层组成。本文详细介绍了如何在YOLOv5中引入SPD-Conv,助力助力低分辨率与小…

自用网站合集

总览 线上工具-图片压缩 TinyPNG线上工具-url参数解析 线上工具-MOV转GIF UI-Vant微信小程序版本其他-敏捷开发工具 Leangoo领歌 工具 线上工具-图片压缩 TinyPNG 不能超过5m,别的没啥缺点 线上工具-url参数解析 我基本上只用url参数解析一些常用的操作在线…

“等保测评与安全运维的协同:保障企业网络安宁

"等保测评与安全运维的协同:保障企业网络安宁"是一个涉及信息安全领域的重要话题。这里,我们可以从几个方面来探讨这个主题。 1. 等保测评(等级保护测评) 等保测评,即信息安全等级保护测评,是依…

[DDR5 Jedec 3]DDR5 SDRAM 状态图 和 基本功能

3000字, 依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 3.1 简化状态图 来源: Jedec Proposed DDR5 Full spec 缩写功能ACT激活PRE预充电PRE_A全部预充电MRS寄存器集模式REF刷新TEN边界扫描模式ReadRD, RDS4, RDS8Read ARDA, RDS4A, RDS8AwriteWR, WRS4…

Ollama:一个在本地部署、运行大型语言模型的工具

Ollama:一个在本地部署、运行大型语言模型的工具 Ollama部署、运行大型语言模型概述安装配置Ollama命令模型库使用示例自定义模型从GGUF导入自定义提示从PyTorch或Safetensors导入 开启服务REST API卸载Ollama One-API概述One-API管理本地模型 Open WebUI概述Docker…