如果你看完之前的,那麼你基本已經擁有一個消滅星星遊戲的雛形。
不過問題又來了,遊戲總要結束,那怎麼判斷遊戲是否結束或者遊戲進入下一關呢
我們在刪除待刪除隊列的時候(見上一節),不妨加入一個函數,來確定刪除完以後,這個遊戲是否還能夠進行下去
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還是下一關,那不就是顯而易見的事嗎,判斷當前獲得分數是否大於通關分數就可以了。
其實遊戲數據貫穿整個遊戲,包括星星消除的時候要加到獲得分數上,消去剩下兩兩不相連的星星的時候的加分政策等,因此如果前面沒有做這一塊的,最好回去搞一搞。