//分步填充
public bool Fill()
{
bool filledNotFinished = false;//判断本次填充是否完成
for (int y = yRow-2; y >=0; y--)
{
for (int x = 0; x < xColumn; x++)
{
GameSweet sweet = sweets[x, y];//得到当前元素位置的甜品对象
if (sweet.CanMove())//如果无法移动,则无法往下填充
{
GameSweet sweetBelow = sweets[x, y + 1];
if (sweetBelow.Type==SweetsType.EMPTY)//垂直填充 正下方的情况
{
Destroy(sweetBelow.gameObject);
sweet.MovedComponent.Move(x, y + 1,fillTime);
sweets[x, y + 1] = sweet;
CreateNewSweet(x, y, SweetsType.EMPTY); //移走了就为空了
filledNotFinished = true;
}
else //斜向填充 遍历左右下方的情况
{
//down -1左下 0 正下 1右下 三次遍历
for (int down = -1; down <=1; down++)
{
if (down!=0) //排除正下方的情况
{
int downX = x + down;
//排除没有左下和右下的情况
if (downX>=0&&downX<xColumn)
{
//获取左下方的对象
GameSweet downSweet = sweets[downX, y + 1];
//左下位置是不是空甜品
if (downSweet.Type==SweetsType.EMPTY)
{
//是否可以垂直填充
bool canFill = true;
//左下头顶的是不是可以垂直填充
for (int aboveY = y; aboveY>=0; aboveY--)
{
// 左下头顶的对象
GameSweet sweetAbove = sweets[downX, aboveY];
if (sweetAbove.CanMove()) //可以垂直填充不用斜填充
{
break;
}
else if (sweetAbove.Type!=SweetsType.EMPTY&&!sweetAbove.CanMove()) //是空甜品而且不能移动的时候
{
canFill = false;
break;
}
}
if (!canFill)
{
Destroy(downSweet.gameManager); //把要填充的原来的空甜品移除
//斜向填充
sweet.MovedComponent.Move(downX,y+1,fillTime);
sweets[downX, y + 1] = sweet;
CreateNewSweet(x, y, SweetsType.EMPTY); //移走了就为空了
filledNotFinished = true;
break;
}
}
}
}
}
}
}
}
}
//最上排的特殊情况
for (int x = 0; x < xColumn; x++)
{
GameSweet sweet = sweets[x, 0];
if (sweet.Type==SweetsType.EMPTY)
{
GameObject newSweet= Instantiate(sweetPrefabDict[SweetsType.NORMAL], CorrectPositon(x, -1), Quaternion.identity);
newSweet.transform.parent = transform;
sweets[x, 0] = newSweet.GetComponent<GameSweet>();//赋值给数组
sweets[x, 0].Init(x, -1, this, SweetsType.NORMAL);
sweets[x, 0].MovedComponent.Move(x, 0,fillTime);
sweets[x, 0].ColoredComponent.SetColor((ColorSweet.ColorType)Random.Range(0, sweets[x, 0].ColoredComponent.NumColors));
filledNotFinished = true;
}
}
return filledNotFinished;
}
02.消消乐斜向填充算法
最新推荐文章于 2022-07-06 20:49:12 发布