拼图游戏

python——拼图游戏 利用python,通过将一幅图片分割成若干拼块并将它们顺序随机打乱来编写拼图小游戏,当所有拼块都放回原位置时就完成了拼图(即游戏结束)。 阅读详情

拼图游戏

 

      本文讨论如何判断拼图游戏中图形是否可以还原。

例1:下图是一个3X3的数字拼图。

1

3

2

6

 

5

4

7

8

图1

它要还原成图2

1

2

3

4

5

6

7

8

 

图2

      将问题一般化,在M*N的方格里有M*N-1个不同元素和一个空元素,只有空元素可以与上下左右相邻的元素交换位置。M*N方格中M*N-1个元素和一个空元素的位置确定一个图形。拼图游戏的问题是:一个图形经过一连串的交换能否得到另一个图形,如何得到。从交换方式的可逆性看出这种关系满足等价三性质,如果图形A通过交换变成图形B我们则称它们是等价的。把M*N-1个元素用1至M*N-1编号,空元素编号0。然后展成一个排列。每个图形对应一个排列。确定了展开方式,图形和排列是一一对应的。这里用到的展开方式是行优先的顺序(其他方式展开也能到相应的结果)。将例1的两个图形展开有:图1对应1 3 2 6 0 5 4 7 8,图2对应1 2 3 4 5 6 7 8 0。

      定理1:图形A与图形B等价的充要条件图形A的排列的逆序数加上0元素行号和列号的奇偶性等于图形B的排列的逆序数加上0元素行号和列号的奇偶性。为方便表述,把图形排列的逆序数加上0元素行号和列号的奇偶性称为图形的奇偶性。

      先看定理1如何起作用,图1:展开的排列 1 3 2 6 0 5 4 7 8,它的逆序数为8,0元素行号为2,列号为2。逆序数加行号,列号的奇偶性为偶。图2:展开的排列 1 2 3 4 5 6 7 8 0,它的逆序数为8,0元素行号为3,列号为3。逆序数加行号,列号的奇偶性为偶。两个图形的奇偶性相同,根据定理1判断它们等价。

      首先证明必要性,即如果图形A与图形B等价,则图形A的奇偶性等于图形B奇偶性。

              0元素和某个元素交换位置,则排列的逆序数的奇偶性就改变一次。交换后0元素的行号或者列号会加1或减1,即行号,列号之和的奇偶性也改变一次。这说明拼图的交换方式不改变图形的奇偶性,也说明拼图中至少有两组等价类,奇偶性不同的图形不等价。

      下面证明充分性,如果图形A的奇偶性等于图形B的奇偶性,则图形A,B等价。

      如果证明了拼图只有两组等价类,从必要性的证明过程可知,奇性图形是一组等价类,偶性是一组。从而证明了充分性。

      先考虑一般的排列1 2 3 ... N。某个元素连续与后面M相邻的元素交换位置,称为向后M步移动。如排列:1 2 3 4 5 6。元素2的向后3步移动,排列变成1 3 4 5 2 6。同样的方式定义向前M步移动。如果排列A能够通过有限向前M步移动和向后M步移动变成排列B,称排列A与排列B M步等价。容易看出这也是等价关系。

      引理1:任何一个1至N的排列M步等价于1 2 ... N-M(...)。括号里是N-M+1至N的某个排列。

证明:如果N=M,这显然成立。

假设N=k时成立,下面证明k+1的情况。

1元素的位置记为i

情况1:假设i=1,显然,余下的元素减1,就变成N=k的境况,得证。

情况2:如果1<i<=M,则元素1前面的元素向后M步移动,变为情况1。

情况3:如果i>M,则元素1有限次向前M步移动,使i有1<=i<=M,可变成情况1或2。

从而得证。
当
M=2时,只有两组等价类。由于移动不改变排列的奇偶性,从而奇排列是一组等价类,偶排列是一组等价类。


考虑N*M的拼图。
当
N=M=2,穷举法可证明只有两组等价类。

当N,M不同时为2时,设N不等于2(如果N等于2,M不等于2可颠倒行列讨论)。

只考虑第二行最后一个元素是空元素的情形,因为空元素在其他位置总可以等价某个空元素在第二行最后一个元素的图形。不考虑空元素以之字形方式展开图形,即第一行最后一个数字和第二行倒数第二个数字相连。如:

1

2

4

3

5

 

图3

展开成1,2,4,5,3。

下面证明两行拼图的交换方式可以实现排列的向前2步和向后2步移动。

要实现元素a的向前2步移动,则可顺着展开的方式循环移动拼图,使a在第一行第二列的位置,使空元素在第二行第二列的位置,此时可把元素i可与空元素对换。然后再沿着展开的顺序还原拼图。

例如:图3的元素4向前2步移动。可以如下操作,

2

4

5

1

 

3

图4

2

 

5

1

4

3

图5

4

1

2

3

5

 

图6

展开成4,1,2,5,3。实现了向前2步移动。

使i在第二行第二列的位置,使空元素在第一行第二列的位置可以实现向后2步移动。根据引理1及,两行拼图可以分成两组等价类。

假设M=k图形可以分成两组等价类,下面证明M=k+1,

只需要证明任何M=k+1图形总等价于第一行元素为1 2 ... N的某图形即可。

如果这N个元素都在第一行,把空元素移到第二行,从上面的证明可知,交换两个不同的非空元素,图形的奇偶性改变,属于不同的等价类。N大于2,第二行就有两个非空元素可供交换。所以两行图形可以等价与第一行为1 2 ... N的某个图形。

如果1至N的某个a元素不在第一行,设它在第i行。把空元素移动到i行,这样第i行和第i-1行可以看成M=2的图形。可以把a移动到第i-1行,并保证第i行和i-1行中1至N的元素的行号不增加。有限步移动可以使1至N元素全部在第一行。

显然M=k+1图形的等价类数目为2。

充分性得证。

      拼图游戏的随机离散中加入定理1的判断可以保证游戏有意义,不会出现无解的情况。

python实现图片切割及拼图游戏 python实现图片切割及拼图游戏摘要引言背景意义实现功能图片分割拼图游戏系统结构图片切割拼图游戏实现代码图片分割拼图游戏实验结果程序一程序二实验总结 摘要 本程序分为两个部分,都是由python编写而成的。一是图片切割程序,即传入图片的地址,图片的输入目录,程序会按指定的行列进行切割(采用3行3列,分成9张图片用于第二部分游戏的实现)。二是拼图游戏程序,游戏界面的正上方是一个拼图步数统计,界面左边是两个组件,上方是重新开始按钮,下方是拼图的完整原图作为拼图参考,界面右边是拼图游戏的主体,一个正方形再分成3 阅读详情

相关推荐

Java项目 拼图游戏

拼图游戏内容由若干小图像块组成的,其中有一个空白的小图像块,该图像块是来与别的图像块交换的,以此来实现大图像的拼凑。在Java标准环境下运行,通过鼠标点击图像块上下左右移动,完成大图像的拼凑。通过所创建的窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面,实现游戏登录、开始游戏、退出游戏、选择图片、图片缩放、图片分割、调整难易度、计数计时、打乱图片、判断拼图成功等功能。

qq_70311894的博客 2308

数据结构与算法总结4(个人原创,带详细注释代码)

比如[1,2],如果不加后哨兵,该序列没有输出,如果不加前哨兵,2输出面积后,栈中[1],这时1没有左边界,无法计算其面积换一种思路理解,我们要找每个柱子的左右边界,那么。

weixin_43843498的博客 961

用c#实现拼图游戏

上学期程序是设计实验之二,用c#实现一个拼图游戏 (一)需求:(这个需求书写较为简单) 图片:有图 切割:拼图不是一个图,我们需要把一个整图它切割成N*N的小图 打乱:把这N*N的小图打乱顺序,才能叫拼图qwq 判断:判断拼图是否成功 交互:选择鼠标点击拖动的方式 展示原图:拼不出来可以看看 更换图片:腻了可以从本地选择一张你喜欢的来拼图 选择难度:除了2×2还可以选择切割成3×3或者4×4,...

Cooooooooco的博客 2174

eclipse 控制台 一维数组挑战拼图

拼图游戏 我的想法: 1.我想用一维数组打乱 在3*3二维数组(拼图)中的拿空格上下左右移动就是在一维数组中用该位置与+1,-1,+3,-3; 1,2,3,4,5,6,7,8 1,2,3 ...

zzj147963321的博客 398

python拼图游戏

最近用python写了个自动拼图游戏,内部算法使用的是A*算法。 功能为打开一张图片,选择图片分割的维数和图片空缺的位置,然后自动打乱生成新的图片,然后再恢复。 效果 开始界面 打开图片 打乱图片 主要代码 这是A*算法的代码,主要的就是这个,其他的只是画界面和呈现出来而已。 def run_Axing(): maxcount=10000+m*m*n*n # 1. 把起始格添加...

Czq_0768的博客 3798

Flash 智能拼图游戏设计实践指南

本文还有配套的精品资源,点击获取 简介:本文介绍了如何利用Flash软件设计智能拼图游戏,包括基础概念、设计流程、编程实现、用户交互、优化与测试以及发布与分享的完整步骤。考虑到Flash已逐渐被其他技术取代,本文内容更强调在游戏开发历史中Flash的作用,旨在帮助初学者深入理解Flash在游戏设计方面的潜力,并提升相关技能。 1. Flash动画与游戏设计基础 ...

weixin_29443363的博客 1751

c#拼图游戏

有的小伙伴说,c#不做桌面应用程序,都对不起c#这一门语言。。。 行!加班加点的,咱们也来一个小游戏~ 先看看运行效果~ 还行吧,哈哈哈,技术有限,别碰我奥~ 先说下用到写啥,首先,看到计时没!!!诶,对,第一个就是线程~ 看到左边这些小块没,没错,就是用右边的图切出来的,图片处理是吧,还有,emmm,好多好多,哈哈哈! 咱们先来一波,猜猜我多少时间完成~ 等等,先说下游戏规则,...

XiauHacker的博客 5126

ai 拼图游戏 随机布局 自动恢复

我以前传过一个,不知道是不是有问题,有人反映,今天重传一下,供大家参考

C语言实现拼图游戏

C语言实现拼图游戏 这篇文章主要为大家详细介绍了C语言实现拼图游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下哦~ 1.实现图形界面 一维数组,二维数组,图形库里面的贴图 图形库(画矩形,填充颜色),音乐播放,鼠标操作 2.加载资源 切割技术,用到随机函数,随机产生一维数组下标,然后赋值给二维数组进行初始化。 3.贴图 我这里4行4列的。遍历二维数组进行 贴图。 4.游戏过程 主要是鼠标操作,遇到空白的一块,左右上下都可以交换。 以下代码需要一些资源文件,如果需要请加我qq

无心 5970

C++编写经典2D游戏

有些人喜欢MFC,用它也可以编游戏,但最好还是抛掉部分MFC的东西,使用DirectX吧。因为我主要学的C++,我就只谈C++了,3D的先不谈,2D作为基础还是有必要研究,XML技术不错,现在很流行,WOW、Novashell、POPCAP FRAMEWORK等都使用了。用它来管理游戏资源及资源调度很方便。

广度优先遍历4叉树 3x3拼图游戏还原算法(含验证程序)

广度优先遍历4叉树,可以在3秒以内还原任何九宫格拼图,并附带验证程序 算法经过多次改进,个人认为已经达到了非常优异的性能,有什么好的思路或者疑问,欢迎交流。 具体实现过程是:把当前状态移动一步的下一个状态放入队列,每次从队列中取操作步聚出来验证,如果图没有拼好,则生成下一步的所有状态(最多4种),将它们放入队列 最复杂的情况是 087654321,一共要28步才可以拼好;即任何一个图都可以在28步(含)以内拼好。

Java实现——拼图游戏

完整的实现效果使用Java实现拼图游戏。界面使用的是JFrame实现。

qian__yan的博客 4093

拼图游戏(c++源代码附程序)

内容清单:所有非系统生成的.h文件和.cpp文件,以及程序运行必须的音频及图片,还有一个可以直接运行的最终结果程序 大体思路:建立4个类,分别代表主程序层、逻辑层、视图层、声音层。 假设点击了一次,由逻辑层判断,是否可移动,然后由视图层来执行移动,声音层只管放音乐和音效,主程序层是提供初始化和鼠标点击事件响应的入口。 希望这些东西可以为你们提供好的思路和想法。

asp拼图游戏

 标题:asp拼图游戏 摘要: 这个根据jsp的那个拼图游戏思路改写的一个asp拼图难度: 这个根据jsp的那个拼图游戏思路改写的一个asp拼图,代码如下:排字游戏(拼图游戏)  开始新游戏        action=request.Querystring("action")    ’通过action参数来选择要调用的游戏函数  If action="" Or actio

吕海鹏 in 优快云 Blog 1203

拼图还原算法

纯JavaScript拼图只能还原游戏,也有jQuery实现方法。欢迎补充

C++自动还原魔方代码.zip

C++程序代码,能实现对三阶魔方按魔方还原公式还原魔方,并显示出步骤和结果,DEVC++编译成功,里面附带使用教程,希望对您有帮助。

Java实战---拼图游戏

本文主要介绍了使用Java自己做的一款拼图游戏,对于Java实战中自己做的一款拼图游戏,对于初学者来说没有什么比自己创建一款游戏更有成就感的吧,简单易懂,

gaoqiandr的博客 5133

基于BFQ19S的共射振荡器设计(克拉泼电容三点式)

根据理论,设计出如下LC振荡器: 一、设计初期是使用= 400Mhz作为目标值计算的, 但由于计算值与实际值有差别,所以使用计算值附近的元器件代替使用;最终该电路的L1=82nH , D1 = 5.6pF, C11=18pF, C12 = 18pF ; 另外R3= 600Ω, R4取27k , C9取10pF; 该电路实际的震荡频率为主要为L1,D1 决定,所以其震荡频率约为 == 235Mhz; 二、由于实际得到的频率比目标频率低太多,所以调整电路使其能达到400M左...

rzchong1988的专栏 3705

Java实现简易的拼图游戏

Java实现简易的拼图游戏 介绍:游戏共有五张图片可以选择,分成了4 X 4 十六个方格,点击开始就可以开始游戏。游戏运行的截图如下: 游戏结构: 代码如下: MedleyGame.java类 package game.medleyPicture; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt...

Code__rookie的博客 3154

IPMItool 控制风扇转速

然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。

m0_37970303的博客 5060

大数据与宠物:健康监测数据分析

随着全球宠物市场规模的快速增长(2023年全球宠物产业规模已达3500亿美元),宠物健康管理需求呈现指数级上升。传统宠物医疗依赖定期体检和症状观察,存在滞后性和主观性缺陷。本文聚焦如何通过物联网(IoT)设备采集宠物生理数据(体温、心率、活动量等),利用大数据分析技术构建实时健康监测系统,实现宠物健康状态的动态评估、异常预警和疾病预测。研究范围涵盖数据采集技术、数据预处理方法、机器学习模型构建及实际应用场景落地。背景介绍:明确研究目的、目标读者及核心术语核心概念与联系。

2502_91592937的博客 1067
上一篇: C语言编译全过程
下一篇: 数据区,代码区,堆栈区,操作系统堆栈
NewJerryj
博客等级 码龄19年 196粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值