Skip to content

Commit

Permalink
new algorithm 新算法
Browse files Browse the repository at this point in the history
  • Loading branch information
D-W- committed Aug 7, 2014
1 parent c85440f commit 698c630
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 4 deletions.
76 changes: 73 additions & 3 deletions GameLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ GameLayer::GameLayer()
m_isTouchEnable(true),
m_raindrop(NULL),
m_markSize(0),
m_isTrapped(false)
m_isRun(false),
m_times(0)
{

}
Expand Down Expand Up @@ -144,6 +145,7 @@ bool GameLayer::onTouchBegan(Touch *touch, Event *unused)
{
if(!srcSprite->getSelected())//未被选择过
{
m_times++;
srcSprite->setSelected(true);
CCTexture2D * texture = CCTextureCache::sharedTextureCache()->addImage("block2.png");
srcSprite->setTexture(texture);
Expand Down Expand Up @@ -198,6 +200,7 @@ void GameLayer::initCloud()
//移动雨滴
void GameLayer::moveRaindrop()
{
/*
SquareSprite* next = NULL;
int row = m_raindrop->getRow();
int col = m_raindrop->getCol();
Expand Down Expand Up @@ -232,7 +235,7 @@ void GameLayer::moveRaindrop()
//更换到endlayer
//CCDirector::sharedDirector()->replaceScene(EndLayer::createScene());
//Director::getInstance()->end();
m_isTrapped = true;
m_isRun = true;
}
}
}
Expand Down Expand Up @@ -260,9 +263,40 @@ void GameLayer::moveRaindrop()
Director::getInstance()->end();
//CCDirector::sharedDirector()->replaceScene(EndLayer::createScene());
}
if(m_isTrapped){
if(m_isRun){
Director::getInstance()->end();
}*/
int row = m_raindrop->getRow();
int col = m_raindrop->getCol();
//每次调用都重新初始化标记数组
memset((void*)m_mark,false,m_markSize);
//当前坐标也标记为走过了
m_mark[row*m_width+col] = true;
SquareSprite* now_sprite = m_matrix[row*MATRIX_WIDTH + col];
SquareSprite* end_sprite = findNext(now_sprite);
if(end_sprite){
SquareSprite* next = end_sprite->getPrev();
if(next == now_sprite){
m_isRun = true;
}
while(next != now_sprite){
end_sprite = next;
next = next->getPrev();
}
next = end_sprite;
m_raindrop->runAction(MoveTo::create(0.3, next->getPosition()));
m_raindrop->setCol(next->getCol());
m_raindrop->setRow(next->getRow());
if(m_isRun){
Director::getInstance()->end();
}
}else{
//雨滴被围住了
//更换到endlayer
Director::getInstance()->end();
//CCDirector::sharedDirector()->replaceScene(EndLayer::createScene());
}

}
//雨滴的逃生路线,result代表最短路径的长度,用于筛选最短路径,返回值也是result
//返回值 -1代表雨滴成功逃脱了,进入结束页面
Expand Down Expand Up @@ -300,4 +334,40 @@ int GameLayer::findWay(int row,int col,int result,int tag)
}
}
return best_way;
}
//另一种算法,遍历,类似于二叉树层次遍历
SquareSprite* GameLayer::findNext(SquareSprite* pos)
{
std::queue<SquareSprite*> myQueue;
//push 之前把方块设为已经在队列里面
//pos->setQue(true);
myQueue.push(pos);
while(!myQueue.empty()){
SquareSprite* now = myQueue.front();
myQueue.pop();
//POP之后把方块设为不在队列里面
//now->setQue(false);
int row = now->getRow();
int col = now->getCol();
int odd = row%2;
for(int i = 0;i<6;++i)//查找能走的六个方向
{
int next_row = row + choices[odd][i][0];
int next_col = col + choices[odd][i][1];
SquareSprite* next_sprite = m_matrix[next_row*MATRIX_WIDTH + next_col];
if(!next_sprite->getSelected() && m_mark[next_row*m_width+next_col] == false)//没变成云
{
next_sprite->setPrev(now);
if(next_col <= 0 || next_col >= 8 || next_row <= 0 || next_row >= 8){//是边界的话直接返回
return next_sprite;
}else{
//next_sprite->setQue(true);
m_mark[next_row*m_width+next_col] = true;
myQueue.push(next_sprite);
}
}
}
}
//返回空值的时候说明雨滴已经被围住了
return NULL;
}
4 changes: 3 additions & 1 deletion GameLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,12 @@ class GameLayer : public Layer
bool m_isTouchEnable;
Raindrop* m_raindrop;
int m_markSize;
bool m_isTrapped;
bool m_isRun;
int m_times;

Point positionOfItem(int row, int col);
int findWay(int row,int col,int result,int tag);
SquareSprite* findNext(SquareSprite* pos);
SquareSprite *GameLayer::spriteOfPoint(Point *point);
void initCloud();
void moveRaindrop();
Expand Down
2 changes: 2 additions & 0 deletions SquareSprite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ SquareSprite *SquareSprite::create(int row, int col)
square->m_row = row;
square->m_col = col;
square->m_selected = false;
square->m_prev = NULL;
//square->m_inQueue = false;
//sushi->m_imgIndex = rand() % TOTAL_SUSHI;
//square->initWithSpriteFrameName("block1.png");
square->initWithFile("block1.png");
Expand Down
4 changes: 4 additions & 0 deletions SquareSprite.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ class SquareSprite : public Sprite
CC_SYNTHESIZE(int, m_col, Col);
//是否被选中
CC_SYNTHESIZE(bool,m_selected,Selected);
//选路时前面的方块
CC_SYNTHESIZE(SquareSprite*,m_prev,Prev);
//选路时是否在队列里面
//CC_SYNTHESIZE(bool,m_inQueue,Que);
//CC_SYNTHESIZE_READONLY(DisplayMode, m_displayMode, DisplayMode);
//void setDisplayMode(DisplayMode mode);
};
Expand Down

0 comments on commit 698c630

Please sign in to comment.