- 浏览: 196238 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
在世界的中心呼喚愛:
思路很好
连连看全局消除算法 -
tianaozhu:
请问,我修改了词库和源文件怎么就不好用了, 我源文件是: My ...
自己动手开发翻译软件(Java版) -
Arlrn:
博主你好,最近在学习排序算法,看了你的博客,你的直接插入排序, ...
各种排序算法的实现及其比较 -
sharong:
有一个明显错误,很显然冒泡排序的时间复杂度是O(n^2)
各种排序算法的实现及其比较 -
julydave:
希尔排序不太对吧。。
各种排序算法的实现及其比较
好久没写技术博客了。Iteye依然这么亲切!
内存分析了连连看内部数据,找出了方块摆放的那一段数据,用程序把它读出来,放到一个二维数组里面,构成一个矩阵。
这些数据就做为这个算法的数据基础。
这是今天突发奇想,写出来的代码,结合内存读出来的数据,可以瞬间把连连看里面的方块消得个精光。
开局:
一阵电闪雷鸣,瞬间之后,就变成下面这样子了:
但本篇文章不讲这个外挂程序。只讲里面涉及到的连连看全局算法。
本算法事实上也就是在一般的连连看消除算法上,包装了下。写过连连看游戏的朋友应该都明白怎样判断两个方块是否可以消除,而本算法就是循环地判断全局所有的可消除的方块,一对一对地消掉,直到最后没有方块时才停止程序。
其实说来说去,这个算法的本质也就是深搜。基本思路如下:
从左上角第一格开始,用深搜查找它在两个转弯之内可以碰到的和它一样的方块,如果找到,就消去,把矩阵里面相应的两个数值也设成0。再以第二格为起点,用同样的方法查找和它一样的方块。以此类推,一格一格地,一行一行地遍历整个矩阵。第一遍过去,基本上都有剩下方块。于是进行第二次遍历。那么怎么判断全局的方块都已经消完了?很简单,一开始看一共有多少方块,每消去一对就减2,直到为0时就停止遍历。
思路看起来很简单,但其实限制条件特别多,写起来很可能会有哪一方面没考虑到。于是调了好久。。。
下面就直接给出算法的代码,结合上面的思路,应该很容易看懂:
#include <iostream> using namespace std; #define MAX_X 11 //11行 #define MAX_Y 19 //19列 int m_matrix[MAX_X][MAX_Y] = { 0,0x0,0x0,0x18,0xf4,0x0,0x11,0xa,0x12,0x9,0x12,0x3,0x37,0x11,0x5,0x1b,0x1d,0x3,0x0, 0x0,0x0,0xe,0x1d,0x0,0x0,0x12,0x0,0xc,0x0,0x4,0xf4,0xa,0xc,0xd,0xf,0x14,0x2,0xf7, 0x0,0x0,0x8,0x9,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x1c,0xd,0x0,0x0,0x4,0x0,0x0,0x37,0x0,0x0,0xb,0x14,0x2,0x0,0x0,0x0,0x0, 0x0,0x0,0xf3,0x5,0x0,0x0,0xc,0x0,0x0,0xe,0x8,0xf5,0x5,0x0,0x6,0x3,0xf3,0x0,0x0, 0x0,0x0,0x1d,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf7,0x14,0x0,0x0, 0x0,0x0,0x19,0xf,0xb,0x13,0x1a,0x0,0x0,0x14,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x19,0xf5,0x9,0x0,0x0,0x1b,0x1d,0x0,0x0,0x0,0x15,0xd,0x0,0x0, 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x9,0x1c,0x16,0x5,0x16,0x2,0x13,0x17,0x0,0x3,0x0,0xd,0x0,0x0,0x17,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x10,0xc,0x10,0x1a,0x15,0x0,0x6,0x1a,0x2,0x0,0x18,0x1a,0x12,0x0,0x0,0x0 }; int dir[][2] = {0,1,1,0,0,-1,-1,0}; int gx,gy; bool FindTheSame(int &x, int &y, int d0, int turnCnt,bool turn) //x表示行,y表示列 { //d0表示前一步的方向,用来防止它往回走; turnCnt表示转弯的次数,超过两个就不算了,返回 //turn表示从上一步到这一步,是否已经转弯了 if(turn) turnCnt ++; if(turnCnt > 2) return false; int d = 0; for(; d < 4; d ++) { if(d == (d0+2)%4) continue; //其它三个方向没搜索完之前,不让它按原方向返回 int newx = x+dir[d][0]; int newy = y+dir[d][1]; if(newx < 0 || newx > MAX_X-1 || newy < 0 || newy > MAX_Y-1) continue; //越界了 if(newx == gx && newy == gy) continue; //找到的是原来的那个 if(m_matrix[newx][newy]) { if(d0 >= 0 && d != d0) if(turnCnt+1 > 2) continue; if(m_matrix[gx][gy] == m_matrix[newx][newy]) { x += dir[d][0]; y += dir[d][1]; //返回x,y数值 return true; } else { continue; } } else { bool flag = false; if(d0 >= 0 && d != d0) flag = true; if(FindTheSame(newx,newy,d,turnCnt,flag)) { x = newx; y = newy; return true; //跳到下一个空格 } } } if(turn) turnCnt --; return false; } int main() { int i,j,tmpi,tmpj; int curCnt = 0; //得到目前总块数: for(int i = 0; i < MAX_X; i ++) for(int j = 0; j < MAX_Y; j ++) if(m_matrix[i][j]) curCnt++; curCnt /= 2; while(curCnt) { for(i = 0; i < MAX_X; i ++) { for(j = 0; j < MAX_Y; j ++) { if(!m_matrix[i][j]) continue; tmpi = gx = i; tmpj = gy = j; if(FindTheSame(tmpi,tmpj,-4,0,false)) //-4是为了避免干扰在FindTheSame里面对是否原路返回的判断 { //能到这里,说明已经找到一对了,消去 m_matrix[i][j] = 0; m_matrix[tmpi][tmpj] = 0; curCnt --; } } } } return 0; }
注意,这个算法用于边缘同行或同列上不能消除的情况。如果要改为边缘可消除,那么给数组加一圈0就行了。
这些代码调了很久,调到最后头都有点晕了,基础不太好。。
有不足或有改进的地方,欢迎大家在评论中指出来,一起学习!
发表评论
-
一个简单的字符组合算法
2011-07-27 13:18 1237有个朋友问了我这个问 ... -
object-c笔记一
2011-07-22 11:03 886(本笔记只是简单的记录,只给自己看) 接口的定义: ... -
VC2010中C++的右值引用新特性
2011-05-27 13:37 1509// RightValue.cpp : Defines ... -
各种排序算法的实现及其比较
2011-05-13 22:42 13838排序算法是笔试和面试中最喜欢考到的内容,今晚花了好几个小时的时 ... -
STL在ACM中的应用
2011-04-09 01:41 2346STL 提供三种类型的组件:容器、迭代器和算法,它们都支持泛型 ... -
linux下用命令编译/调试C++程序
2011-04-01 14:17 3033先安装gcc : sudo apt-get insta ... -
完全背包问题
2011-03-29 23:01 1691看这篇日志之前,请先阅读我的上一篇日志,关于0/1背包 ... -
0/1背包问题的动态规划详解
2011-03-29 22:57 1523动态规划是用空间换时间的一种方法的抽象。其关键是发现子问题 ... -
最长上升子序列问题的几种解法
2011-03-29 22:55 2536拿POJ 2533来说。 Sample Input 7 ... -
用BFS找最短路,并打印路径
2010-12-23 02:19 6137我想大部分读者都用Floyd或者Dijstra算法,甚至dfs ... -
插入排序的另一种写法
2010-12-14 01:39 1191一般的插入排序方法想必大家都写过,基础好的几分钟就可以写出来了 ... -
北大ACM题库习题分类与简介
2010-12-06 13:57 1760acm.pku.edu.cn转自:http://www.stu ... -
对Windows程序中设备上下文DC(device context)的理解(转)
2010-11-08 00:58 1646对Windows程序中设备上 ... -
POJ1753-位操作
2010-11-03 01:30 1133Flip Game Time Limit ... -
MFC学习笔记(九)
2010-10-30 01:47 1380前面已经讲了够多的基础性的东西了,还有一些,但我想还是之后遇到 ... -
MFC学习笔记(八)
2010-10-30 00:55 1045MFC把早期的窗口类的功能分成三个部分:数据存储、管理部分,数 ... -
MFC学习笔记(七)
2010-10-28 01:29 968创建一个普通的Win32 Application,加上一个.c ... -
MFC学习笔记(六)
2010-10-28 01:16 1106先来了解几个类 1、CObject类 有相当一部分类的基 ... -
MFC学习笔记(五)
2010-10-27 01:55 1498早期的MFC应用程序框架结构由两个对象组成:应用程序类CWin ... -
MFC学习笔记(四)
2010-10-27 00:28 1203前面写了那么多代码,但很多东西都是固定的,我们需要写的主要是消 ...
相关推荐
连连看消除算法是一种常见的休闲游戏玩法,其核心是通过寻找并消除两个相同图案的棋子,直至棋盘上没有可消除的对为止。在本文中,我们将深入探讨连连看消除算法的设计与实现,以及相关技术要点。 连连看游戏的基本...
《C#连连看源码解析:经典算法与学习价值》 C#连连看源码,作为初学者的实践素材,虽然技术层面可能尚不成熟,但其内在的算法设计却值得深入探讨。连连看游戏的核心在于高效、准确地找出可匹配的元素,这涉及到搜索...
在ActionScript中,可以设置一个全局变量记录分数,并在每次消除后更新。 六、优化与扩展 为了让游戏更具吸引力,开发者还可以添加额外的功能,如时间限制、道具系统、关卡设计等。在源码中,可以查找并分析这些...
"武汉理工大学数据结构及算法综合实验连连看.doc" 本文档是武汉理工大学数据结构及算法综合实验报告,实验名称为“连连看游戏综合实践报告”。该实验的目的是掌握数据结构和算法的知识,了解连连看游戏的功能和规则...
比如,连连看的匹配算法、计时系统、用户交互响应等都可通过C#脚本来实现。 4. **UI系统**:Unity的UI系统(Unity UI或UGUI)用于构建游戏的界面,包括开始菜单、分数显示、游戏结束提示等。在这里,可能会使用...
4. **算法实现**:连连看的核心算法是寻找可消除的方块对。这通常涉及到深度优先搜索(DFS)或广度优先搜索(BFS)等图论方法。开发者需要编写代码检查每一对相邻的方块,判断它们是否符合条件(即在同一行、同一列...
5. **算法实现**:连连看的核心算法是寻找可消除的棋子对。这可能涉及到深度优先搜索、广度优先搜索或其他优化的搜索策略。这部分代码会比较复杂,因为需要在大量可能的棋子组合中找到符合条件的对。 6. **状态管理...
总的来说,使用Java编写连连看小游戏是一个综合性的项目,涉及到图形界面设计、算法实现、事件处理等多个方面的知识。通过这样的实践,开发者不仅可以提升编程技能,还能锻炼解决问题和设计游戏逻辑的能力。对于初学...
4. **数据结构与算法**:连连看的核心逻辑是寻找并消除可匹配的图片。这可能需要用到链表、数组、栈或队列等数据结构,以及深度优先搜索(DFS)、广度优先搜索(BFS)等算法。开发者需要设计合适的数据结构来存储...
6. **性能优化**:连连看游戏的匹配算法需要在合理的时间内完成,因此可能需要对查找匹配对的算法进行优化。例如,可以使用深度优先搜索或广度优先搜索,同时考虑使用队列或栈来提高效率。 7. **文件操作**:为了...
综上所述,Java连连看源代码涉及了Java GUI编程、事件处理、算法设计、数据结构、资源管理等多个方面,为初学者提供了丰富的学习素材,同时也是进阶开发者练习和理解Java应用开发的绝佳案例。通过深入分析和实践这个...
4. **数据结构与算法**:连连看的核心算法在于查找两个可以消除的相同棋子。这可能需要用到栈或队列等数据结构,以及深度优先搜索(DFS)或广度优先搜索(BFS)等算法。 5. **多线程**:为了实现游戏的动态效果,如...
在本项目中,"C#可视化连连看实现 广度优先,动态规划,回溯" 是一个使用C#编程语言实现的连连看游戏,它融合了三种算法:广度优先搜索(BFS)、动态规划(DP)和回溯法。这些算法在解决复杂问题时非常有效,尤其是...
4. **算法实现**:连连看的核心算法是寻找并消除匹配的棋格。我们可以采用深度优先搜索(DFS)或广度优先搜索(BFS)策略。每点击一次,程序都会遍历所有可能的连线路径,如果找到符合条件的,就消除这对棋格,并...
3. **棋子匹配逻辑**:连连看的核心算法是寻找可消除的棋子对。源代码可能会定义一个方法,用于检查两个棋子是否可以消除,这通常涉及到二维数组(棋盘)的操作,以及棋子位置的计算。 4. **数据结构与算法**:在...
计数功能主要记录消除的对数,这通常需要一个全局变量来存储。当玩家点击一对相同的元素时,程序会检查它们是否可以消除,如果可以,则增加计数并更新棋盘状态。重排功能则需要一种算法,随机选择未匹配的元素并尝试...
通过学习和理解这个QQ表情连连看的VC源代码,开发者不仅可以掌握连连看的算法设计,还能深入理解VC++编程,包括面向对象编程、图形界面设计以及算法与数据结构的结合应用。这对于提升软件开发技能和增强游戏设计能力...
连连看游戏中,需要匹配相同的图像进行消除,这个文件可能记录了游戏的当前状态或者识别算法的缓存数据。 6. **资源文件**:`kongxiangji_LinkAndLook.gif`是一个动态图格式的文件,可能是游戏中的动画效果,比如...
总的来说,这个连连看的C语言实现提供了学习基础编程、图形界面设计和简单算法的好机会。对于C语言初学者,通过阅读和理解这段代码,可以提高编程技巧,并了解如何将理论知识应用到实际项目中。
- "lian.h"可能是头文件,包含了函数声明和全局变量定义,供其他源文件引用,以实现模块化编程。 6. 编译与调试 - 使用C编译器(如GCC)将源代码编译为可执行文件,调试工具(如GDB)用于定位和修复程序中的错误...