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#毕设项目经验,能够为学生提供各类…

Django 里的app概念

在 vs code 里的 Terminal 里运行下面的命令来创建一个项目文件夹 django-admin startproject [新项目名称]进入到刚刚创建的新项目的文件夹,在 urls.py 文件里进行修改 """ URL configuration for mywebsite project.The urlpatterns list routes…

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

前端基础入门三大核心之HTML篇:深入解读div标签与HTML5的现代魅力

前端基础入门三大核心之HTML篇:深入解读div标签与HTML5的现代魅力 一、div标签:布局中的万金油1.1 div标签基本概念1.2 div标签的使用1.3 实践技巧 二、HTML5:重塑网页结构的新篇章2.1 HTML5简介2.2 语义化标签2.3 多媒体支持2.4 Canvas绘图 …

Python代码注释的艺术与智慧

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

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

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

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

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

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

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

批量修改数组的属性

首先,有这个对象 let a {id: 1,name: 张三,age: 18,sex: 0 } 需求:同时修改name,id,并添加一个新属性c 常规写法: a.id 2; a.name 李四; a.c 1; 但这种写法遇到批量就会很麻烦 解决方法: 方法1: 使用Object.as…

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

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

解决“unknown shorthand flag: ‘d‘ in -d‘”错误

前言 在使用Docker Compose部署应用时,你可能遇到过一条令人困惑的错误信息:“unknown shorthand flag: ‘d’ in -d”。这通常发生在尝试以守护进程模式启动容器时,而使用的命令格式与你的Docker版本不兼容。本文旨在深入解析这一问题根源&…

需求分析简介

为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件,不论人们把设计和编码工作做得如何出色,不能真正满足用户需求的程序只会令用户失望,给开发者带来烦恼。 …

Sql Server 调用接口

首先创建一个通用请求接口的存储过程 create PROCEDURE [GetHttpResponse]url NVARCHAR(MAX), -- 请求地址jsonBody NVARCHAR(MAX), -- 请求BodystatusCode INT OUTPUT, -- 状态responseText NVARCHAR(MAX) OUTPUT -- 返回响应数据 AS BEGINBEGIN TRY-- 创建一个…

29.修改idea中git的提交记录上的提交名

步骤如下 : (1)打开您的IDEA,点击打开最下方的Terminal终端 (2)输入以下命令,并回车执行 2.1查看当前git的用户名命令: git config user.name 2.2更改用户名,在双引号…

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

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

Atlas 血缘分析-hive/spark

Apache Atlas部署安装 这里需要注意,需要从官网下载Atlas的源码,不要从git上分支去checkout,因为从分支checkout出来的代码,无法正常运行,这里小编使用针对Atlas-2.3.0源码进行编译. mvn clean -DskipTests package -Pdist部署前置条件 Elastic7.xHBase2.xKafla-2.xzook…

【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 &…