您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x 消类游戏,类似Diamond dash 设计

2014-03-25 16:32 239 查看
        在游戏设计的过程中最主要的是游戏逻辑的设计,这个游戏的逻辑很明确,首先随机生成一个棋盘,棋盘中放随机一种颜色的方块,方块的摆放并没有限制(并不像三消游戏,要求生成的棋盘不能在行中或者列中有相邻的三个颜色相同);随机生成方块的代码如下:

[cpp]

void GameLogic::init() 



    srand((unsigned)time(0)); 

    for (int i=0; i<WIDTH_CNT; i++) 

    { 

        lack[i] = 0; 

        for (int j=0; j<HEIGHT_CNT; j++) 

        { 

            blocks[i][j].moveToY = j; 

            blocks[i][j].color = rand() % colorCount; 

        } 

    } 

    memset( visit, false, sizeof(visit) ); 

    totalScore = 0; 



void GameLogic::init()

{

 srand((unsigned)time(0));

 for (int i=0; i<WIDTH_CNT; i++)

 {

  lack[i] = 0;

  for (int j=0; j<HEIGHT_CNT; j++)

  {

   blocks[i][j].moveToY = j;

   blocks[i][j].color = rand() % colorCount;

  }

 }

 memset( visit, false, sizeof(visit) );

 totalScore = 0;

}

 

        然后当用户点击里面某个方块时,需要计算出和该方块相邻的相同颜色的方块的个数,这里用了深度优先遍历,数出这样的方块的个数,并且用visit标记了这些方块在棋盘中的位置。

[cpp]

int GameLogic::dfs(int i, int j) 



    int ret = 1; 

    visit[i][j] = true; 

    for (int p=0; p<4; p++) 

    { 

        int x = i + dir[p][0]; 

        int y = j + dir[p][1]; 

        if (x >= WIDTH_CNT || x < 0)  

            continue; 

        if (y >= HEIGHT_CNT || y < 0)  

            continue; 

        if ( !visit[x][y] && blocks[x][y].color == blocks[i][j].color) 

        { 

            ret += dfs(x, y); 

        } 

    } 

    return ret; 



int GameLogic::dfs(int i, int j)

{

 int ret = 1;

 visit[i][j] = true;

 for (int p=0; p<4; p++)

 {

  int x = i + dir[p][0];

  int y = j + dir[p][1];

  if (x >= WIDTH_CNT || x < 0)

   continue;

  if (y >= HEIGHT_CNT || y < 0)

   continue;

  if ( !visit[x][y] && blocks[x][y].color == blocks[i][j].color)

  {

   ret += dfs(x, y);

  }

 }

 return ret;

}

        接下去是把标记的这些方块消去,这是游戏中比较难的一个地方,因为要实现方块移动的一个效果,我是这样实现的:每个方块掉落的位置和它下面消掉的方块个数有关,记录每个方块下面消去的游戏个数,然后当前位置减去这个个数就是该方块需要移动到的位置,并且记录这个位置。

[cpp]

void GameLogic::blocksCancel() 



    for (int i=0; i<WIDTH_CNT; i++) 

    { 

        for (int j=0; j<HEIGHT_CNT; j++) 

        { 

            if ( visit[i][j] ) 

            { 

                lack[i] ++; 

            } 

            else 

            { 

                blocks[i][j].moveToY = j-lack[i]; 

                blocks[i][j-lack[i]].color = blocks[i][j].color; 

            } 

        } 

    } 



void GameLogic::blocksCancel()

{

 for (int i=0; i<WIDTH_CNT; i++)

 {

  for (int j=0; j<HEIGHT_CNT; j++)

  {

   if ( visit[i][j] )

   {

    lack[i] ++;

   }

   else

   {

    blocks[i][j].moveToY = j-lack[i];

    blocks[i][j-lack[i]].color = blocks[i][j].color;

   }

  }

 }

}

掉落之后,补齐上面的方块,同样也随机生成。

[cpp]

void GameLogic::makeUpBlocks() 



    srand((unsigned)time(0)); 

    for (int i=0; i<WIDTH_CNT; i++) 

    { 

        for (int j=HEIGHT_CNT-lack[i]; j<HEIGHT_CNT; j++) 

        { 

            blocks[i][j].color = rand() % colorCount; 

        } 

    } 



void GameLogic::makeUpBlocks()

{

 srand((unsigned)time(0));

 for (int i=0; i<WIDTH_CNT; i++)

 {

  for (int j=HEIGHT_CNT-lack[i]; j<HEIGHT_CNT; j++)

  {

   blocks[i][j].color = rand() % colorCount;

  }

 }

}最后在下一次点击之前,别忘了把状态恢复到初始状态。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x