cocos2d 消除类游戏简单的算法 (一)
1. 游戏视频演示
2.三消游戏我的理解
市场上三消游戏已经超级多了。主流的是地图型的。差点儿是无尽模式。各种消除特效。各种各样的过关方式,玩起来还是不错的,就是遇到比較难的关卡,要多试几次,运气很好的时候就过了,不然卡死。
3.消除涉及到的简单算法
3.1 生成随机地图算法
每次先推断下它的左边两个是否已经同色。还有上面两个是否已经同色,假设同色了,要去掉这个颜色。
所以X的结果仅仅能是0,1,4中随机取一个了。
enum MatchItemType{
kRedItem = 0, //0
kGreenItem, //1
kBlueItem, //2
kWhiteItem, //3
kOrangeItem //4
};
MatchItemType getOneRandomTypeExceptParameter(const MatchItemType& type){
MatchItemType allType[5] = {kRedItem, kGreenItem, kBlueItem, kWhiteItem, kOrangeItem};
std::vector restType;
for(int i = 0; i < 5; ++i){
if(allType[i] != type){
restType.push_back(allType[i]);
}
}
int restSize = restType.size();
int randomIndex = rand() % restSize;
return restType[randomIndex];
}
Array2D<MatchItemType> getOneRandomMapArray(){
Array2D<MatchItemType> map = Array2D<MatchItemType>(7, 7);
bool findThreeSameInX = false;
bool findThreeSameInY = false;
for(int y = 0; y < 7; ++y){
for(int x = 0; x < 7; ++x){
MatchItemType randomType = (MatchItemType)(rand() % 5);
if(x >= 2){
//左边两个是同色
if( map.Get(x - 1, y) == map.Get(x - 2, y)){
//need find a new type
findThreeSameInX = true;
}else{
findThreeSameInX = false;
}
}else{
findThreeSameInX = false;
}
if(y >= 2){
//上面两个是同色
if(map.Get(x, y - 1) == map.Get(x, y -2)){
//need find a new type;
findThreeSameInY = true;
}else{
findThreeSameInY = false;
}
}else{
findThreeSameInY = false;
}
if(findThreeSameInX == false && findThreeSameInY == false){
//do nothing
}else if(findThreeSameInX == true && findThreeSameInY == false){
randomType = getOneRandomTypeExceptParameter(map.Get(x - 1, y));
}else if(findThreeSameInX == false && findThreeSameInY == true){
randomType = getOneRandomTypeExceptParameter(map.Get(x, y - 1));
}else{
randomType = getOneRandomTypeExceptParameter(map.Get(x - 1, y),
map.Get(x, y - 1));
}
map.Set(x, y, randomType);
}
}
return map;
}
3.2 推断地图是否是死地图
//case 1
/////[x]//////[x]////////
//[x][o][x][x][o][x]/////
/////[x]//////[x]////////
///////////////////////// //case 2
////////[x]//////////////
/////[x][o][x]///////////
////////[x]//////////////
////////[x]//////////////
/////[x][o][x]///////////
////////[x]//////////////
这里用凝视画了简单的两种情况,注意x的位置。
case1 是横着有两个同色的情况,移动一步能消除仅仅有6种可能,左边3种,右边3种。以下是竖着有两个同色的情况。移动一步能消除也是6种情况。上面3种。以下3种。
知道了这个,代码就easy了。记得找到一个就直接return。
vector<MatchItem*> getThreeMatchItemCanRemoveByOneStep(const Array2D<MatchItem*> & map){
vector<MatchItem*> result;
int maxX = 7;
int maxY = 7;
for(int y = 0; y < maxY; ++y){
for(int x = 0; x < maxX; ++x){
if(x + 1 < maxX){
//case 1
if(map.Get(x, y)->getType() == map.Get(x + 1, y)->getType()){
MatchItemType currentType = map.Get(x, y)->getType();
//check 6 item, one move one step can combine three same item
if(x - 2 >= 0){
if(map.Get(x - 2, y)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x + 1, y));
result.push_back(map.Get(x - 2, y));
return result;
}
}
if(x - 1 >= 0 && y - 1 >= 0){
if(map.Get(x - 1, y - 1)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x + 1, y));
result.push_back(map.Get(x - 1, y - 1));
return result;
}
}
if(x + 2 < maxX && y - 1 >= 0){
if(map.Get(x + 2, y - 1)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x + 1, y));
result.push_back(map.Get(x + 2, y - 1));
return result;
}
}
if(x + 3 < maxX){
if(map.Get(x + 3, y)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x + 1, y));
result.push_back(map.Get(x + 3, y));
return result;
}
}
if(x + 2 < maxX && y + 1 < maxY){
if(map.Get(x + 2, y + 1)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x + 1, y));
result.push_back(map.Get(x + 2, y + 1));
return result;
}
}
if(x - 1 >= 0 && y + 1 < maxY){
if(map.Get(x - 1, y + 1)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x + 1, y));
result.push_back(map.Get(x - 1, y + 1));
return result;
}
}
}
}
if(y + 1 < maxY){
MatchItemType currentType = map.Get(x, y)->getType();
//case 2
if(map.Get(x, y)->getType() == map.Get(x, y + 1)->getType()){
if(y - 2 >= 0){
if(map.Get(x, y - 2)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x, y + 1));
result.push_back(map.Get(x, y - 2));
return result;
}
}
if(x + 1 < maxX && y - 1 >= 0){
if(map.Get(x + 1, y - 1)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x, y + 1));
result.push_back(map.Get(x + 1, y - 1));
return result;
}
}
if(x + 1 < maxX && y + 2 < maxY){
if(map.Get(x + 1, y + 2)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x, y + 1));
result.push_back(map.Get(x + 1, y + 2));
return result;
}
}
if(y + 3 < GameGlobal::xMapCount){
if(map.Get(x, y + 3)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x, y + 1));
result.push_back(map.Get(x, y + 3));
return result;
}
}
if(x - 1 >= 0 && y + 2 < maxY){
if(map.Get(x - 1, y + 2)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x, y + 1));
result.push_back(map.Get(x - 1, y + 2));
return result;
}
}
if(x - 1 >= 0 && y - 1 >= 0){
if(map.Get(x - 1, y + 1)->getType() == currentType){
//find one
result.push_back(map.Get(x, y));
result.push_back(map.Get(x, y + 1));
result.push_back(map.Get(x - 1, y - 1));
return result;
}
}
}
}
}
}
return result;
}
看起来是有点复杂。穷举了12种情况,这个算法应该速度很快的。还有个地方要用到这个算法。就是在消除游戏中。用户很久时间没有进行消除了,要给提示。就用这个算法找到哪3个能够移动一步进行消除。
算法先到这里... 兴许有时间再更新...
提交给苹果,审核竟然能通过
版权声明:本文博主原创文章,博客,未经同意不得转载。
cocos2d 消除类游戏简单的算法 (一)的更多相关文章
- ccf题库中2015年12月2号消除类游戏
题目如下: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这 ...
- 用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单
系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** ...
- 消除类游戏(js版)
最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码总共456行,未经过严格测试 ...
- CCF2015122消除类游戏(C语言版)
问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...
- ccf消除类游戏
问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...
- CCF CSP 201512-2 消除类游戏
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...
- CSP201512-2:消除类游戏
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- 用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面
游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: ...
- 用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现
Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * ...
随机推荐
- 基本调试命令 - u/ub/uf
原:http://www.cnblogs.com/developersupport/p/windbgcommand-u.html 在调试过程中难免会遇到须要反编译代码来分析逻辑的时候.在windbg中 ...
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲
说明:我仅仅对网络资源进行了整合,方便学习-.- 基于流的操作终于会调用read或者write函数进行I/O操作.为了使程序的执行效率最高,流对象一般会提供缓冲区,以降低调用系统I/O库函数的次数. ...
- 【转】QT样式表 (QStyleSheet)
作者:刘旭晖 Raymond 转载请注明出处Email:colorant@163.comBLOG:http://blog.csdn.net/colorant/ 除了子类化Style类,使用QT样式表( ...
- Mpmovieplayercontroller 黑屏
MPMoviePlayerController * moviePlayer; 原因是:你在声明movieplayer的时候,声明成为了局部变量,与此同一时候你的project支持ARC,所以会出现黑屏 ...
- linux下改动内核參数进行Tcp性能调优 -- 高并发
前言: Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过改动Tcp/ip内核參数也能得到非常大的性能提升, 以下就列举一些Tcp/ip内核 ...
- HDU 4311 Meeting point-1 && HDU 4312 Meeting point-2
这俩个题 题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a( ...
- ViewData ViewBag ViewModel
ViewBag 里可以携带dynamic的数据. Model 是从control传过来的模型数据. 我自己感觉ViewBag 可以携带少量的数据,但是我同事喜欢部分页partial 请求,ViewBa ...
- Oracle得知(十五):分布式数据库
--分布式数据库的独立性:分布数据的独立性指用户不必关心数据怎样切割和存储,仅仅需关心他须要什么数据. --本地操作 SQL> sqlplus scott/tiger --远程操作 SQL> ...
- maple 教程
1 初识计算机代数系统Maple 1.1 Maple简说 1980年9月, 加拿大Waterloo大学的符号计算机研究小组成立, 開始了符号计算在计算机上实现的研究项目, 数学软件Maple是这个项目 ...
- 关于 cookie 使用中遇到的问题
前段时间在一个项目中涉及到cookie的存取,于是打算封装一个 cookie 的CRUD .按理来说,这本身是一个很简单的问题,不注意的话简单的问题也有大坑. /** * Set or get coo ...

