山寨腾讯“爱消除”游戏之自动提示特效

【广而告之】山寨腾讯“爱消除”游戏已经正式入驻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分辨率,共保存了四幅图片,要求背景是透明的。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值