如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。
不过问题又来了,游戏总要结束,那怎么判断游戏是否结束或者游戏进入下一关呢
我们在删除待删除队列的时候(见上一节),不妨加入一个函数,来确定删除完以后,这个游戏是否还能够进行下去
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还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。
其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。