【广而告之】山寨腾讯“爱消除”游戏已经正式入驻GitHub,项目地址是:https://github.com/3125788/CrazyLink
欢迎广大寨友一起来完善这个游戏。
所谓自动提示,就是识别到玩家一段时间没有操作后,自动为玩家提示一个可以消除的位置。
显示效果如下:
我们增加了渲染类drawAutoTip来处理这个特效的渲染,具体实现请参考源代码。
自动消除算法:
1、循环检测每一个格子
2、对该格子执行交换操作
3、检测交换后的状态是否满足消除条件,如果满足,代表找到一个可以自动提示的位置,标志自动提示的格子(drawAutoTip对标识为EFT_AUTOTIP的格子进行渲染)
4、否则,对该格子再次执行交换操作,恢复原来的状态
static void exchange(int pic[][], int col1, int row1, int col2, int row2)
{
//对交换的坐标进行有效性校验,如果是无效的,则不进行交换
if(col1 < 0 || col1 > 6) return;
if(col2 < 0 || col2 > 6) return;
if(row1 < 0 || row1 > 6) return;
if(row2 < 0 || row2 > 6) return;
int picId = pic[col1][row1];
pic[col1][row1] = pic[col2][row2];
pic[col2][row2] = picId;
}
//自动提示识别算法
//只需要交换一步就能成行的,认为满足自动提示条件
boolean autoTipMethod(int col, int row)
{
for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)
{
for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++)
{
exchange(mPicBak, i, j, i-1, j);
if(isInLine(mPicBak, i, j)) return true;
exchange(mPicBak, i-1, j, i, j);
exchange(mPicBak, i, j, i+1, j);
if(isInLine(mPicBak, i, j)) return true;
exchange(mPicBak, i+1, j, i, j);
exchange(mPicBak, i, j, i, j-1);
if(isInLine(mPicBak, i, j)) return true;
exchange(mPicBak, i, j-1, i, j);
exchange(mPicBak, i, j, i, j+1);
if(isInLine(mPicBak, i, j)) return true;
exchange(mPicBak, i, j+1, i, j);
}
}
return false;
}
//自动提示
void autoTip()
{
for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)
{
for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++)
{
mPicBak[i][j] = mPic[i][j];
}
}
for(int i = 1; i < (int)CrazyLinkConstent.GRID_NUM - 1; i++)
{
for(int j = 1; j < (int)CrazyLinkConstent.GRID_NUM - 1; j++)
{
if(autoTipMethod(i, j))
{
markAutoTip();
return;
}
}
}
}
//将可以自动提示的动物标识出来
static void markAutoTip()
{
for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)
{
for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++)
{
if (isInLine(mPicBak, i, j))
{
mStatus[i][j] = EFT_AUTOTIP;
}
}
}
}
//将自动提示标识清除
static void clearAutoTip()
{
for(int i = 0; i < (int)CrazyLinkConstent.GRID_NUM; i++)
{
for(int j = 0; j < (int)CrazyLinkConstent.GRID_NUM; j++)
{
if (EFT_AUTOTIP == mStatus[i][j])
{
mStatus[i][j] = EFT_NORMAL;
}
}
}
mIsAutoTip = false;
mAutoTipTimer = 0;
}
我美工的水平太次,只能用闪星来表示,欢迎网友贡献更酷的自动提示特效,提交到GitHub项目上。
注意:自动提示特效的图片保存在\res\drawable-nodpi\autotip.png下,该图片是512*128分辨率,共保存了四幅图片,要求背景是透明的。