예제 #1
0
    void Operate()
    {
        xy LT, RB = new xy();

        LT.x          = startPos.x < endPos.x ? startPos.x : endPos.x;
        LT.y          = startPos.y < endPos.y ? startPos.y : endPos.y;
        RB.x          = startPos.x > endPos.x ? startPos.x : endPos.x;
        RB.y          = startPos.y > endPos.y ? startPos.y : endPos.y;
        imsiText.text = "Oper : " + Oper + "  Num : " + Num + "\nLT = ( " + LT.x.ToString() + " , " + LT.y.ToString() + " )\nRB = ( " + RB.x.ToString() + " , " + RB.y.ToString() + " )";
        OverlayLT     = LT;
        OverlayRB     = RB;
        if (Oper == 1) // +
        {
            bool isable = true;
            int  cnt    = 0;
            for (int i = LT.x; i <= RB.x; i++)
            {
                for (int j = LT.y; j <= RB.y; j++)
                {
                    cnt++;
                    if (gridNow[i, j] != 0)
                    {
                        isable = false;
                    }
                }
            }
            if (isable && cnt == Num && remain > 0)
            {
                SavePreData();
                for (int i = LT.x; i <= RB.x; i++)
                {
                    for (int j = LT.y; j <= RB.y; j++)
                    {
                        gridcs.ChangeBlockColor(i, j, color);
                    }
                }

                FinishOperate();
            }
            else
            {
                PopDisable();
            }
        }
        else if (Oper == 2) // -
        {
            bool isable = true;
            int  cnt    = 0;
            for (int i = LT.x; i <= RB.x; i++)
            {
                for (int j = LT.y; j <= RB.y; j++)
                {
                    cnt++;
                    if (gridNow[i, j] == 0)
                    {
                        isable = false;
                    }
                }
            }
            if (isable && cnt == Num && remain > 0)
            {
                SavePreData();
                for (int i = LT.x; i <= RB.x; i++)
                {
                    for (int j = LT.y; j <= RB.y; j++)
                    {
                        gridcs.ChangeBlockColor(i, j, 0);
                    }
                }
                FinishOperate();
            }
            else
            {
                PopDisable();
            }
        }
        else if (Oper == 3) // ×
        {
            Overlay.SetActive(true);
            Direction_Button.SetActive(true);
            bool isable = true;
            for (int i = LT.x; i <= RB.x; i++)
            {
                for (int j = LT.y; j <= RB.y; j++)
                {
                    if (gridNow[i, j] == 0)
                    {
                        isable = false;
                    }
                }
            }
            if (!isable)
            {
                Overlay.SetActive(false);
                Direction_Button.SetActive(false);
                goto end;
            }

            bool isableUp, isableDown, isableLeft, isableRight;
            isableUp = isableDown = isableLeft = isableRight = true;

            //위로 가능한지 확인
            if (LT.y - (Num - 1) * (RB.y - LT.y + 1) < 0)
            {
                isableUp = false;;
            }
            else
            {
                for (int i = LT.x; i <= RB.x; i++)
                {
                    for (int j = LT.y - 1; j >= LT.y - (Num - 1) * (RB.y - LT.y + 1); j--)
                    {
                        if (gridNow[i, j] != 0)
                        {
                            isableUp = false;
                        }
                    }
                }
            }

            //아래로 가능한지 확인
            if (RB.y + (Num - 1) * (RB.y - LT.y + 1) >= gridSize)
            {
                isableDown = false;;
            }
            else
            {
                for (int i = LT.x; i <= RB.x; i++)
                {
                    for (int j = RB.y + 1; j <= RB.y + (Num - 1) * (RB.y - LT.y + 1); j++)
                    {
                        if (gridNow[i, j] != 0)
                        {
                            isableDown = false;
                        }
                    }
                }
            }
            //왼쪽로 가능한지 확인
            if (LT.x - (Num - 1) * (RB.x - LT.x + 1) < 0)
            {
                isableLeft = false;
            }
            else
            {
                for (int i = LT.x - 1; i >= LT.x - (Num - 1) * (RB.x - LT.x + 1); i--)
                {
                    for (int j = LT.y; j <= RB.y; j++)
                    {
                        if (gridNow[i, j] != 0)
                        {
                            isableLeft = false;
                        }
                    }
                }
            }

            //오른쪽으로 가능한지 확인

            if (RB.x + (Num - 1) * (RB.x - LT.x + 1) >= gridSize)
            {
                isableRight = false;
            }
            else
            {
                for (int i = RB.x + 1; i <= RB.x + (Num - 1) * (RB.x - LT.x + 1); i++)
                {
                    for (int j = LT.y; j <= RB.y; j++)
                    {
                        if (gridNow[i, j] != 0)
                        {
                            isableRight = false;
                        }
                    }
                }
            }


            UpButton.transform.position    = (gridViewArr[LT.x, LT.y] + gridViewArr[RB.x + 1, LT.y]) / 2f + new Vector2(0f, 50f) * ratio;
            DownButton.transform.position  = (gridViewArr[LT.x, RB.y + 1] + gridViewArr[RB.x + 1, RB.y + 1]) / 2f - new Vector2(0f, 50f) * ratio;
            LeftButton.transform.position  = (gridViewArr[LT.x, LT.y] + gridViewArr[LT.x, RB.y + 1]) / 2f - new Vector2(50f, 0f) * ratio;
            RightButton.transform.position = (gridViewArr[RB.x + 1, LT.y] + gridViewArr[RB.x + 1, RB.y + 1]) / 2f + new Vector2(50f, 0f) * ratio;
            if (isableUp || isableDown || isableLeft || isableRight)
            {
                isOverlay = true;
            }

            UpButton.SetActive(isableUp & (remain > 0));
            DownButton.SetActive(isableDown & (remain > 0));
            LeftButton.SetActive(isableLeft & (remain > 0));
            RightButton.SetActive(isableRight & (remain > 0));

            end :;
        }
        else if (Oper == 4) // ÷
        {
            Overlay.SetActive(true);
            Direction_Button_Division.SetActive(true);
            bool isable = true;
            for (int i = LT.x; i <= RB.x; i++)
            {
                for (int j = LT.y; j <= RB.y; j++)
                {
                    if (gridNow[i, j] == 0)
                    {
                        isable = false;
                    }
                }
            }
            if (!isable)
            {
                Overlay.SetActive(false);
                Direction_Button_Division.SetActive(false);
                goto end;
            }

            bool isVertical, isHorizental;
            isVertical = isHorizental = true;

            if ((RB.x - LT.x + 1) % Num != 0)
            {
                isHorizental = false;
            }
            else
            {
                for (int j = LT.y; j <= RB.y; j++)
                {
                    for (int k = 0; k < ((RB.x - LT.x + 1) / Num); k++)
                    {
                        for (int i = LT.x + ((RB.x - LT.x + 1) / Num) + k; i <= RB.x; i += ((RB.x - LT.x + 1) / Num))
                        {
                            if (gridNow[i, j] != gridNow[LT.x + k, j])
                            {
                                isHorizental = false;
                            }
                        }
                    }
                }
            }
            if ((RB.y - LT.y + 1) % Num != 0)
            {
                isVertical = false;
            }
            else
            {
                for (int i = LT.x; i <= RB.x; i++)
                {
                    for (int k = 0; k < ((RB.y - LT.y + 1) / Num); k++)
                    {
                        for (int j = LT.y + ((RB.y - LT.y + 1) / Num) + k; j <= RB.y; j += ((RB.y - LT.y + 1) / Num))
                        {
                            if (gridNow[i, j] != gridNow[i, LT.y + k])
                            {
                                isVertical = false;
                            }
                        }
                    }
                }
            }

            DownButton_Division.transform.position  = (gridViewArr[LT.x, LT.y] + gridViewArr[RB.x + 1, LT.y]) / 2f - new Vector2(0f, 50f) * ratio;
            UpButton_Division.transform.position    = (gridViewArr[LT.x, RB.y + 1] + gridViewArr[RB.x + 1, RB.y + 1]) / 2f + new Vector2(0f, 50f) * ratio;
            RightButton_Division.transform.position = (gridViewArr[LT.x, LT.y] + gridViewArr[LT.x, RB.y + 1]) / 2f + new Vector2(50f, 0f) * ratio;
            LeftButton_Division.transform.position  = (gridViewArr[RB.x + 1, LT.y] + gridViewArr[RB.x + 1, RB.y + 1]) / 2f - new Vector2(50f, 0f) * ratio;
            if (isVertical || isHorizental)
            {
                isOverlay = true;
            }

            UpButton_Division.SetActive(isVertical & (remain > 0));
            DownButton_Division.SetActive(isVertical & (remain > 0));
            LeftButton_Division.SetActive(isHorizental & (remain > 0));
            RightButton_Division.SetActive(isHorizental & (remain > 0));

            end :;
        }
        else if (Oper == 5) // change_color
        {
            if (color_from != 0 && color_to != 0 && remain > 0)
            {
                SavePreData();
                for (int i = LT.x; i <= RB.x; i++)
                {
                    for (int j = LT.y; j <= RB.y; j++)
                    {
                        if (gridNow[i, j] == color_from)
                        {
                            gridcs.ChangeBlockColor(i, j, color_to);
                        }
                    }
                }

                FinishOperate();
            }
        }
        else if (Oper == 6) // erase_line
        {
            if (remain > 0)
            {
                if (is_Vertical == 1)
                {
                    SavePreData();
                    int i = LT.x;
                    for (int j = 0; j < gridSize; j++)
                    {
                        gridcs.ChangeBlockColor(i, j, 0);
                    }

                    FinishOperate();
                }
                else if (is_Vertical == 2)
                {
                    SavePreData();
                    int j = LT.y;
                    for (int i = 0; i < gridSize; i++)
                    {
                        gridcs.ChangeBlockColor(i, j, 0);
                    }

                    FinishOperate();
                }
            }
        }
        else // ?
        {
        }
    }