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

如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。
不过问题又来了,游戏总要结束,那怎么判断游戏是否结束或者游戏进入下一关呢
我们在删除待删除队列的时候(见上一节),不妨加入一个函数,来确定删除完以后,这个游戏是否还能够进行下去

bool StarMatrix::isEnded(){
    bool bRet = true;
    for(int i=0;i<ROW_NUM;i++){
        for(int j=0;jgetColor();
            //上
            if(i-1>=0 && stars*!=nullptr && stars*->getColor() ==  curColor)
                return false;
            //下
            if(i+1getColor() == curColor)
                return false;
            //左
            if(j-1>=0 && stars!=nullptr && stars->getColor() == curColor)
                return false;
            //右
            if(j+1getColor() == 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 =
    {
        {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;
}


void GAMEDATA::saveHighestScore(){
    UserDefault::getInstance()->setIntegerForKey("highestScore",getHistoryScore());
}

```

那么游戏里面一切与分数,数据有关的都能够调用这个类来获得,至于判断是GameOver还是下一关,那不就是显而易见的事吗,判断当前获得分数是否大于通关分数就可以了。
其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。****

你这个最高分,貌似关掉游戏就没有了啊。

有的,UserDefault会在运行的环境下留一个文件保存

楼主 我用xcode运行项目 各种报错 我也是用的3.2的版本

报错是 Undefined symbols for architecture i386: