利用cocos2dx 3.2開發消滅星星(八)遊戲的結束判斷與數據控制

如果你看完之前的,那麼你基本已經擁有一個消滅星星遊戲的雛形。

不過問題又來了,遊戲總要結束,那怎麼判斷遊戲是否結束或者遊戲進入下一關呢

我們在刪除待刪除隊列的時候(見上一節),不妨加入一個函數,來確定刪除完以後,這個遊戲是否還能夠進行下去

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還是下一關,那不就是顯而易見的事嗎,判斷當前獲得分數是否大於通關分數就可以了。

其實遊戲數據貫穿整個遊戲,包括星星消除的時候要加到獲得分數上,消去剩下兩兩不相連的星星的時候的加分政策等,因此如果前面沒有做這一塊的,最好回去搞一搞。


發佈了39 篇原創文章 · 獲贊 8 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章