天天看點

03.甜品相鄰與交換方法和直線比對的核心算法

//判斷甜品是否相鄰居
    public bool IsFriend(GameSweet sweet1,GameSweet sweet2)
    {
        return (sweet1.X == sweet2.X && Mathf.Abs(sweet1.Y - sweet2.Y) == 1) ||
               (sweet1.Y == sweet2.Y && Mathf.Abs(sweet1.X - sweet2.X) == 1);
    }

    //交換兩個甜品
    public void ExchangeSweets(GameSweet sweet1,GameSweet sweet2)
    {
        if (sweet1.CanMove()&&sweet2.CanMove())
        {
            //更新數組
            sweets[sweet1.X, sweet1.Y] = sweet2;
            sweets[sweet2.X, sweet2.Y] = sweet1;
            //交換位置
            int tempx = sweet1.X;
            int tempy = sweet1.Y;
            sweet1.MovedComponent.Move(sweet2.X,sweet2.Y,fillTime);
            sweet2.MovedComponent.Move(tempx, tempy, fillTime);
        }
    }


    public void PressSweet(GameSweet sweet)
    {
        pressedSweet = sweet;
    }

    public void EnterSweet(GameSweet sweet)
    {
        enteredSweet = sweet;
    }

    public void ReleaseSweet()
    {
        if (IsFriend(pressedSweet,enteredSweet))
        {
            ExchangeSweets(pressedSweet, enteredSweet);
        }
    }      
//比對方法
    public List<GameSweet> MatchSweets(GameSweet sweet,int newX,int newY)
    {
        if (sweet.CanColor())
        {
            ColorSweet.ColorType color=sweet.ColoredComponent.Color;
            List<GameSweet> matchRowSweets=new List<GameSweet>();  //行
            List<GameSweet> matchLineSweets=new List<GameSweet>(); //豎
            List<GameSweet> finishedMatchingSweets=new List<GameSweet>(); //完成後的所有比對

            //行比對
            matchRowSweets.Add(sweet);

            //i為0 的時候 往左周遊 為1的時候往右邊周遊
            for (int i = 0; i <=1; i++)
            {
                //往左依次遞減  //往右依次遞加 xDistance偏移量
                for (int xDistance= 1; xDistance < xColumn; xDistance++)
                {
                    int x; //偏移之後要判斷的位置
                    if (i==0) //左減
                    {
                        x = newX - xDistance; 

                    }
                    else //右加
                    {
                        x = newX + xDistance;
                    }

                    //排除邊界值
                    if (x<0||x>=xColumn)
                    {
                        break;
                    }

                    //判斷滿足條件
                    if (sweets[x,newY].CanColor()&& sweets[x, newY].ColoredComponent.Color==color)
                    {
                        matchRowSweets.Add(sweets[x,newY]);
                    }
                    else
                    {
                        break;
                    }

                }
            }

            //行比對完畢
            if (matchRowSweets.Count>=3)
            {
                for (int i = 0; i < matchRowSweets.Count; i++)
                {
                    finishedMatchingSweets.Add(matchRowSweets[i]);
                }
            }

            if (finishedMatchingSweets.Count>=3)
            {
                return finishedMatchingSweets;
            }


            //列比對
            matchLineSweets.Add(sweet);

            //i為0 的時候 往左周遊 為1的時候往右邊周遊
            for (int i = 0; i <= 1; i++)
            {
                //往左依次遞減  //往右依次遞加 xDistance偏移量
                for (int yDistance = 1; yDistance < yRow;yDistance++)
                {
                    int y; //偏移之後要判斷的位置
                    if (i == 0) //左減
                    {
                        y = newY - yDistance;

                    }
                    else //右加
                    {
                        y = newY + yDistance;
                    }

                    //排除邊界值
                    if (y < 0 || y >= yRow)
                    {
                        break;
                    }

                    //判斷滿足條件
                    if (sweets[newX, y].CanColor() && sweets[newX, y].ColoredComponent.Color == color)
                    {
                       matchLineSweets.Add(sweets[newX, y]);
                    }
                    else
                    {
                        break;
                    }

                }
            }

            //行比對完畢
            if (matchLineSweets.Count >= 3)
            {
                for (int i = 0; i < matchLineSweets.Count; i++)
                {
                    finishedMatchingSweets.Add(matchLineSweets[i]);
                }
            }

            if (finishedMatchingSweets.Count >= 3)
            {
                return finishedMatchingSweets;
            }


        }

        return null;
    }