1. 游戏视频演示

2.三消游戏我的理解

上面视频中的游戏。我做了2个星期时间,仅仅能算个简单Demo,还有bug。特效也差点儿没有。感觉三消游戏主要靠磨。越磨越精品。

市场上三消游戏已经超级多了。主流的是地图型的。差点儿是无尽模式。各种消除特效。各种各样的过关方式,玩起来还是不错的,就是遇到比較难的关卡,要多试几次,运气很好的时候就过了,不然卡死。

这个游戏真正扩展的地方就是过关模式,还须要整个特殊的地图编辑器。配合策划,不断升级游戏。

3.消除涉及到的简单算法

3.1 生成随机地图算法

有各种各样的地图。这里拿最简单的矩形来说。需求:
1.这个算法要生成一个随机的地图,不能有3个横着同样或者3个竖着同样。

2.这个地图用户移动一步能进行消除(不能是个死地图)
初看到这个需求感觉还是蛮难的。后来想了下第2个需求应该先别管,假设是死地图。再又一次生成一张地图就能够了。測试了下,生成死地图的概率很低。
算法实现的描写叙述:
假设地图的(0,0)在左上角。

很easyx从上面的最左边開始往右生成,y从最上面直究竟部。

每次先推断下它的左边两个是否已经同色。还有上面两个是否已经同色,假设同色了,要去掉这个颜色。

假设已经生成的地图是:
2, 3, 3, 4, 1, 3, 2
1, 2, 3, 4, 4, 3, 3
1, 2, 4, 2, 2, X
由于X的左边两个都是2,所以X不能再是2了,它的上面两个都是3。所以X不能再是3了。

所以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个能够移动一步进行消除。

算法先到这里... 兴许有时间再更新...

提交给苹果,审核竟然能通过

第一个是IPhone 下载地址。第二个是android的。点击跳转链接。或者扫描二维码。

http://www.waitingfy.com/archives/1335

版权声明:本文博主原创文章,博客,未经同意不得转载。

cocos2d 消除类游戏简单的算法 (一)的更多相关文章

  1. ccf题库中2015年12月2号消除类游戏

    题目如下: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这 ...

  2. 用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

    系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** ...

  3. 消除类游戏(js版)

    最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码总共456行,未经过严格测试 ...

  4. CCF2015122消除类游戏(C语言版)

    问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...

  5. ccf消除类游戏

    问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消 ...

  6. CCF CSP 201512-2 消除类游戏

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...

  7. CSP201512-2:消除类游戏

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  8. 用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

    游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: ...

  9. 用cocos2d-html5做的消除类游戏《英雄爱消除》(2)——Block设计实现

    Block可以说是这个游戏的核心类,它除了包含自身的一些属性和方法外还添加了对触摸事件的响应. 我们先来看下源码吧 /** * Power by html5中文网(html5china.com) * ...

随机推荐

  1. How to Compile Java DBus

    1 download or git clone Java DBus git clone git://anongit.freedesktop.org/dbus/dbus-java dbus-java 2 ...

  2. [置顶] 最优间隔分类器、原始/对偶问题、SVM的对偶问题——斯坦福ML公开课笔记7

    转载请注明:http://blog.csdn.net/xinzhangyanxiang/article/details/9774135 本篇笔记针对ML公开课的第七个视频,主要内容包括最优间隔分类器( ...

  3. android AIDL RPC 机制

    AIDL 这是接口文件的叙述性说明,为了实现android 上述平台RPC ,aapt 在编译时自己主动按照该规则IPC 的接口和对象,作为一个用户只需要 实现在服务侧的界面 2 在clientbin ...

  4. acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】

    称号:acdream 1211 Reactor Cooling 分类:无汇的有上下界网络流. 题意: 给n个点.及m根pipe,每根pipe用来流躺液体的.单向的.每时每刻每根pipe流进来的物质要等 ...

  5. SlopOne推荐算法

    在开源框架taste中有SlopOne的Java实现,效果不错.使用movielens的数据,代码例如以下 代码 #coding:utf-8 import re import math #读取数据,并 ...

  6. php编码规范个人小结

    1.原生态代码或者类的头上,注明作者,关键算法计算过程 例如 /** *@author zengmoumou *功能:根据列表ip,取得ip对应的运营商,省,市,县 */ 2.变量尽量用英文单词的组合 ...

  7. Linux高性能server规划——多进程编程

    多进程编程 多进程编程包含例如以下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及怎样避免僵尸进程 进程间通信(Inter-Process Communic ...

  8. 使用order by和rownum时特别注意

    起因 在项目中有用到某表作为数据来源,在页面以列表的形式显示.使用的数据库是Oracle,分页的时候使用到了rownum这个关键字.列表有排序功能,自然也用到了order by.接下来问题出现了,我在 ...

  9. ./startup.sh: Permission denied

    今天在Linux上部署项目,之前报过这个错误,通过下面方式攻克了.如今发出来备份一下: LINUX权限-bash: ./startup.sh: Permission denied 运行./startu ...

  10. redmine 出口中国的乱码

    pdf 这是redmine的bug.必须在个人账户更改将设立中国语文,足够的人才来解决. 顺便说一下,提示.以下更改文件的方法是无效的 /home/redmine/redmine-2.5.1/lib/ ...