智能拼图技巧的技巧

复制地址:
小游戏,大乐趣
1.按键操作
鼠标操作,鼠标点击砖块移动,可以点击一块砖块,也可以点击一条直线上的所有砖块。
2.如何开始
点击【new game】开始游戏。
3.游戏目标
将所有的相同颜色的砖块都拖到在同一直线上。
7K7K网页游戏
7K7K儿童游戏
法律顾问:北京市诺恒律师事务所
京公网安备37
游戏作品版权归原作者享有,如无意之中侵犯了您的版权,请您按照来信告知,本网站将应您的要求删除。
7k7k小游戏温馨提示:适度游戏娱乐,沉迷游戏伤身,合理安排时间,享受快乐生活……
该游戏已收藏您所在的位置:&&
分享小游戏到:
如何便捷进入3366小游戏?
一键点击进入
立即找到我们
该游戏已经添加到您的3366收藏夹
游戏地址已经复制,您可以粘贴(Ctrl+V)发送给好友
超级智能拼图(英文名:Super Jigsaw Show)
类型:|大小:1691K|语言:英文|已经有
小游戏简介:
这个系列很多关哟,你能不能耐心下来慢慢找到呢?把它拼完整吧!
小游戏目标:
如何开始:
游戏加载完成后点击PLAY,然后选择拼图即可游戏
操作指南:
mouseleft鼠标点击操作
鼠标点击操作
同类小游戏推荐
玩过《超级智能拼图》小游戏的用户还玩过
推荐小游戏
精品小游戏推荐1668人阅读
算法(11)
接上一篇博客
本文和上一篇博客相关代码下载地址:
生成可解的智能拼图后(具体方法参见:&)就要想办法找到自动解决的办法。
对于3*3的拼图游戏,有9!种排列方式,其中有一半是可解的。
首先可以暴力搜索,采用dfs的策略,每次大概需要10W次移动,这是不可接受的。。
再就是用A*算法的思想解决。A*算法类似BFS,都是用一个数据结构保存可能的路径,在BFS中用队列,A*中用openList(可以用堆实现)。然后从数据结构中选一个当前代价(拼图中就是移动次数)最少的节点继续搜索。在设置一个数据结构表示已访问过的状态。
BFS只考虑了从起点到当前搜索点的代价。而A*算法是基于估计的,即当前代价由起点到当前搜索点的代价与当前搜索点到目标点的估计代价之和表示,用公式可以表示为:f(n)=C(n)+G(n)。
估计代价是A*的关键之处。我的想法是计算当前状态和目标状态的差异,设当前状态可以用矩阵A[3][3]表示,目标状态可以用矩阵B[3][3]表示。找到A[ai][aj]在B中的对应点B[bi][bj],那么这两个点的距离可以用欧式距离表示dis = sqrt((ai-bi)^2+(aj-bj)^2)。那么估计代价就是两个矩阵中所有点的距离之和G(n) = SUM(dis)。
具体编码的时候用一个双向链表表示openList,但是pre指针不是指向前一个节点,而是指向上一个状态的节点。
class ptstate{
int currentC//当前实际代价
int guessC//当前实际代价估计代价
ptstate( int _currentCost=0,int _guessCost=0,int _state=0):currentCost(_currentCost),guessCost(_guessCost),state(_state){};
ptstate(ptstate &_ptstate){
currentCost = _ptstate.currentC
guessCost = _ptstate.guessC
state = _ptstate.
void setState(int _currentCost,int _guessCost, int _state){
currentCost = _currentC
guessCost = _guessC
typedef struct openListEle{
openListEle *
openListEle * //指向上一个状态,而非上一个节点
void addNext(openListEle *ole){
if(ole == NULL)
ole-&next = this-&
this-&next =
ole-&pre =
}openListE
A*算法的主要步骤:
为了方便,我把拼图的矩阵用一个整数表示,用一个set&int&保存已访问过的节点。
void pingtuAstar(int pt[vol][col],int correct[vol][col]){
visited.clear();
//判断是否是正确状态
int correctStateInt = makeInt(correct);
if(correctStateInt == makeInt(pt)){
cout&& &已是正确状态& &&
//初始化头节点
openListEle *openList = new openListE
openList-&next = NULL;
openList-&pre = NULL;
//将初始状态加入openlist
openListEle *startEle = new openListE
startEle-&pts.setState(0,0,makeInt(pt));
openList-&addNext(startEle);
openListEle *finalEle = new openListE
finalEle = NULL;
while(true ){
if(finalEle != NULL)
//找到openlist中代价最小的
openListEle *minEleP = openList-&
openListEle *minEle = NULL;
int minCost = -1;
int minElePCount = 0;
while(minEleP!=NULL){
if(minCost == -1 || minEleP-&pts.guessCost&minCost){
minCost = minEleP-&pts.guessC
minEle = minEleP;
minElePCount++;
minEleP = minEleP-&
if(minEle == NULL || minEle-&pre == NULL)
//计算以当前状态的可变状态的guessCost
int tmpPt[vol][col];
int data = minEle-&pts.
for(int i=vol-1;i&=0;--i){
for(int j=col-1;j&=0;--j){
tmpPt[i][j] = data%10;
data = data/10;
int zi = 0,zj = 0;
for(int i=0;i&++i){
for(int j=0;j&++j)
if(tmpPt[i][j] == vol*col-1){
int offseti[4] = {-1,0,1,0};
int offsetj[4] = {0,1,0,-1};
for(int i=0;i&4;++i){
int ti = zi+offseti[i];
int tj = zj+offsetj[i];
if(ti&0 || ti&vol-1 || tj&0 || tj&col-1)
int t = tmpPt[ti][tj];
tmpPt[ti][tj] = tmpPt[zi][zj];
tmpPt[zi][zj] =
int hashcode = makeInt(tmpPt);
if(visited.find(hashcode) == visited.end()){
visited.insert(hashcode);
openListEle *newEle = new openListE
int tmpguessCost = getGuessCostBetweenTwoState(tmpPt,correct);
newEle-&pts = ptstate(minEle-&pts.currentCost+1,minEle-&pts.currentCost+1+tmpguessCost,hashcode);
minEle-&addNext(newEle);
if(hashcode == correctStateInt)
finalEle = newE
t = tmpPt[ti][tj];
tmpPt[ti][tj] = tmpPt[zi][zj];
tmpPt[zi][zj] =
//从openList中删除
deleteOpenListEle(openList,minEle);
//保存路径
stack&openListEle*&
openListEle *pathEle = finalE
while(pathEle != NULL){
rightpath.push(pathEle);
pathEle = pathEle-&
int steps = 0;
//输出路径
while(!rightpath.empty()){
pathEle = rightpath.top();
printPingTu(pathEle-&pts.state);getchar();
rightpath.pop();
cout&& &共需:&&&steps&&&步& &&
long long makeInt(int a[vol][col]){
long long sum = 0;
for(int i=0;i&++i)
for(int j=0;j&++j){
sum = 10*sum+a[i][j];
int getGuessCostBetweenTwoState(int a[vol][col],int b[vol][col]){
int guessCost = 0;
for(int ai=0;ai&++ai)
for(int aj=0;aj&++aj){
bool found =
for(int bi=0;bi&vol && found ==++bi)
for(int bj=0;bj&col && found ==++bj)
if(a[ai][aj] == b[bi][bj]){
guessCost += sqrt(1.0*(ai-bi)*(ai-bi)+(aj-bj)*(aj-bj));
return guessC
运行截图如下:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:16756次
排名:千里之外
原创:18篇
评论:10条
(1)(2)(3)(2)(2)(4)(1)(1)(1)(1)(3)查看: 91714|回复: 17
9格智能拼图入门级解法,举一反三,多加练习。
主题帖子积分犹恐相逢是梦中
人气17238 分
这是一个手机小游戏,应用于各大单机游戏中,比如生化危机,就有类似的玩法。
我们以手机入门级,“蒙娜丽莎的微笑”局部拼图游戏,来给大家讲解入门级的方法。
当然技巧有很多,这是入门级的,帮助你按照方法来完成拼图。而不是没有入手之地。
还是补充在前头吧,这次中秋任务与这个并不一样,我只是打个预防针不用深入研究也不算啥攻略
上次是找位置拼图,现在是换位置拼图,我觉得下次有可能就是移动拼图了
看图,“蒙娜丽莎的微笑”局部图& && && && && && & 然后看拆解打乱后的图
& && && && && && && && & &&
原图被分为9个大小相同的正方形,而智能拼图给出的,是缺一块的,这一块一般是右下角部分的这一块。
完成后的图片应该是这样:
想要完成拼图,第一步是要知道每一块在什么地方。比如蒙娜丽莎的微笑 的拆解图,如下:
为了给大家更好的讲解,所以我就先把图片位置标出来,
一般来说,我们碰到一个新图,是无法找准位置的,
(所以看到一个拼图,对比原图,我们要率先把左上角的图片找到。)
先看例子吧,走法大同小异,讲究的是一个“让”字,把位置让出来给该在这个位置的拼图。
一般来说,按照习惯都是以层(一横排)为单位来摆。
我今天就演示第一排的走法,后面的完成,我会以图片的形式打包上传到附件。
你们只需把后缀改成RAR,然后打开文件夹,打开第一个图片,用windows的图片和传真查看器按右来手动制作一个“Flash”观察每一步的走法。
下面开始看图片。
我们用表格表示出来
第一步:先摆第一排,让1归位,最直观的,让8闪开,让1占到左上角的位置。即2向右,8向下,1向左。
大家看到了,1归位了,那么2只需要往上一步,就可以归位。如图
2归位后,接着就是3归位,这里才是智能拼图的重点,掌握这一步,入门级的智能拼图玩法就可以应用了。
刚说到“让”字诀,我把8向右,1向下,2向左,6向左,3向上就能让3归位。
3归位了,很多人说,这么1、2的位置就乱了,别急。
我们把8向右,6向下,2向右,1向上,这样1、2就回到了原来的位置,这么第一排的1、2、3就都归位了。
好了,以一横排为顺序的步法规则就在上面介绍给大家了。
多多运用举一反三,熟练了就会领悟一些技巧,技巧不是我能说出来的。
9格拼图我曾经3秒就搞定了,只要你熟练,你也是可以的。
就如上面所说,9格直至完成的步法我会打包上传至附件。
你们只需要把&.wrec&换成&.rar&就OK了。
然后解压到左面,按顺序浏览,就能看出完成方式了
补充,按照我们任务的玩法,2个拼图可以互换位置。这样就更简单了,了解了图片的位置,互相移动就OK。
想速度完成,还是要找到周围的图片,知道他原来的位置,一步一步耐心来
[ 本帖最后由 落葉知秋 于
18:07 编辑 ]
17:51 上传
点击文件名下载附件
129.79 KB, 下载次数: 4999
&.wrec&换成&.rar&
主题帖子积分
升级积分:32, 积分 22, 距离下一级还需 10 积分
学习。。。。。。。。。。
主题帖子积分镜、
人气3606 分
。。。。。。。。。
主题帖子积分
人气3882 分
节操351 斤
去哪里找来的难道又要出什么任务
不是拉,中秋任务,和这个差不多。
胖子:“因为在诸神的国度中没有你的位置,不管你虔诚与否。”
“总而言之,傲慢,就是你一切苦难的根源!”格利高里为三天来的说教作了结语。
主题帖子积分犹恐相逢是梦中
人气17238 分
回复 4# 的帖子
中秋任务和这个差不多,只不过中秋任务可以两个互换位置 更简单一点
主题帖子积分
升级积分:490, 积分 466, 距离下一级还需 24 积分
人气1881 分
你。。。。。。。。。。。。。。
主题帖子积分镜、
人气3606 分
可以说。本来中秋的拼图是很简单的。看完你这个。我就忘了我是怎么拼的了
#83下一步就是这个了 早点了解好#83
主题帖子积分犹恐相逢是梦中
人气17238 分
回复 7# 的帖子
下次任务的拼图就是这个了还是早点了解好
主题帖子积分
升级积分:203, 积分 186, 距离下一级还需 17 积分
人气305 分
了解下就行,以防万一,这次任务简单多了。
主题帖子积分镜、
人气3606 分
中秋的拼图简单的要死。最慢也20秒。如果大话哪天出用键盘方向键控制的拼图我才不做呢& & 除非拼一个升一级
上次是找位置,这次更眼花缭乱,下一次你懂 ...
主题帖子积分
人气3882 分
节操351 斤
那你还不快去写攻略
了解就行,不用深入研究#132
胖子:“因为在诸神的国度中没有你的位置,不管你虔诚与否。”
“总而言之,傲慢,就是你一切苦难的根源!”格利高里为三天来的说教作了结语。
主题帖子积分
荣誉-12 分
人气498 分
节操111 斤
中秋那个自己拿图片放,不是一步一步移动,去年还是前年那任务就做过了撒
恩恩,我知道。不过比之前的难度有所提升。
主题帖子积分犹恐相逢是梦中
人气17238 分
回复 12# 的帖子
我只是无聊打个预防针
下次任务估计就是键盘拼图了
主题帖子积分
升级积分:21, 积分 12, 距离下一级还需 9 积分
主题帖子积分60度白酒当水喝。
人气1905 分
下次任务是画CPU 或者主板的 电路图
时间是把杀猪刀,黑了木耳、紫了葡萄、软了香蕉。
Powered by

参考资料

 

随机推荐