连连看的主要思路

news/2024/12/21 20:32:32/

 

                 连连看的玩法大家都知道,就是两张图片相同,且相连的路径转弯次数不超过两次。

        其实如果不太要求游戏的性能的话,连连看这游戏实现起来还算容易,接下来我把主要的思路说一下。

        1:将整张地图拆分为n行m列,接着用一个二维数组表示将在地图中显示什么,例如0表示此处没有东西(如果两张图片可以消除时,就可以将数组中对应的元素赋为0。

        2:游戏中需要处理鼠标按下时间和获取鼠标当前点击坐标信息

       

        3:如果其在地图范围内按下某张图片,则将其转换为在二维数组中对应的行和列。

        4:游戏关键就是 如何判断两张图片可以消除,这也是连连看游戏的关键吧。其实消去的话如果用广度优先搜索算法的话,实现起来还是比较方便的。

        广度优先遍历的思路是这样的: 首先我们已经取得了 第一张图片 和第二张图片的信息了,将其坐标都转换为 二维数组中对应的 map[start.x][start.y]和map[end.x][end.y]。

        如果map[start.x][start.y]!=map[end.x][end.y],这就代表他们图片不相等,这时就不需要进行搜索了。

        否则我们可以将 开始点的 前后左右 四个方向的结点都推入队列中,继续查看其前后左右的 前后左右,如果其中有为0的(代表此处没有图片,存在通路),还是元素值和开始点 相同的都推入队列中。

       在判断前后左右时就可以对 转弯次数 进行累加了,如果还是原来的方向,则保持转弯次数不变,否则转弯次数+1。

       如果搜索的过程中,发现存在转弯的次数少于或者等于2的,且其结点信息和 结束点一样,代表我们已经找到了开始点 和结束点之间的通路了,这时也就是两张图片可以消去了。

       5:如何画出两张图片消去的路径呢,我的思路是这样的,每次寻找到一个新结点时,我们可以将其上一步结点的信息也保存下来,这样当我们找到结束点时,我们就可以沿着相反的方向,搜索回去,找出原来的整条路径。

       搜索代码:

      

void CGameMap::bfs()    //搜索看两张图片是否可以消去
{
for(int ii=0;ii<12;ii++)  //初始化为全部没有遍历过
{ 
for(int jj=0;jj<17;jj++)
{
hash[ii][jj]=15;
}
}
hash[m_startPos.y][m_startPos.x]=0;
node now,t;
while(!m_fangkuai.empty())   //遍历队列
{
now=m_fangkuai.front();
m_fangkuai.pop();
if(now.x==m_endPos.x && now.y==m_endPos.y && now.turn<=2)
{
flag=true;
m_end=now;
while(!m_fangkuai.empty())
m_fangkuai.pop();
return;
}
for(int i=0;i<4;i++)
{
t.x=now.x+m_dir[i][0],t.y=now.y+m_dir[i][1];
t.father.x=now.x;
t.father.y=now.y;
t.father.d=now.d;
if(now.d==i)
t.turn=now.turn,t.d=now.d;
else
t.turn=now.turn+1,t.d=i;
if(in(t)&&(m_map[t.y][t.x]==0|| (t.x==m_endPos.x&&t.y==m_endPos.y) ) && hash[t.y][t.x]>=t.turn)
{
hash[t.y][t.x]=t.turn,m_fangkuai.push(t);
m_lujing.push_back(t);
}
}
}
}

       6:实现放大镜功能,也就是所谓的帮忙查找功能,有了之前的广度搜索,这个功能就很好实现了,就是传入一些开始点和结束点,判断是否可以消去,可以的话我们就可以将这两点显示出来,给玩家看。

      


http://www.ppmy.cn/news/579728.html

相关文章

欢乐连连看小游戏制作

之前完成了欢乐连连看的实验&#xff0c;现在来做一下总结&#xff0c;以实验的步骤为纲进行。 一.实验目的和要求 1. 目的 通过连连看项目&#xff0c;达到如下目标&#xff1a; (1)了解业务背景&#xff0c;调研与连连看同类型游戏&#xff0c;了解连连看游戏的功能和规则…

java连连看

一、成品展示&#xff1a; 该连连看主要有以下功能&#xff1a; 1.提示&#xff0c;洗牌&#xff08;可在设置中设置提示和洗牌次数&#xff09; 2.可以切换背景&#xff0c;图标 3.重新开始&#xff0c;暂停&#xff0c;进度条 游戏规则&#xff1a;连连看是一款非常经典的游戏…

基于Java学生信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

java8新特性之--强大的Stream API详细讲解

强大的Stream API Stream API说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则 是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风格引入到Java中。 这是目前为止对Java类库最好的补充&#xff0c;因为Stream API可以极…

PAT-A1100(C/C++代码解析)

1100 Mars Numbers (20 分) 注&#xff1a;打表&#xff0c;map #include <stdio.h> #include <string> #include <map> #include <iostream> using namespace std; map <string,int> strToNum; //火星文->数字 string digit[13]{"…

皓龙服务器芯片,开放计算项目峰会:AMD展示基于ARM的皓龙A1100系列服务器芯片...

访问购买页面: 高阶型号会配备4MB二级缓存和8MB三级缓存&#xff0c;频率至少2GHz。有趣的是&#xff0c;Seattle拥有支持运行速度高达1866 MT/s的DDR3或DDR4双通道内存控制器。 连接性方面&#xff0c;基于ARM的Opteron拥有8条PCI Express 3.0通道、6个6Gbps SATA、以及板载双…

map A1100 A1054 A1071

A1100 把字符串类型数字转变为整数类型数字 方法一 for(int i0;i<s.length();i){numnum*10(s[i]-0);}或者直接int numstoi(s); #include<bits/stdc.h> using namespace std; //[0,12]的火星文 string unitdigit[13]{"tret","jan","feb&qu…

amd 皓龙 服务器 芯片,AMD公布首款ARM架构皓龙A1100芯片细节

早在今年1月份的圣何塞开放计算峰会上&#xff0c;AMD推出了旗下首款基于ARM架构服务器处理器&#xff1a;皓龙(Opteron) A1100系列芯片&#xff0c;该系列芯片代号为“西雅图(Seattle)”。直到近日&#xff0c;在加利福尼亚州库珀蒂诺举办的Hot Chips会议上&#xff0c;AMD又公…