如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。

不过问题又来了,游戏总要结束,那怎么判断游戏是否结束或者游戏进入下一关呢

我们在删除待删除队列的时候(见上一节),不妨加入一个函数,来确定删除完以后,这个游戏是否还能够进行下去

bool StarMatrix::isEnded(){
	bool bRet = true;
	for(int i=0;i<ROW_NUM;i++){
		for(int j=0;j<COL_NUM;j++){
			if(stars[i][j] == nullptr)
				continue;
			int curColor = stars[i][j]->getColor();
			//上
			if(i-1>=0 && stars[i-1][j]!=nullptr && stars[i-1][j]->getColor() ==  curColor)
				return false;
			//下
			if(i+1<ROW_NUM && stars[i+1][j]!=nullptr && stars[i+1][j]->getColor() == curColor)
				return false;
			//左
			if(j-1>=0 && stars[i][j-1]!=nullptr && stars[i][j-1]->getColor() == curColor)
				return false;
			//右
			if(j+1<COL_NUM && stars[i][j+1]!=nullptr && stars[i][j+1]->getColor() == curColor)
				return false;
		}
	}
	return bRet;
}

判断是否结束的思路很简单,对于StarMatrix里面的二维Star*数组的每一个星星,如果上下左右都没有与之相同颜色,就判定为游戏结束。开始把剩下的两两互不相连的星星消去。


那么如何判断是GameOver还是进入下一关呢。。这里补充点之前忘记讲的东西:数据管理


我们新建一个类来统一管理整个游戏的数据,包括当前获得分数,当前关卡,通关分数,历史最高分等,这样统一管理的好处是能过保证全局的统一

由于这个管理数据类贯穿整个游戏,所以每个人有不同的实现方法,每个人的游戏数据管理类也可能不一样,所以这里直接贴出源码

GameData.h

#ifndef _GAMEDATA_H_
#define _GAMEDATA_H_

class GAMEDATA{
public:
	static GAMEDATA* getInstance();
	/*当前等级*/
	void setCurLevel(int level);
	inline int getCurLevel(){return cur_level;}
	/*下一等级*/
	inline int getNextLevel(){return next_level;}
	/*最高分*/
	inline void setHistoryscore(int score){history_score = score;}
	inline int getHistoryscore(){return history_score;}
	/*当前分数*/
	inline void setCurscore(int score){cur_score = score;}
	inline int getCurscore(){return cur_score;}
	/*通关分数*/
	inline int getNextscore(){return next_score;}
	inline int getscoreByLevel(int level);

	/*奖励分数*/
	int getJiangli(int size);

	void saveHighestscore();
private:
	GAMEDATA();
	void init();
private:
	static GAMEDATA* _instance;
	int cur_level;
	int next_level;
	int history_score;
	int cur_score;
	int next_score;
	friend class MenuLayer;
};
#endif

GameData.cpp
#include "GameData.h"
#include "cocos2d.h"
using namespace cocos2d;
GAMEDATA* GAMEDATA::_instance = 0;
GAMEDATA::GAMEDATA(){
	this->init();
}
GAMEDATA* GAMEDATA::getInstance(){
	if(_instance == 0){
		_instance = new GAMEDATA();
	}
	return _instance;
}

void GAMEDATA::init(){
    setCurLevel(0);
	setCurscore(0);
	setHistoryscore(UserDefault::getInstance()->getIntegerForKey("highestscore",0));
}

void GAMEDATA::setCurLevel(int level){
	if(level < 0){
		return;
	}
	cur_level = level;
	next_level = level + 1;
	next_score = getscoreByLevel(next_level);
}

int GAMEDATA::getscoreByLevel(int level){
	int score = 0;
	if (level == 1)
	{
		score = 1000;
	}
	else if (level == 2)
	{
		score = 3000;
	}
	else if ( (level >=3) && (level <= 10) )
	{
		score = 3000 + 3000 * (level - 2);
	}
	else
	{
		score = 27000 + 4000 * (level - 10);
	}
	return score;
}

int GAMEDATA::getJiangli(int size){
	static const int jiangli[10][2] =
	{
		{0,2000},{1,1980},{2,1920},{3,1820},{4,1680},{5,1500},{6,1280},{7,1020},{8,720},{9,380}
	};
	if(size>9 || size<0){
		return 0;
	}
	return jiangli[size][1];
}


void GAMEDATA::saveHighestscore(){
	UserDefault::getInstance()->setIntegerForKey("highestscore",getHistoryscore());
}

那么游戏里面一切与分数,数据有关的都能够调用这个类来获得,至于判断是GameOver还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。

其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制的更多相关文章

  1. 非阻塞IO服务器模型

    如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?而随着并发用户数量的增加,多线程阻塞服务器不可能为每一个客户端分配一个线程。非阻塞服务器模型最重要的一个特点是,在调用某个接口后立即返回,而不会阻塞等待。图2-6-2-1非阻塞服务器模型这样看来,不管多少个socket连接都可以被一条线程管理起来,一条线程负责遍历这些socket列表,处理再交给线程池,很好地利用了阻塞的时间,处理能力得到提升。

  2. HTML5 2d六角棋游戏(桌面)引擎

    我正在寻找一个非常简单的HTML52DHex/Touch游戏引擎框架来构建棋类游戏:>旋转二维六角网格游戏>地下城爬行者>卡坦定居者Krosmaster我在Hexagongrids上发现了一个令人敬畏的文章,具有D3.js实现,但无法弄清楚如何启动样板。在挖掘之后,我发现了一个HTML5GameEngine和greatgame’scomponents的列表。有几个例子/教程真的符合我的需要经常:>非常小的屏幕尺寸>或丑陋的资产>或死链接>或许多的代码可能那种游戏不符合HTML5游戏?基于Hexagongr

  3. cocos2d-x 3.7 C++接入GameCenter 使用socket 进行网络数据请求

    大部分网络游戏都是用的是socket长连接进行数据交换的websocket无论是客户端还是服务器的处理,都非常的简洁cocos2d-x自带的cchttpClient下载百度网页并写入成网页文件

  4. cocos2d-JS跑酷游戏实战笔记2

    cocos2d-JS跑酷游戏实战笔记2地图加载出错,原因是获取人物的坐标,转化成地图坐标的行和列后,获取地图的GIDAT时横纵坐标时弄反了获取人物的横坐标varx=hero.getPositionX()-runmapp.getPositionX();获取人物的纵坐标vary=hero.getPositionY();判断是否在地图的块上:if(y>=32){坐标转化成地图的行和列varNowrow=

  5. cocos2d-x游戏实例10-塔防游戏修改地图图素,地图整体缩放

    如有错误之处,希望大家多多指正下一篇继续游戏实例

  6. cocos2d-x游戏实例3-获得地图索引

    本文将介绍Tiles工具支持的两种地图中根据坐标获得地图的索引值,普通地图和45度角地图首先普通地图比较简单,就是用坐标值除以图素的宽高即可,这也是一种比较常用的地图表现方法。

  7. 第8章Cocos2D-X中的瓦片地图集总结8.1 瓦片地图集及编辑器简介

    瓦片地图的种类及用途:普通视角地图,45度角地图;普通视角地图:横版动作闯关游戏,俯视视角游戏;45度角地图:塔防游戏,战棋游戏,建造类游戏10011

  8. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第二十二课:Cocos2D-X地图系统1-8

    Cocos2d-X跨平台游戏开发---学习笔记第二十二课:Cocos2D-X地图系统1-8=======================================================================================================================================================================课程目标:-学习Cocos2D-X的地图系统课程重点:-地图编辑器的使用-Cocos2

  9. 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第一课:游戏原理与机制

    Cocos2d-X跨平台游戏开发---学习笔记第一课:游戏原理与机制======================================================================课程目标:l游戏实现的原理和机制课程重点:l渲染驱动游戏l事件驱动游戏考核目标:l理解两种游戏的原理与机制======================================================================一、渲染驱动游戏:帧率l每秒刷新的次数l延时机制二、事件

  10. Cocos2dx实现简单猜拳游戏

    游戏性质:猜拳娱乐游戏玩法:使劲摇一摇游戏适合场合:朋友饭桌上娱乐猜拳罚酒,基友在一起无聊也可打发时间http://pan.baidu.com/s/1i3BveIx

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部