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