当前位置: 首页 > news >正文

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=

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络实时安全:构筑数字时代的铜墙铁壁
  • 【Java运算符——详解 ➕ 案例练习题】
  • C#结合JS实现HtmlTable动态添加行并保存到数据库
  • SpringBoot基于函数替换的热重载
  • SpringMVC流程
  • 探索SPI单线传输模式中时钟线与数据传输的简化
  • 如何识别和使用GRS证书
  • Mac JDK和SDK环境变量配置
  • aws sqs基础概念和队列参数解析
  • WAF绕过(下)
  • 算法课程笔记——矩阵乘法整除同余LCMGCD
  • uniapp 对接 微信App/支付宝App 支付
  • java继承使用细节二
  • Java进阶学习笔记15——接口概述
  • 强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长
  • hexo+github搭建个人博客
  • 【5+】跨webview多页面 触发事件(二)
  • 30天自制操作系统-2
  • 345-反转字符串中的元音字母
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Django 博客开发教程 8 - 博客文章详情页
  • HashMap剖析之内部结构
  • httpie使用详解
  • Java程序员幽默爆笑锦集
  • React系列之 Redux 架构模式
  • React中的“虫洞”——Context
  • SQLServer之创建数据库快照
  • Vue.js源码(2):初探List Rendering
  • windows下如何用phpstorm同步测试服务器
  • 第2章 网络文档
  • 动态魔术使用DBMS_SQL
  • 浮现式设计
  • 关于Java中分层中遇到的一些问题
  • 利用DataURL技术在网页上显示图片
  • 前端路由实现-history
  • 深入浏览器事件循环的本质
  • 事件委托的小应用
  • 手写一个CommonJS打包工具(一)
  • 说说动画卡顿的解决方案
  • MPAndroidChart 教程:Y轴 YAxis
  • postgresql行列转换函数
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (solr系列:一)使用tomcat部署solr服务
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)Linux Shell编程——输入输出重定向
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • .gitignore文件使用
  • .htaccess配置常用技巧
  • .NET 2.0中新增的一些TryGet,TryParse等方法