拼图游戏(数码还原游戏)的实现

一、游戏规则

首先,这里的拼图游戏是滑块拼图,类似于华容道,游戏者通过移动拼图块将拼图还原为初始形状。关于拼图,常见的有3x3,4x4,多的以至于有16x16不等。一般块数越多拼图越复杂。

这里对游戏规则进行较严格的定义: 
1. 游戏初始化时,将图形分为nxn个正方形块,随机摆放在原图形位置。一般以原图形右下角的一块为空白块,已进行移动。这里初始化时,也令新图形的右下角为空。 
2. 游戏中,拼图的移动只能向空白块移动。从移动方向来说,有两种情况,分别是横移与纵移。 
3. 游戏的胜利条件是将打乱的图形恢复原位置。

二、拼图的可还原性

以下论述为了简便,以数字代表拼图的原始顺序。下图为3x3拼图的正确结果:

1 2 3
4 5 6
7 8  

1.不可能还原的拼图情况

从上图可以看到,虽然看上去只要交换14和15便能胜利,但实际上并不能做到,因此是一种不可能还原的拼图。事实上,若拼图是随机打乱的,理论上只有1/2的可能性能被还原。以3x3拼图为例,可以通过移动归结为以下两类: 
A类:可还原拼图

1 2 3
4 5 6
7 8  

B类:不可还原拼图

1 2 3
4 5 6
8 7  

从数学上可以证明,A类与B类是不等价的,即不能通过有限次移动将A类变成B类。下面将进行证明。

首先介绍逆序数

2.逆序数

2.1定义

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。

2.2计算方法

从网上可以搜到三种常见解法,分别是直接枚举,归并排序和树状数组。这里不再详述。

3.证明:A类拼图与B类拼图不等价

在上面,我们已经介绍了逆序数的定义以及奇排列偶排列的划分。接下来我们可以看到,A类拼图与B类拼图的本质区别在于其排列的奇偶性不同

将拼图中的数字以行优先顺序展开,可以得到如下序列:

类别 序列 奇偶性
A类 12345678 偶排列
B类 12345687 奇排列

可以看到,可以还原的一类拼图,其展开后的序列为偶排列,而不可还原的一类拼图,其展开后的序列为奇排列。

3.1引理:拼图的移动不改变序列的奇偶性

从规则定义中,我们可以看到,拼图块的移动分为行移动和列移动,以下分别证明。

行移动

1 2 3
4 5 6
7   8

以上图为例,由于移动是向空白块移动,所以行移动并不会改变空白块两边的数字的相对位置,如7和8,顾不改变排列的逆序数,因此排列的奇偶性不变。

列移动

1 2 3
4   6
7 5 8

转换为数列:12346758

对于上图上图,列移动有两种情况如下: 
1.

1   3
4 2 6
7 5 8

转换为数列:13426758

2.

1 2 3
4 5 6
7   8

转换为数列:12345678

对比这三种的数列形式, 
原始:12346758 
移动1:1 342 6758 
移动2:1234 567 8

与原始序列相比,移动1与移动2改变了移动的数字和移动的数字与空白块中间的2个数字。可以看做移动数字与相邻数字连续做了两次交换得到。以移动1为例,数字2先与数字3交换,再与数字4交换。由现代中的定理:数列中任意交换两个数的次序,奇偶性必发生改变。所以两次交换后,实际并不改变数列的奇偶性。

故,列移动并不改变数列的奇偶性。

总上,拼图的移动不改变拼图序列的奇偶性。

3.2 A类拼图与B类拼图不等价

从一开始的表格中可以看到,A类拼图与B类拼图的奇偶性不同,故A类拼图与B类拼图不等价,既无法将A类拼图通过有限次移动转换为B类拼图。

综上,为了实现一个可还原的拼图游戏,我们需要在随机生成时检测其逆序数,防止生成不可还原的拼图。

4.4x4拼图的可还原性

写完上面,发现只适用于奇数x奇数型拼图,所以补个偶数x偶数型拼图的情况。

从思路上讲,这两种情况的可还原性分析是相同的,但具体情况有所不同。如下图,可以发现,纵向交换后,拼图序列的奇偶性改变。

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15  

其序列为 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15, 
序数为0,是偶序列。

移动12,得到:

1 2 3 4
5 6 7 8
9 10 11  
13 14 15 12

其序列为 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 
序数为3,是奇序列。

这是因为在进行纵向移动时,影响了4个元素,将12 13 14 15变为13 14 15 12,进行了3次交换。故会改变数列的奇偶性。

但是通过某些变形,我们仍可以使用上面3中证明的结论。我们的变形方法即在计算序数前,先将空白块移动到最下面一行在进行计算。因为我们从打乱到还原的过程中空白块向上移动的次数和向下移动的次数必然相等,到最后奇偶性还是没有变化。这样,拼图移动过程中数列的奇偶性改变并不会影响结果。

所以,从另一个角度讲,对于4x4(偶数x偶数)的拼图,只要保证多次移动后空白块的位置与移动前同行,两个序列的奇偶性就不会改变。

另,从拼图游戏可还原性算法分析这篇文章中得到的思路,可以在计算时将逆序数加上(总行数-当前行数)x(总列数-1)也可。不过,只是在拼图生成是进行可还原性检查,可以直接固定最右下角必为空白元素,然后直接计算数列的奇偶性而不用进行任何变换。换句话说,就是随机生成1,2,…,15的排序,最后加上空元素,检查时,只计算前面1至15的排序的奇偶性即可。

时间: 2024-12-19 20:21:23

拼图游戏(数码还原游戏)的实现的相关文章

拼图游戏(数码还原游戏)算法的研究

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

unity3D游戏之昆仑游戏获[愤怒的小鸟]IP开发授权

狗刨学习网报道 / 昆仑上市之后连续十个交易日的涨停让国内股民喜大普奔,而前天晚上北京举行的昆仑上市答谢会上,周老板"一掷千金抽1888股"的土豪抽奖让行业感受到了昆仑的大手笔. 成功上市之后,昆仑在手游业务上将有什么的大动作?今日,昆仑游戏正式对外宣布,已与全球著名手机游戏开发商Rovio EntertainmentLtd.(以下简称"Rovio")签署授权协议,获得Rovio旗下"愤怒的小鸟"IP在中国的独家手游开发授权,双方将就所开发的手游

使用AxureRP7.0制作经典数独小游戏原型,axure游戏原型下载

之前,有同学在Q群中提问,如何使用axure制作经典数独解谜小游戏,当时由于时间关系没有来得及亲手制作,而是给同学们提供了Axure6.5版本的一个数独解谜游戏的原型,本教程由axure原型库网站录制,转载请注明出处!但是那个原型做的太过繁杂,所以仅供大家参考交流:在此,金乌老师特地抽时间给同学们使用AxureRP7.0制作了一下,感觉对实战逻辑分析和axure变量的掌握比较有考验,所以就放出来供大家学习交流使用. 在学习的过程中,如果你仅凭自己现有的对axure的掌握,无法准确分析并组织出原型

游戏编程与游戏种类

游戏编程指利用计算机编程语言,如C编程语言.C++.java等,编写计算机.手机或游戏机上的游戏. 目前流行的游戏编程语言为C++编程语言,目前流行的游戏编程接口为DirectX9.0,还有OpenGL.SDL(Simple DirectMedia Layer)等.现在手机上玩的游戏分为Android与IOS两种不同平台,分别是用eclipse/MyEclipse和xcode.现在也流行一些跨平台的编程引擎,例如cocos2d-x.unity 3D等. 简介 游戏编程指利用计算机编程语言,如C编

网页版《2048游戏》教程 - 游戏初始化

3.1.     初始化棋盘格 我们在main.js文件中,创建newgame()方法用于开始新的游戏.而开始新游戏需要完成两件事情,一是初始化棋盘格,一是在随机两个格子生成两个数字. $(function () { newgame(); }); function newgame() { // 初始化棋盘格 init(); // 在随机两个格子生成数字 generateOneNumber(); generateOneNumber(); } 我们通过编写init()方法来完成棋盘格的初始化工作.棋

网页版《2048游戏》教程 - 游戏优化

1.     GameOver部分 下面我们来分析游戏是如何结束的.一种情况是棋盘格中没有空的格子了,一种情况是棋盘格中没有可以移动的格子了. 首先,完成isgameover()方法的逻辑. function isgameover() { if (nospace(board) && nomove(board)) { gameover(); } } 其次,完成棋盘格中没有空的格子. function nospace(board) { for (var i = 0; i < 4; i++

【转载】U3D 游戏引擎之游戏架构脚本该如何来写

原文:http://tech.ddvip.com/2013-02/1359996528190113.html Unity3D 游戏引擎之游戏架构脚本该如何来写 2013-02-05 00:48:48     发表评论 这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友学会如何更好的写游戏脚本,当然本文这紧紧是我这么多年对游戏开发的认知,你也

我来谈谈我的游戏经历和“游戏三境界”

说到三境界,很多人怕是首先想到王国维: 王国维在<人间词话>说:古今之成大事业.大学问者,必经过三种之境界:"昨夜西风凋碧树.独上高楼,望尽天涯路."此第一境也. "衣带渐宽终不悔,为伊消得人憔悴."此第二境也. "众里寻他千百度,蓦然回首,那人却在灯火阑珊处."此第三境也.此等语皆非大词人不能道.然遽以此意解释诸词,恐为晏欧诸公所不许也." 如果上面看不太懂的,请自行百度吧:)   由此我也想要总结一下我玩游戏的三境界:玩

cocos2d-X 手机游戏《雷电游戏》完整源码下载

源码介绍 雷电游戏--cocos2d-x手机游戏源码下载 本demo是在雷电游戏基本功能完成的基础上,又增加了摇杆模式和精灵关卡.游戏主要功能包括选择关卡,游戏控制模式设置,分数存储,游戏介绍,各关卡中的功能完善,飞机的子弹有普通模式和追踪模式,敌机也一样,还有各种飞行路线,主角还有放大招的功能,三种大招十分炫酷.界面可以暂停和恢复. 大小:9 MB 测试环境 引擎版本:2.2 开发工具:vs2010 测试说明:基于cocos2d-x2.2和vs2010测试 效果图 源码下载:http://ww